瑞吉外卖--登录退出功能的实现

2024-08-23 05:04

本文主要是介绍瑞吉外卖--登录退出功能的实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

登录功能

 需求分析

1. Controller

  • 定义:Controller是MVC(Model-View-Controller)设计模式中的一部分,负责处理HTTP请求并返回HTTP响应。在Spring MVC中,Controller通常是一个处理特定HTTP请求的类。
  • 作用
    • 接收前端发送的请求,包括请求参数。
    • 调用Service层处理业务逻辑。
    • 将处理结果返回给前端,可以是HTML页面、JSON数据等格式。
  • 与其他组件的关系:Controller层调用Service层的方法来处理业务逻辑,但不直接操作数据库。

2. Service

  • 定义:Service层位于Controller和Data Access层(如Mapper)之间,负责处理业务逻辑。
  • 作用
    • 实现业务逻辑,可能涉及多个数据访问操作(如CRUD操作)的组合和转换。
    • 封装复杂的业务逻辑,以便Controller层调用。
  • 与其他组件的关系
    • Service层调用Mapper层(或DAO层)的方法来实现数据访问。
    • 被Controller层调用以处理业务逻辑。

3. ServiceImpl

  • 定义:ServiceImpl是Service接口的实现类。在Java中,通常会将Service层设计为一个接口,然后提供一个或多个实现类。
  • 作用
    • 实现Service接口中定义的业务逻辑方法。
    • 调用Mapper层的方法来完成具体的数据访问操作。
  • 与其他组件的关系
    • 实现Service接口,为Controller层提供具体的业务逻辑实现。
    • 调用Mapper层进行数据库操作。

4. Mapper(DAO)

  • 定义:Mapper(有时也被称为DAO,即Data Access Object)是数据访问层的一部分,负责将数据库中的数据映射到Java对象,并将Java对象保存到数据库中。
  • 作用
    • 定义对数据库进行CRUD操作的方法。
    • 提供数据访问的接口给Service层调用。
  • 与其他组件的关系
    • Mapper层直接与数据库交互,执行SQL语句来查询、插入、更新或删除数据。
    • 被Service层调用以执行数据访问操作。

5. DB(数据库)

  • 定义:DB是数据库(Database)的缩写,它存储和管理着应用程序所需的数据。
  • 作用
    • 存储应用程序的数据。
    • 提供数据查询、插入、更新和删除的功能。
  • 与其他组件的关系
    • 数据库是Mapper层(或DAO层)的直接交互对象。
    • Mapper层通过执行SQL语句与数据库进行交互,完成数据的增删改查操作。

功能代码开发

1.创建实体类与数据库表进行映射

        例如 在entity包Employee包

package com.itheima.riggie.entity;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;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;}

2.创建对应的controller、severe、serviceimpl、mapper

在controller包下创建EmployeeController

import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletRequest;@Slf4j
@RestController
@RequestMapping("/employee")
public class EmployeeController {@Autowiredprivate EmployeeService employeeService;@PostMapping("/login")public R<Employee> login(HttpServletRequest request, @RequestBody Employee employee) {return null;}
}

在service创建对应的EmployeeService

package com.itheima.riggie.service;import com.baomidou.mybatisplus.extension.service.IService;
import com.itheima.riggie.entity.Employee;public interface EmployeeService extends IService<Employee> {
}

在service下的impl包 创建service的实现方法 EmployeeServiceImpl

package com.itheima.riggie.service.impl;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itheima.riggie.entity.Employee;
import com.itheima.riggie.mapper.EmployeeMapper;
import com.itheima.riggie.service.EmployeeService;
import org.springframework.stereotype.Service;@Service
public class EmployeeServiceImpl extends ServiceImpl<EmployeeMapper,Employee> implements EmployeeService {}

在mapper包下创建EmployeeService

package com.itheima.riggie.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.itheima.riggie.entity.Employee;
import org.apache.ibatis.annotations.Mapper;@Mapper
public interface EmployeeMapper extends BaseMapper<Employee> {}

