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

news2024/11/27 9:34:51

登录功能

 需求分析

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 {
    @Autowired
    private 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();

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;

        //1、获取本次请求的URI
        String requestURI = request.getRequestURI();// /backend/index.html

        log.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.coloradmin.cn/o/2062900.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

可调电阻是否有正负极?

可调电阻没有固定的正负极&#xff0c;但是有一根箭头表示旋转的方向。 可调电阻在形状上类似于一个圆柱形或方形的小盒子&#xff0c;通常带有三个引脚或更多&#xff0c;其中一个是中心引脚&#xff0c;其余的是两个端部引脚。不像电解电容或二极管那样有固定的正负极&#…

PHP轻创推客集淘客地推任务平台于一体的综合营销平台系统源码

&#x1f680;轻创推客&#xff0c;营销新纪元 —— 集淘客与地推任务于一体的全能平台&#x1f310; &#x1f308;【开篇&#xff1a;营销新潮流&#xff0c;轻创推客引领未来】 在瞬息万变的营销世界里&#xff0c;你还在为寻找高效、全面的营销渠道而烦恼吗&#xff1f;&…

Android经典实战之跳转到系统设置页面或其他系统应用页面大全

本文首发于公众号“AntDream”&#xff0c;欢迎微信搜索“AntDream”或扫描文章底部二维码关注&#xff0c;和我一起每天进步一点点 在Android开发中&#xff0c;经常需要跳转到系统设置页面或其他系统应用页面。以下是一些常见的跳转方式及对应的Intent动作&#xff1a; 1. 跳…

全渠道分销零售行业免费开源ERP解决方案

引言 协助分销及零售连锁企业快速搭建新零售格局&#xff0c;充分整合移动社交流量、门店流量&#xff0c;实现企业线上线下 全渠道管理运营。 业务挑战 传统的经营模式&#xff0c;客户流失严重 分销及零售企业还处于传统经营模式&#xff0c;单一的商品、收银方式、会员维护…

绝对能让你效率起飞的10个AI工具及ChatGPT国内镜像集合【2024必备】

随着GPT的兴起&#xff0c;一大批AI工具随之诞生&#xff0c;其中有很多堪称神器 分享10个国内可以使用使用的网站和AI搬砖工具&#xff0c;摸鱼起飞就靠他们了。 1&#xff1a; AI Plus【AI对话】 推荐指数&#xff1a;⭐️⭐️⭐️⭐️⭐️ 适合人群&#xff1a;学生党、打…

前端面试题每日一学_2

今日一题&#xff1a; 下面JS代码执行后&#xff0c;最终的三个console.log的输出结果是什么&#xff1f; var obj { num: 1 }; var arr1 [1, 2, obj]; var arr2 arr1.slice(1); arr2[0]; arr2[1].num; obj.num; arr1[2].num; console.log(arr1[1] arr2[0]); console.log…

家政预约小程序源码+快速搭建全攻略

前言&#xff1a; 家政预约小程序是一种便捷的家政服务预约平台&#xff0c;它通过互联网技术将家政服务资源与用户连接起来&#xff0c;为用户提供高效、便捷的家政服务预约体验。 一、家政服务小程序开发架构 前端&#xff1a;小程序前端开发主要使用的技术包括HTML、CSS、…

向量嵌入是什么?理解LLM数据表示的基础

向量嵌入将数据转换为数学方程&#xff0c;赋予了人工智能的认知能力&#xff0c;但它们是如何使机器能够“学习”和“成长”的呢&#xff1f; 向量嵌入是什么&#xff1f; 向量嵌入这玩意儿&#xff0c;其实就是给数据穿上一件数学的外衣&#xff0c;让它们之间的关系和相似…

【SQL】三角形判断

目录 题目 分析 代码 题目 表: Triangle ------------------- | Column Name | Type | ------------------- | x | int | | y | int | | z | int | ------------------- 在 SQL 中&#xff0c;(x, y, z)是该表的主键列。 该表的每一行包…

生信圆桌x生信豆芽菜:生物信息学新手的学习与成长平台

生信豆芽菜是一个专门为生物信息学初学者创建的学习与交流平台&#xff0c;致力于帮助新手们快速入门并掌握生信分析的基础知识与技能。随着生物信息学在科研中的重要性日益提升&#xff0c;越来越多的学生和研究人员开始接触这一领域。生信豆芽菜正是为了满足这些新手的需求&a…

土壤墒情固定监测站的工作原理

TH-GTS03土壤墒情固定监测站是一种专门用于监测土壤墒情信息的设备&#xff0c;它通过一系列精密的传感器和数据处理系统&#xff0c;实时、准确地获取土壤的水分含量、温度以及其他相关参数&#xff0c;为农业生产、生态保护和水资源管理等提供重要依据。 土壤墒情固定监测站通…

实用库/函数之链表的使用

目录 1.1结点的建立 1.2为链表结点分配内存空间 1.stdlib:malloc函数与free函数 2.new运算符与delete运算符 1.3链表的基本操作 1.链表的创建 (1)头插法 (2)尾插法 2.查找 3.插入 4.删除 5.总结(小tip) 1.4静态链表(类似于数组) 1.1结点的建立 typedef str…

基于Java语言实现Creo二次开发的环境搭建

# 安装JAVA JDK 通常我们下载JDK在Oracle(甲骨文公司)官网下载即可&#xff1a;Java Downloads | Oracle 双击下载的软件后进行安装。安装过程可以选择自己想安装的位置&#xff08;安装的路径中最好不要存在中文和空格&#xff09; 这里由于我们是先安装Java编译及运行环境默…

上传PDF、DOC文件到SAP HCM系统中案例

背景:公司最近在上电子签系统&#xff0c;以实现劳动合同、保密协议等文件的去纸质化&#xff0c;保存为电子档文件&#xff0c;而企业的信息化的中心是SAP ERP&#xff0c;于是领导要求将签好的电子文件存储到HCM中。 题主写了如下代码实现需求&#xff1a; FUNCTION ZHR_SA…

数据恢复技巧:Windows降级后如何恢复数据

将 Windows 11 回滚到 Windows 10 或将 Windows 10 回滚到 Windows 7 后文件消失了&#xff1f;Windows降级后如何恢复数据&#xff1f;在这里&#xff0c;这篇关于MiniTool的帖子将向您展示最好的数据恢复软件&#xff0c;以帮助您执行Windows文件恢复。 Windows 降级后&#…

短视频SDK解决方案,Flutter赋能,跨平台无缝体验

如何快速、高效地创作出既吸引人眼球又富有个性的短视频&#xff0c;成为了众多内容创作者、APP开发者及企业营销团队共同关注的焦点。美摄科技作为视频技术领域的佼佼者&#xff0c;凭借其强大的技术实力与创新精神&#xff0c;推出了基于Flutter框架的短视频SDK解决方案&…

NC 矩阵元素查找

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 描述 已知一个有序…

npm error network ‘proxy‘ config is set properly. See: ‘npm help config‘

使用" npm install " 或者 " npm i " 初始化项目依赖失败 npm error network proxy config is set properly. See: npm help config 出现这样的解决方法如下&#xff1a; 1.查看代理 //代理 npm config get proxy //缓存 npm config get npm config …

【工控】线扫相机小结

背景简介 我目前接触到的线扫相机有两种形式: 无采集卡,数据通过网线传输。 配备采集卡,使用PCIe接口。 第一种形式的数据通过网线传输,速度较慢,因此扫描和生成图像的速度都较慢,参数设置主要集中在相机本身。第二种形式的相机配备采集卡,通常速度更快,但由于相机和…

汇智ERP Upload.aspx 文件上传致RCE漏洞复现

0x01 产品简介 汇智ERP是一款由江阴汇智软件技术有限公司开发的企业资源规划(ERP)软件,旨在通过信息化手段帮助企业优化业务流程,提升管理效率,增强综合竞争力。适用于各类企业,包括大型企业、中小型企业以及集团化企业。根据企业规模和业务需求,汇智ERP提供了不同的版…