首页 > 其他分享 >瑞吉外卖--员工登录

瑞吉外卖--员工登录

时间:2023-06-14 14:01:11浏览次数:67  
标签:登录 -- org 瑞吉 外卖 reggie import com itheima

前言:

由于项目过大,我将按照功能模块分开发布,等到最后再合并成一篇文章


代码在E:\java学习\瑞吉外卖\course  reggie_take_out

1. 功能清单  1-3

瑞吉外卖--员工登录_spring

2. 数据库搭建  4

2.1 搭建数据库

瑞吉外卖--员工登录_数据库_02

2.2 导入表

瑞吉外卖--员工登录_过滤器_03

选择E:\java学习\瑞吉外卖\资料\1 瑞吉外卖项目\资料\数据模型目录下的db_reggie.sql运行即可

瑞吉外卖--员工登录_数据库_04

瑞吉外卖--员工登录_过滤器_05

还可通过第二种命令行的方式实现

注意

导入表结构,既可以使用上面的图形界面,也可以使用MySQL命令:通过命令导入表结构时,注意sq|文件不要放在中文目录中

瑞吉外卖--员工登录_spring_06

2.3 熟悉表的结构  4

瑞吉外卖--员工登录_apache_07

3. maven项目的搭建  5

就创建一个普通的maven项目就行了

瑞吉外卖--员工登录_spring_08

pom.xml   5

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.5</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>com.itheima</groupId>
    <artifactId>reggie_take_out</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <!--springboot依赖   5-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
       <!-- 单元测试-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
       <!-- web依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <scope>compile</scope>
        </dependency>
        <!--mybatis-plus依赖-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.2</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.20</version>
        </dependency>
        <!--java对象转json-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.76</version>
        </dependency>

        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.6</version>
        </dependency>
        <!--mysql驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <!--数据源-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.23</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.4.5</version>
            </plugin>
        </plugins>
    </build>

</project>

springboot的配置文件application-yml  5

server:
  port: 8080
spring:
  application:
    name: reggie_take_out
  datasource:
    druid:
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://localhost:3306/reggie?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
      username: root
      password: root
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

编写启动类  5

这里值得注意的是 @Slf4j 这个注解是lombok提供的 日志文件 ,log.info() 需要在idea中安装插件才不会报错,安装后重启即可

瑞吉外卖--员工登录_过滤器_09

package com.itheima.reggie;

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

//启动类  5
@Slf4j  //这个注解是lombok提供的 日志文件
@SpringBootApplication
public class ReggieApplication {
    public static void main(String[] args) {
        SpringApplication.run(ReggieApplication.class,args);
        log.info("项目启动成功。。。");
    }
}

瑞吉外卖--员工登录_数据库_10

4. 导入前端页面  5

我们的项目主要还是侧重后端的编写,前端直接导入即可

E:\java学习\瑞吉外卖\资料\1 瑞吉外卖项目\资料\前端资源

编写一个配置类,是为了让我们的项目可以访问resources目录下的静态资源

com.itheima.reggie.config

WebMvcConfig

package com.itheima.reggie.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

//设置静态资源映射  5
@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/");
    }
}

在浏览器输入访问即可

http://localhost:8080/backend/index.html

瑞吉外卖--员工登录_spring_11

5. 登录功能  6

5.1 根据前端页面分析  6

在我们的前端页面可以发现,当我们点击登录按钮后,会跳到http://localhost:8080/employee/login并提交参数,且使用的是json传送数据,操作的表是数据库的employee表

瑞吉外卖--员工登录_spring_12

瑞吉外卖--员工登录_数据库_13

且使用的是json传送数据

瑞吉外卖--员工登录_spring_14

5.2 代码实现  7

包结构

瑞吉外卖--员工登录_数据库_15

实体类Employee     7

package com.itheima.reggie.entity;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;

//员工实体类  7
@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;

}

员工登录持久层接口EmployeeMapper     7

解释 extends BaseMapper可以帮助我们写常见的增删改查方法 这是mybatis-plus的功能

package com.itheima.reggie.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.itheima.reggie.entity.Employee;
import org.apache.ibatis.annotations.Mapper;

//这是员工登录持久层接口  7
//解释 extends BaseMapper<Employee>  继承BaseMapper<Employee>
// 可以帮助我们写常见的增删改查方法 这是mybatis-plus的功能
@Mapper // 放在类的上面 , 让MyBatis找到接口, 创建他的代理对象(即接口实现类)
public interface EmployeeMapper extends BaseMapper<Employee> {

}

