springboot项目外卖管理 day01-项目搭建以及后台登陆

news2024/11/24 3:58:31

文章目录

  • 一、软件开发整体介绍
    • 1.1、软件开发流程
    • 1.2、角色分工
    • 1.3、软件环境
    • 1.4、技术选型
    • 1.5、功能架构
    • 1.6、角色
  • 二、环境搭建
    • 2.1、数据库的创建
    • 2.2、创建springboot项目并添加依赖
    • 2.3、配置yml文件
    • 2.4、将前端页面配置进resource目录![在这里插入图片描述](https://img-blog.csdnimg.cn/2a0b460b61374320aee77bb53c7d710c.png#pic_center)
    • 2.5、静态资源映射
  • 三、后台登陆功能的开发
    • 3.1、登录界面展示
    • 3.2、查看登录请求信息
    • 3.3、创建Controller层处理请求
    • 3.4、创建结果类R
    • 3.5、登录的逻辑
    • 3.6、登录功能的代码实现
  • 4、完善登录功能
    • 4.1、问题分析
    • 4.2、过滤器的处理逻辑
  • 5、总结


一、软件开发整体介绍

1.1、软件开发流程

在这里插入图片描述

1.2、角色分工

在这里插入图片描述

1.3、软件环境

在这里插入图片描述

1.4、技术选型

在这里插入图片描述

1.5、功能架构

在这里插入图片描述

1.6、角色

在这里插入图片描述

二、环境搭建

2.1、数据库的创建

创建数据库并导入sql文件
在这里插入图片描述

2.2、创建springboot项目并添加依赖

2.3、配置yml文件

server:
  port: 8080
spring:
  application:
  datasource:
    druid:
      driver-class-name: com.mysql.jdbc.Driver
      url: jdbc:mysql://localhost:3306/www?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8
      username: root
      password: 1234
mybatis-plus:
  configuration:
    #在映射实体或者属性时,将数据库中表名和字段名中的下划线去掉,按照驼峰命名法映射
    map-underscore-to-camel-case: true
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  global-config:
    db-config:
      id-type: ASSIGN_ID

2.4、将前端页面配置进resource目录在这里插入图片描述

2.5、静态资源映射

由于资源没有放在默认的static目录下 我们需要进行静态资源映射

@Slf4j
@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {
    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        log.info("开始静态资源映射");
        registry.addResourceHandler("/backend/**").addResourceLocations("classpath:/backend/");
        registry.addResourceHandler("/front/**").addResourceLocations("classpath:/front/");
    }
}

