java项目之瑞吉外卖

2023-03-08 21:25:42 浏览数 (1)

准备工作:项目创建

1、创建maven项目

注意:一定要检查项目编码以及maven仓库配置,jdk配置等

2、导入pom文件

代码语言:javascript复制
<?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/>
    </parent>
    <groupId>com.userlyz</groupId>
    <artifactId>reggie_take_out</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>

        <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>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <scope>compile</scope>
        </dependency>

        <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>

        <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>

        <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>

3、复制application.yml文件

代码语言:javascript复制
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:
    #在映射实体或者属性时,将数据库中表名和字段名中的下划线去掉,按照驼峰命名法映射
    # 例如 表名address_book  就可以映射到AddressBook类名
    map-underscore-to-camel-case: true
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  global-config:
    db-config:
      id-type: ASSIGN_ID

4、创建SpringBoot程序入口

代码语言:javascript复制
package com.userlyz.reggie;

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

@Slf4j
@SpringBootApplication
public class ReggieApplication {
    public static void main(String[] args) { 
        SpringApplication.run(ReggieApplication.class,args);
        log.info("项目启动成功");
    }
}

运行Boot程序,看是否成功

5、导入前端文件

注意前端文件的位置,在Boot程序中前台默认只能访问resource目录下的static和template文件夹下的文件

6、运行sql语句创建数据库

一、后台登录功能开发

1、前端页面点击登录会发送登录请求:

http://localhost:8080/employee/login

2、实体类和mapper的开发

在entity中导入实体类Employee类;使用mybatis-plus提供的自动生成的mapper

EmployeeMapper.java(interface)

代码语言:javascript复制
@Mapper
public interface EmployeeMapper  extends BaseMapper<Employee> {
}

EmployeeService.java

代码语言:javascript复制
public interface EmployeeService extends IService<Employee> {
}

EmployeeServiceImpl.java

代码语言:javascript复制
@Service
public class EmployeeServiceImpl extends ServiceImpl<EmployeeMapper, Employee> implements EmployeeService {

}

封装返回的结果类R.java

3、Controller

1、登录的具体流程图

2、编码

代码语言:javascript复制
public class EmployeeController {
    @Autowired
    private EmployeeService employeeService;

    @PostMapping("/login")//员工登录
    public R<Employee> login(HttpServletRequest request, @RequestBody Employee employee){
        //将页面提交的密码password进行md5加密处理
        String password=employee.getPassword();
        password=DigestUtils.md5DigestAsHex(password.getBytes());
        System.out.println("加密之后的密码是" password);

        //根据页面提交的用户名查询数据库
        LambdaQueryWrapper<Employee> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(Employee::getUsername,employee.getUsername());
        Employee emp = employeeService.getOne(queryWrapper);

        //如果没有查询在则返回登录失败结果
        if(emp==null){
            return R.error("用户名不存在,登录失败");
        }

        //对比密码
        if(!password.equals(emp.getPassword())){
            return R.error("密码不正确");
        }

        //查看员工状态,如果为已禁用则返回已禁用结果
        if(emp.getStatus()==0){
            return R.error("账号已经禁用了");
        }

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

二、后台系统退出功能

点击退出按钮,发现是一个图片有一个响应事件地址 : http://localhost:8080/employee/logout

后端代码处理

①在EmployeeController中创建对应的处理方法来接受前端的请求,方式为post

②清理session中的id

③返回结果,是否退出成功

前端代码中:

代码语言:javascript复制
methods: {
  logout() {
    logoutApi().then((res)=>{
      if(res.code === 1){
        localStorage.removeItem('userInfo')<!--删除浏览器中本地记录中的userInfo(登录成功的用户信息)-->
        window.location.href = '/backend/page/login/login.html'<!--删除时候返回登录界面-->
      }
    })
  },

功能测试

三、员工管理模块

完善登录功能

问题:如果用户不登陆,通过连接直接访问系统首页,照样可以正常访问。这种设计是不合理的,我们希望看到的是:登录之后可以访问,如果没有登录就不能访问,并跳转到登录界面 那么如何实现呢? 那就需要使用过滤器或者拦截器,在过滤器中或者拦截器中判断用户是否已经完成登录,如果没有完成登录,则跳转到登录界面

我们使用过滤器进行实现

实现步骤:

① 创建自定义过滤器LoginCheckFilter

②在启动类上加上注解@ServletComponentScan

③完善过滤器的处理逻辑

LoginCheckFilter

代码语言:javascript复制
/*
检查用户是否已经完成登录
 */
@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();
        //定义不需要处理的请求路径
        String[] urls=new String[]{
                "/employee/login",
                "/employee/logout",
                "/backend/**",
                "/front/**"
        };

        //2、判断本次请求是否需要处理
        boolean check = check(requestURI, urls);
        //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;
        }
        //5、如果未登录则返回登录结果,通过输出流方式向客户端页面相应数据
        //前端有检测在request.js
        response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));
        //
        //log.info("拦截到请求:{}", request.getRequestURI());
        //filterChain.doFilter(request,response);q
        return;

    }

    /**
     * 路径匹配,检查本次请求是否需要放行
     * @param requestURI
     * @param urls
     * @return
     */
    public boolean check(String requestURI,String[] urls){
        for(String url : urls){
            boolean match=PATH_MATCHER.match(url,requestURI);
            if(match){
                return true;
            }
        }
        return false;
    }
}

0 人点赞