设置通用的返回

        String password = employee.getPassword();password = DigestUtils.md5DigestAsHex(password.getBytes());LambdaQueryWrapper<Employee> wrapper = new LambdaQueryWrapper<>();wrapper.eq(Employee::getUsername, employee.getUsername());Employee emp = employeeService.getOne(wrapper);if (emp == null) {return R.error("用户名或密码错误");}if (!emp.getPassword().equals(password)) {return R.error("登录失败");}if (emp.getStatus() == 0) {return R.error("账号已被禁用");}request.getSession().setAttribute("employee", emp.getId());return R.success(emp);

退出登录

    /*** 员工退出*/@PostMapping("/logout")public R<String> logout(HttpServletRequest request) {request.getSession().removeAttribute("employee");return R.success("退出成功");

完善登录功能

问题分析

前面已经完成了后台系统的员工登录功能开发,但是还存在一个问题

        用户如果不登录,直接访问系统首页面,照样可以正常访问

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

使用拦截器或过滤器

代码实现,实现步骤:

1、创建自定义过滤器LoginCheckFilter
2、在启动类上加入注解@ServletComponentScan
3、完善过滤器的处理逻辑

 代码实现

package com.itheima.riggie.filter;import com.alibaba.fastjson.JSON;
import com.itheima.riggie.common.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.AntPathMatcher;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** 检查用户是否已经完成登录*/
@WebFilter(filterName = "loginCheckFilter",urlPatterns = "/*")
@Slf4j
public class LoginCheckFilter implements Filter{//路径匹配器,支持通配符public static final AntPathMatcher PATH_MATCHER = new AntPathMatcher();@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) servletRequest;HttpServletResponse response = (HttpServletResponse) servletResponse;//1、获取本次请求的URIString requestURI = request.getRequestURI();// /backend/index.htmllog.info("拦截到请求:{}",requestURI);//定义不需要处理的请求路径String[] urls = new String[]{"/employee/login","/employee/logout","/backend/**","/front/**","/common/**"};//2、判断本次请求是否需要处理boolean check = check(urls, requestURI);//3、如果不需要处理,则直接放行if(check){log.info("本次请求{}不需要处理",requestURI);filterChain.doFilter(request,response);return;}//4、判断登录状态,如果已登录,则直接放行if(request.getSession().getAttribute("employee") != null){log.info("用户已登录,用户id为:{}",request.getSession().getAttribute("employee"));filterChain.doFilter(request,response);return;}log.info("用户未登录");//5、如果未登录则返回未登录结果,通过输出流方式向客户端页面响应数据response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));return;}/*** 路径匹配,检查本次请求是否需要放行* @param urls* @param requestURI* @return*/public boolean check(String[] urls,String requestURI){for (String url : urls) {boolean match = PATH_MATCHER.match(url, requestURI);if(match){return true;}}return false;}
}

这篇关于瑞吉外卖--登录退出功能的实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1098427

相关文章

Security OAuth2 单点登录流程

单点登录(英语:Single sign-on,缩写为 SSO),又译为单一签入,一种对于许多相互关连,但是又是各自独立的软件系统,提供访问控制的属性。当拥有这项属性时,当用户登录时,就可以获取所有系统的访问权限,不用对每个单一系统都逐一登录。这项功能通常是以轻型目录访问协议(LDAP)来实现,在服务器上会将用户信息存储到LDAP数据库中。相同的,单一注销(single sign-off)就是指

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

【测试】输入正确用户名和密码,点击登录没有响应的可能性原因

目录 一、前端问题 1. 界面交互问题 2. 输入数据校验问题 二、网络问题 1. 网络连接中断 2. 代理设置问题 三、后端问题 1. 服务器故障 2. 数据库问题 3. 权限问题: 四、其他问题 1. 缓存问题 2. 第三方服务问题 3. 配置问题 一、前端问题 1. 界面交互问题 登录按钮的点击事件未正确绑定,导致点击后无法触发登录操作。 页面可能存在

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略 1. 特权模式限制2. 宿主机资源隔离3. 用户和组管理4. 权限提升控制5. SELinux配置 💖The Begin💖点点关注,收藏不迷路💖 Kubernetes的PodSecurityPolicy(PSP)是一个关键的安全特性,它在Pod创建之前实施安全策略,确保P