前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java项目之瑞吉外卖

java项目之瑞吉外卖

作者头像
用户8447427
发布2023-03-08 21:25:42
3440
发布2023-03-08 21:25:42
举报
文章被收录于专栏:userlyz学习记录userlyz学习记录

准备工作:项目创建

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;
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-09-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 准备工作:项目创建
  • 一、后台登录功能开发
    • 1、前端页面点击登录会发送登录请求:
      • 2、实体类和mapper的开发
        • 3、Controller
        • 二、后台系统退出功能
        • 三、员工管理模块
          • 完善登录功能
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档