这里语句的意思是将浏览器发送的/backend/**的请求定位到resource目录下的backend目录中front同理

三、后台登陆功能的开发

3.1、登录界面展示

在这里插入图片描述

3.2、查看登录请求信息

在这里插入图片描述

3.3、创建Controller层处理请求

@Slf4j
@RestController
@RequestMapping("/employee")
public class EmployeeController {
    @Autowired
    private EmployeeServiceImpl employeeService;
}

创建控制层的同时我们也需要创建对应的实体类对象以及mapper、service
使用mabatis-x插件进行代码快速生成
在这里插入图片描述

3.4、创建结果类R

本项目前端的格式已经固定,前端需要什么参数,后台接口就会返回什么,这时可以创建一个结果类R,服务端响应的所有结果最终都会包装成此种类型返回给前端页面.

@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;
    }

}

3.5、登录的逻辑

在这里插入图片描述
在这里插入图片描述

3.6、登录功能的代码实现

md5加密处理
通过@RequestBody 注解将前端传来的json数据转换为实体类employee
再使用employee的getpassword方法获取密码再将密码转为字节类型传入DigestUtils.md5DigestAsHex()中便可

根据用户名查询数据库
首先创建一个LambdaQueryWrappe对象,再使用其中的eq方法匹配数据库中的用户名并返回,如果没有查询到则返回登陆失败结果

密码比对与查看员工状态
获取数据库中对应数据再比对即可

登陆成功 将员工id传入session并返回登陆成功结果
创建session对象并通过session的setAttribute方法传入便可

@RestController
@RequestMapping("/employee")
public class EmployeeController {
    @Autowired
    private EmployeeService employeeService;

    @PostMapping("/login")
    public R<Employee> login(HttpServletRequest request, @RequestBody Employee employee)
    {
        //1.将页面提交的密码进行md5加密处理
        String password=employee.getPassword();
        password=DigestUtils.md5DigestAsHex(password.getBytes());

        //2.根据用户名查询数据库
        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并返回登陆成功结果
        HttpSession session = request.getSession();
        session.setAttribute("employee",emp.getId());

        return R.success(emp);
    }

4、完善登录功能

4.1、问题分析

前面我们已经完成了后台系统的员工登录功能开发,但是还存在一个问题:用户如果不登录,直接访问系统首页面,照样可以正常访问。

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

那么,具体应该怎么实现呢?

答案就是使用过滤器或者拦截器,在过滤器或者拦截器中判断用户是否已经完成登录,如果没有登录则跳转到登录页面

4.2、过滤器的处理逻辑

过滤器具体的处理逻辑如下:
1、获取本次请求的URI
2、判断本次请求是否需要处理
3、如果不需要处理,则直接放行
4、判断登录状态,如果已登录,则直接放行
5、如果未登录则返回未登录结果

在这里插入图片描述
获取本次请求的URI
通过request的getRequestURI()方法便可获取

定义不需要处理的请求路径
定义一个字符串数组,把路径放入其中

判断本次请求是否需要处理
首先创建一个路径匹配器,再创建check方法,其中PATH_MATCHER.match(url, requestURI);即可比较两个路径是否匹配

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

        log.info("拦截到请求:{}",requestURI);

//        定义不需要处理的请求路径
        String[] urls=new String[]{
                "/employee/login",
                "/employee/logout",
                "/backend/**",
                "/front/**"
        };
//        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;
    }
    //路径匹配,检查本次请求是否需要放行
    public boolean check(String[] urls,String requestURI){
        for (String url : urls) {
            boolean match = PATH_MATCHER.match(url, requestURI);
            if(match==true){
                return true;
            }
        }
        return  false;
    }
}

5、总结

day1完成的便是项目的搭建和其中的登录功能,其中前端页面以及数据库数据都是已经准备好的,主要学习到的有
1、如果静态资源未放置默认的static目录下该如何处理
2、如何将服务器响应的结果包装成特定的类型返回给前端页面
3、如何进行密码加密
4、如何使用过滤器

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/610265.html

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

相关文章

ec-canvas 在小程序上的使用

文章目录 I. 前言echarts、ec-canvas&#xff0c;在小程序中进行数据可视化的意义 II. 安装ec-canvas1. 下载安装ec-canvas组件2. 配置组件参数 III. 初识ec-canvas1. echarts在微信小程序中的工作原理2. echarts小程序版的局限性与创新点3. 通过一个简单的示例了解ec-canvas的…

chatgpt赋能python:Python备份列表l:保护你的重要数据

Python备份列表l: 保护你的重要数据 当我们谈到数据的安全性时&#xff0c;备份是非常重要的。备份应该是在任何操作之前考虑的&#xff0c;因为在数据丢失或计算机崩溃时&#xff0c;我们需要在短时间内恢复数据。在这篇文章中&#xff0c;我们将讨论Python备份列表l。 什么…

【python技能树】python简介

1 Python定义 Python 是一种简单易学并且结合了解释性、编译性、互动性和面向对象的脚本语言。Python提供了高级数据结构&#xff0c;它的语法和动态类型以及解释性使它成为广大开发者的首选编程语言。 Python 是解释型语言&#xff1a; 开发过程中没有了编译这个环节。类似于…

Linux系统-Ubuntu安装指定版本的内核

Ubuntu安装指定版本的内核 以下演示 Linux 系统内核,手动安装的话可以安装所有指定版本的内核。 查看当前系统内核 uname -sr接下来以安装 5.13.0 内核为例 首先去 http://kernel.ubuntu.com/~kernel-ppa/mainline/找到内核版本为5.13.0 的链接 根据电脑64位处理器 选择 AM…

chatgpt赋能python:Python奇数和偶数和

Python奇数和偶数和 在Python编程中&#xff0c;奇数和偶数和是一个基本的概念。奇数和偶数是指整数的特定类型&#xff0c;其中奇数是指不能被2整除的正整数&#xff0c;偶数是指可以被2整除的正整数。本文将介绍Python中计算奇数和偶数和的方法。 计算奇数和偶数 要计算奇…

「QT」QT5程序设计目录

✨博客主页:何曾参静谧的博客 📌文章专栏:「QT」QT5程序设计 目录 📑【QT的基础知识篇】📑【QT的GUI编程篇】📑【QT的项目示例篇】📑【QT的网络编程篇】📑【QT的数据库编程篇】📑【QT的跨平台编程篇】📑【QT的高级编程篇】📑【QT的开发工具篇】📑【QT的调…

chatgpt赋能python:Python地址怎么写的SEO

Python地址怎么写的SEO 随着数字化时代的到来&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;已成为网站排名和流量的重要因素。为了让Python 相关网站在搜索引擎上更加有利的排名&#xff0c;需要了解Python地址要怎么写才能获得更好的SEO效果。 为什么地址要写好 地…

操作系统(进程与线程,复习自用)

进程与线程 进程与线程进程的概念、组成、特征进程的状态与转换进程控制进程通信&#xff08;IPC&#xff09;线程概念 多线程模型线程的实现方式 多线程模型线程的状态与转换 CPU调度与上下文切换调度的概念、层次进程调度的时机 切换与过程调度方式调度器 闲逛进程调度算法的…

chatgpt赋能python:Python备份交换机:保障网络安全的必备工具

Python备份交换机&#xff1a;保障网络安全的必备工具 在当今互联网时代&#xff0c;因特网已经成为了全球的必备基础设施。然而&#xff0c;在使用网络的过程中&#xff0c;我们也会遭遇到各种各样的问题&#xff0c;其中最常见的就是网络中断或数据丢失。特别是对于企业和组…

javaScript蓝桥杯----绝美宋词

目录 一、介绍二、准备三、目标四、代码五、踩坑六、完成 一、介绍 “今宵酒醒何处&#xff0c;杨柳岸晓风残月”&#xff0c;“蓦然回首&#xff0c;那人却在灯火阑珊处”&#xff0c;“试问闲愁都几许&#xff1f;一川烟草&#xff0c;满城风絮&#xff0c;梅子黄时雨” … …

K8s网络管理 flannel

K8s网络管理 flannel 1 网络管理1.1 Service1.1.1 网络体系1.1.2 工作模型1.1.3 SVC实践1.1.4 IPVS实践 1.2 其他资源1.2.1 域名服务1.2.2 CoreDNS1.2.3 无头服务 2 容器网络2.1 网络方案2.2 flannel2.3 主机网络 1 网络管理 1.1 Service 1.1.1 网络体系 应用流程 资源对象…

Elasticsearch基础

Elasticsearch是搜索服务器 视频地址&#xff1a;https://www.bilibili.com/video/BV1Sy4y1G7LL/?p6&spm_id_from333.880.my_history.page.click&vd_sourcefc7fa697b97f292319c5b0cde4755484 下载地址&#xff1a;[https://artifacts.elastic.co/downloads/elasticse…

赋予品牌文化原力,从已有文化中挖掘

赋予品牌以文化原力&#xff0c;从已有文化中挖掘 华与华总结为&#xff1a; 寻找母体&#xff0c;寄生母体&#xff0c;成为母体&#xff0c;壮大母体 非常经典的例子&#xff1a;微信红包 趣讲大白话&#xff1a;文化有持续的力量 【趣讲信息科技186期】 *******************…

Redisson看门狗机制为什么比将锁设置成永久有效期更好?

个人主页&#xff1a;金鳞踏雨 个人简介&#xff1a;大家好&#xff0c;我是金鳞&#xff0c;一个初出茅庐的Java小白 目前状况&#xff1a;22届普通本科毕业生&#xff0c;几经波折了&#xff0c;现在任职于一家国内大型知名日化公司&#xff0c;从事Java开发工作 我的博客&am…

【测绘程序设计】C#伪距单点定位

文章目录 一、题目解读二、界面设计三、矩阵计算实现1、矩阵定义Matrix2、矩阵构造Matrix()3、单位矩阵MatrixE()4、加减乘操作符重载-*5、矩阵转置transposs()6、矩阵求逆Inverse() 四、数据存储结构设计1、Sat类存一颗卫星的数据2、Epoch类存一个历元的数据3、DataCenter类存…

Spring Cloud Alibaba - Sentinel(一)

目录 一、Sentinel介绍 1、什么是Sentinel 2、Sentinel好处 3、Sentinel下载和安装 二、搭建Sentinel项目 1、创建项目cloudalibaba-sentinel-service8401 三、Sentinel流控规则 1、流控规则基本介绍 2、新增流控 2.1、QPS直接失败案例 2.2、线程数直接失败案例 3、…

CF1839B Lamps

思路 这道题我们可以利用贪心的思想。 我们这里把 a i a_i ai​理解为第 a i a_i ai​层灯。 在层数相同的灯被破坏之后&#xff0c;灯的个数就会减少到 0 0 0&#xff0c;所以它一定不会影响到之后下一层的灯。 所以&#xff0c;我们贪心的思路是&#xff1a; 将每一层&am…

FreeRTOS学习(五)

延时函数 vTaskDelay()&#xff1a;相对延时&#xff0c;指每次延时都是从执行函数vTaskDelay()开始&#xff0c;直到延时指定的时间结束。vTaskDelayUntil()&#xff1a;绝对延时&#xff0c;整个任务的运行周期看成一个整体&#xff0c;适用于需要按照一定频率运行的任务。 …

卡尔曼滤波与组合导航原理笔记(一)第二部分 卡尔曼滤波方程的推导

文章目录 三、卡尔曼滤波1、随机系统状态空间模型2、状态预测3、状态量测4、增益矩阵K与状态估计5、Kalman滤波公式汇总6、Kalman滤波流程图1.划分为左右两部分&#xff08;一阶矩和二阶矩&#xff09;2.划分为上下两部分&#xff08;时间更新、量测更新&#xff09; 7、Kalman…

Windows11安装kohya_ss详细步骤(报错、踩坑)

文章目录 笔者环境所需环境安装kohya_ss方式一&#xff1a;带有GUI的kohya_ss仓库方式二&#xff1a;kohya_ss核心仓库 笔者环境 OS&#xff1a;windows11Python&#xff1a;3.10.6CUDA11.6 所需环境 Python3.10.6GitCUDA11.6 安装kohya_ss 方式一&#xff1a;带有GUI的ko…