黑马程序员Java项目实战《瑞吉外卖》 笔记 Day1:视频P1-P14

黑马程序员Java项目实战《瑞吉外卖》 笔记Day1:视频P1-P14

本课程以当前热门的外卖点餐为业务基础,业务真实、实用、广泛。基于流行的Spring Boot、mybatis plus等技术框架进行开发,带领学员体验真实项目开发流程、需求分析过程和代码实现过程。学完本课程能够收获:锻炼需求分析能力、编码能力、bug调试能力,增长开发经验。

  • 链接:https://www.bilibili.com/video/BV13a411q753

20230318 Day1:视频P1-P14

搭建项目环境,导入静态资源,创建MVC框架的基本类,完成后端登录和退出功能

项目环境搭建:

搭建数据库环境:使用Navicat创建数据库employee,并导入表结构
创建Maven项目:向pom.xml中导入dependency依赖项

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

导入application.yml文件,配置Spring项目

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

将静态资源(html)文件导入项目

因为未放置在statci目录下,需要进行静态资源映射,否则会报错404

创建一个config包,在包内创建配置类WebMvcConfig,将静态资源中的backend/front文件夹进行映射

package com.raggie.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;

@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/");
    }
}

后台登陆功能开发:

分析后台登陆功能具体需求:

1、将页面提交的密码password进行md5加密处理
2、根据页面提交的用户名username查询数据库
3、如果没有查询到则返回登录失败结果
4、密码比对,如果不一致则返回登录失败结果
5、查看员工状态,如果为已禁用状态,则返回员工已禁用结果
6、登录成功,将员工id存入Session并返回登录成功结果

创建一个entity包,在包内创建实体类Employee,与数据库中的employee表进行映射

需要在application.yml中配置,将 map-underscore-to-camel-case: true 设置为True,才能将数据库中表名和字段名中的下划线去掉,按照驼峰命名法映射

扫描二维码关注公众号,回复: 15621701 查看本文章
package com.raggie.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;

}

分别创建controller/service(service.impl)/mapper包
在mapper包下创建Mapper接口,添加@Mapper注解,继承BaseMapper,并指定泛型为刚刚创建的实体类Employee

package com.raggie.mapper;

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

@Mapper
public interface EmployeeMapper extends BaseMapper<Employee> {
    
    

}
    

在service包下创建EmployeeService接口,继承IService,并指定泛型为Employee

package com.raggie.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.raggie.entity.Employee;

public interface EmployeeService extends IService<Employee> {
    
    

}

在service包下创建EmployeeServiceImpl类,添加@Service注解,继承ServiceImpl,并指定泛型为EmployeeMapper和Employee

package com.raggie.service.impl;

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

@Service
public class EmployeeServiceImpl extends ServiceImpl<EmployeeMapper, Employee> implements EmployeeService {
    
    

} 

在controller包下创建EmployeeController类,添加@Slf4j注解方便后期调试,
添加@RestController和@RequestMapping(“/employee”)注解,通过@Autowired注解,将service接口注入

package com.raggie.controller;

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

创建一个common包,导入返回结果类R

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

package com.raggie.common;

import lombok.Data;

import java.util.HashMap;
import java.util.Map;

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

}

在EmployeeController中,创建一个login方法,给login方法添加@PostMapping(“/login”),并传值(HttpServletRequest request, @RequestBody Employee employee)
根据先前分析的业务逻辑,完成login方法的代码
1.将页面提交的密码password进行md5加密处理

String password = employee.getPassword();
password = DigestUtils.md5DigestAsHex(password.getBytes());

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

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并返回登录成功结果

request.getSession().setAttribute("employee",emp.getId());
return R.success(emp);

后台退出功能开发:

分析后台退出功能具体需求:

员工登录成功后,页面跳转到后台系统首页面(backend./index.htm), 此时会显示当前登录用户的姓名:
如果员工需要退出系统,直接点击右侧的退出按钮即可退出系统,退出系统后页面应跳转回登录页面

代码开发流程

用户点击页面中退出按钮,发送请求,请求地址为/employee/.logout,请求方式为PoST。
我们只需要在Controller中创建对应的处理方法即可,具体的处理逻辑:
1.清理Session中的用户id
2.返回结果

在EmployeeController中,创建一个logout方法,给logout方法添加@PostMapping(“/logout”),并传值(HttpServletRequest)
1.清理Session中的用户id

request.getSession().removeAttribute("employee");

2.返回结果

return R.success("退出成功!");

EmployeeController类最终代码:

package com.raggie.controller;

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

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

        //2、根据页面提交的用户名username查询数据库
        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并返回登录成功结果
        request.getSession().setAttribute("employee",emp.getId());
        return R.success(emp);
    }

    /**
     * 员工退出
     * @param request
     * @return
     */
    @PostMapping("/logout")
    public R<String> logout(HttpServletRequest request){
    
    
        request.getSession().removeAttribute("employee");
        return R.success("退出成功!");
    }
}

P14:分析后台系统首页构成和效果展示方式

猜你喜欢

转载自blog.csdn.net/m0_46504802/article/details/129641488