员工登录 业务层接口EmployeeService    7

package com.itheima.reggie.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.itheima.reggie.entity.Employee;

//员工登录 业务层接口   7
//继承extends IService<Employee>  可以帮助我们写常见的接口方法
public interface EmployeeService extends IService<Employee> {
    
}

员工登录 业务层接口实现类 EmployeeServiceImpl    7

package com.itheima.reggie.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itheima.reggie.entity.Employee;
import com.itheima.reggie.mapper.EmployeeMapper;
import com.itheima.reggie.service.EmployeeService;
import org.springframework.stereotype.Service;

//员工登录 业务层接口实现类  7
//一样 继承ServiceImpl可以帮助我们完成部分功能
@Service
public class EmployeeServiceImpl extends ServiceImpl<EmployeeMapper, Employee>implements EmployeeService {
    
}

员工登录控制类 EmployeeController  7

package com.itheima.reggie.controller;

import com.itheima.reggie.service.EmployeeService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@Slf4j
@RestController
@RequestMapping("/employee")
public class EmployeeController {

    @Autowired
    private EmployeeService employeeService;
}

5.3 导入返回结果类 R  8

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

E:\java学习\瑞吉外卖\资料\1 瑞吉外卖项目\资料\服务端返回结果类

R

package com.itheima.reggie.common;

import lombok.Data;
import java.util.HashMap;
import java.util.Map;

//通用返回结果 ,服务器的响应数据最终都会封装成此对象 8
@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.4 后台登录功能开发  9-10

5.4.1 处理逻辑如下:

1.将页面提交的密码password进行md5加密处理

2.根据页面提交的用户名username查询数据库

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

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

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

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

瑞吉外卖--员工登录_apache_16

员工登录控制类 EmployeeController  10

package com.itheima.reggie.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.itheima.reggie.common.R;
import com.itheima.reggie.entity.Employee;
import com.itheima.reggie.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 {

    @Autowired
    private EmployeeService employeeService;

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

        //2.根据页面提交的用户名username查询数据库
        //这里解释这里用到的是LambdaQueryWrapper,不必纠结
        LambdaQueryWrapper<Employee> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(Employee::getUsername,employee.getName());//根据名字去查
        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){//1表示可用  0表示禁用
            return R.error("账号已禁用");
        }

        //6、登录成功,将员工id存入Session并返回登录成功结果
        request.getSession().setAttribute("employee",emp.getId());
        return R.success(emp);
    }
}

测试  11

登陆成功

瑞吉外卖--员工登录_apache_17

5.5 后台退出功能  12

瑞吉外卖--员工登录_apache_18

用户点击页面中退出按钮,发送请求,请求地址为/employee/logout,请求方式为POST。

我们只需要在Controller中创建对应的处理方法即可,具体的处理逻辑:

1、清理Session中的用户id

2、返回结果

员工登录控制类 EmployeeController  12

//员工退出  12
    @PostMapping("/logout")
    public R<String> logout(HttpServletRequest request){
        //1、清理Session中的用户id
        request.getSession().removeAttribute("employee");
        //2、返回结果
        return R.success("退出成功");
    }

6. 登录功能完善  2-2

6.1 问题分析

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

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

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

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

6.3 代码实现  2-2

实现步骤

1、创建自定义过滤器LoginCheckFilter

2、在启动类上加入注解@ServletComponentScan(目的是让我们定义的过滤器生效)

3、完善过滤器的处理逻辑

瑞吉外卖--员工登录_apache_19

过滤器具体的处理逻辑如下:

1.获取本次请求的URI

2.判断本次请求是否需要处理

3、如果不需要处理,则直接放行

4、判断登录状态,如果已登录,则直接放行

5、如果未登录则返回未登录结果

登录拦截器LoginCheckFilter  2-3,2-4

package com.itheima.reggie.filter;

import com.alibaba.fastjson.JSON;
import com.itheima.reggie.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;

//登录过滤器  2-2
@Slf4j
@WebFilter(filterName = "loginCheckFilter",urlPatterns = "/*")
public class LoginCheckFilter implements Filter{
    //路径匹配器,支持通配符 2-3
    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);

        //定义不需要处理的请求路径  2-3
        String[] urls = new String[]{
                "/employee/login",
                "/employee/logout",
                "/backend/**",
                "/front/**"
        };


        //2、判断本次请求是否需要处理  2-3
        boolean check = check(urls, requestURI);

        //3、如果不需要处理,则直接放行
        if(check){
            log.info("本次请求{}不需要处理",requestURI);
            filterChain.doFilter(request,response);
            return;
        }

        //4、判断登录状态,如果已登录,则直接放行
        if(request.getSession().getAttribute("employee") != null){//因为我们登录成功后将emp的id存入了session
            log.info("用户已登录,用户id为:{}",request.getSession().getAttribute("employee"));
            filterChain.doFilter(request,response);
            return;
        }

        log.info("用户未登录");
        //5、如果未登录则返回未登录结果,通过输出流方式向客户端页面响应数据
        response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));
        return;

    }

    /**
     * 路径匹配,检查本次请求是否需要放行  2-3
     * @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;
    }
}

留言:

注明:本项目来自b站黑马程序员,项目所需资料百度网盘链接https://pan.baidu.com/s/1bxEy2bHiCYQtouifUppsTA 提取码:1234 

标签:登录,--,org,瑞吉,外卖,reggie,import,com,itheima
From: https://blog.51cto.com/u_15784725/6476839

相关文章

  • VBA开发资料 Excel开发资料大全 VBA开源资料 VBA实战开发例子 VBA学习入门到提高 VBA
    记得十多年前还专门做个VBA开发的岗位,开发一些辅助制造业生产需要的业务,生产数据进出料,与供应商对接数据等等。现在网上招VBA的岗位少了,可能说明已经被一部分软件替代,也说明现在很多人已经能使用VBA了,可能就不专门设置这个岗位了。但在实际工作当中,使用VBA非常多的,并且快......
  • 云原生之使用docker部署httpd服务
    (云原生之使用docker部署httpd服务)一、检查系统版本[root@node~]#cat/etc/os-releaseNAME="CentOSLinux"VERSION="7(Core)"ID="centos"ID_LIKE="rhelfedora"VERSION_ID="7"PRETTY_NAME="CentOSLinux7(Core)"AN......
  • An analysis of what are the drug targets for the treatment of systemic lupus ery
    Systemiclupuserythematosus(SLE)isanautoimmunediseasethatproduceslargeamountsofimmunecomplexesandautoantibodiesandcausesdamagetothekidneys,skin,joints,andcentralnervoussystem.CurrentSLEtreatmentismostlyglucocorticoid-ledd......
  • 3d模型底模和高模的三条详细区别
    3d模型里底模和高模有哪些区别?在3d建模法线贴图的时候,常常会听到底模和高模两种不同的说法。这两种模型究竟有怎样的区别,有分别有着哪些各异的效果呢?本期,模型云就来为您盘点3d模型底模和高模的区别有哪些。3d模型底模和高模的区别有哪些区别一:面数不同底模又称低模,指的是低精度......
  • minio
    minio1.使用下列文件开启服务minio.exe2.修改密码及开启服务第一步,找到minio.exe所在目录,进入cmd窗口。第二步,输入setMINIO_ACCESS_KEY=admin命令,修改ACCESS-KEY。第三步,输入setMINIO_SECRET_KEY=12345678命令,修改SECRET-KEY。第四步,输入minio.exeserverD:\minio,启......
  • 实验7
    task4程序源码#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>intmain(){charch;FILE*fp;intn=0;fp=fopen("data4.txt","r");ch=fgetc(fp);while(ch!=EOF){if(ch!=''......
  • k8s相关部署文件
    1.控制器1.生成后改改kubectlcreatedeploymentcoreqi-api--image=docker.io/fanqi/coreqi_api:latest--dry-run=client-oyaml>/home/coreqi_dm.yaml2.手撸apiVersion:apps/v1kind:Deploymentmetadata:creationTimestamp:nullgeneration:1labels:......
  • Java8-Predicate 策略模式的替代品消灭 if else
    使用策略模式消灭ifelse,可以利用Java8的新特性来实现策略模式。利用Java8的Predicate消灭ifelse。首先定义一个map,key是不同的服务代码,value是需要做校验的条件,然后针对不同的服务代码做校验。当然Supplier、Consumer都可以做类似的实现。//定义校验的策略映射关系staticM......
  • 后缀数组
    后缀树和后缀数组讲解:https://blog.csdn.net/weixin_30790841/article/details/96620579?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1https://blog.csdn.net/......
  • 安装 R package KEGG.db
    目前我的R版本是4.0以上的,已经找不到KEGG.db的package了,只能手动来~~ 首先,在bioconductor的主页搜索KEGG.db,然后找到在KEGG.db的页面,找到下载链接 https://bioconductor.org/packages/3.6/data/annotation/src/contrib/KEGG.db_3.2.3.tar.gz。在我的ubuntu终端上,wget ......