java项目实战–瑞吉外卖Day1
文章目录
一、业务开发
1.数据库环境搭建
使用navicat创建数据库,字符集为utf8mb4:
运行SQL文件:
这里运行的文件是“黑马程序员Java项目实战《瑞吉外卖》”的课程资料,可在黑马程序员课程视频下查看获取方法。
数据库中各表的说明:
2.Maven项目搭建
新建一个Maven项目:
将课程资料中pom.xml文件的依赖拷贝到项目的pom.xml文件中:
将课程资料中的application.yml文件拷贝到src\main\resources目录下:
在使用application.yal文件时,别忘了将数据库中的账户密码和端口修改成自己的。
编写启动类:
package com.mj.reggie;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @author mj
* @version 1.0
*/
//编写启动类
@Slf4j
@SpringBootApplication
public class ReggieApplication {
public static void main(String[] args) {
SpringApplication.run(ReggieApplication.class,args);
// 输出日志
log.info("项目启动成功");
}
}
3.导入前端资源
将资料中的前端资源backend和front文件粘贴到resources目录下:
此时虽然项目中已经有了前端的文件,但是还并不能通过浏览器进行访问,此时访问会出现404的错误:
为了解决这个问题,我们需要编写配置类来设置静态资源的映射:
代码如下:
package com.mj.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;
/**
* @author mj
* @version 1.0
* 设置静态映射
*/
@Configuration
@Slf4j
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. 创建所需接口和类
1.创建实体类Employee,与数据库中的employee员工表进行映射:
代码如下:
package com.mj.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;
/*
员工实体类
* */
@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;
}
2.创建EmployeeMapper接口:
代码如下:
package com.mj.reggie.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.mj.reggie.entity.Employee;
import org.apache.ibatis.annotations.Mapper;
/**
* @author mj
* @version 1.0
*/
@Mapper
public interface EmployeeMapper extends BaseMapper<Employee> {
}
3.创建EmployeeService接口:
代码如下:
package com.mj.reggie.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.mj.reggie.entity.Employee;
/**
* @author mj
* @version 1.0
*/
public interface EmployeeService extends IService<Employee> {
}
4.创建EmployeeServiceImpl实现类:
代码如下:
package com.mj.reggie.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.mj.reggie.entity.Employee;
import com.mj.reggie.mapper.EmployeeMapper;
import com.mj.reggie.service.EmployeeService;
import org.springframework.stereotype.Service;
/**
* @author mj
* @version 1.0
*/
@Service
public class EmployeeServiceImpl extends ServiceImpl<EmployeeMapper, Employee> implements EmployeeService {
}
5.创建EmployeeController类:
package com.mj.reggie.controller;
import com.mj.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;
/**
* @author mj
* @version 1.0
*/
@Slf4j
@RestController
@RequestMapping("/employee")
public class EmployeeController {
@Autowired
private EmployeeService employeeService;
}
6.通用返回结果类,服务端响应的数据最终都会封装成此对象:
代码如下:
package com.mj.reggie.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;
}
}
2.后台登录功能开发
1.实现登录功能流程:
代码如下:
package com.mj.reggie.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.mj.reggie.common.R;
import com.mj.reggie.entity.Employee;
import com.mj.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;
/**
* @author mj
* @version 1.0
*/
@Slf4j
@RestController
@RequestMapping("/employee")
public class EmployeeController {
@Autowired
private EmployeeService employeeService;
/*
* 员工登录*/
@PostMapping("/login")
public R<Employee> login(HttpServletRequest httpServletRequest, @RequestBody Employee employee) {
// 1.将页面提交的密码password进行md5加密处理
String password = employee.getPassword();
password = DigestUtils.md5DigestAsHex(password.getBytes());
// 2.将页面提交的用户名userName进行数据库查询
LambdaQueryWrapper<Employee> lambdaQueryWrapper = new LambdaQueryWrapper<Employee>();
lambdaQueryWrapper.eq(Employee::getUsername, employee.getUsername());
Employee emp = employeeService.getOne(lambdaQueryWrapper);
// 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,并返回登录成功结果
httpServletRequest.getSession().setAttribute("employee", emp.getId());
return R.success(emp);
}
}
为了方便后续的调试,我们可以在 src/main/resources/backend/js/request.js 文件中修改timeout,让我们在调试时有充足的时间:
3.后台退出功能开发
1.实现退出功能流程:
2.代码如下:
/*
* 员工退出*/
@PostMapping("/logout")
public R<String> logout(HttpServletRequest httpServletRequest) {
// 清理Session中保存的当前登录员工的ID
httpServletRequest.getSession().removeAttribute("employee");
return R.success("退出成功");
}
}
4.登录与退出实现后的总代码:
package com.mj.reggie.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.mj.reggie.common.R;
import com.mj.reggie.entity.Employee;
import com.mj.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;
/**
* @author mj
* @version 1.0
*/
@Slf4j
@RestController
@RequestMapping("/employee")
public class EmployeeController {
@Autowired
private EmployeeService employeeService;
/*
* 员工登录*/
@PostMapping("/login")
public R<Employee> login(HttpServletRequest httpServletRequest, @RequestBody Employee employee) {
// 1.将页面提交的密码password进行md5加密处理
String password = employee.getPassword();
password = DigestUtils.md5DigestAsHex(password.getBytes());
// 2.将页面提交的用户名userName进行数据库查询
LambdaQueryWrapper<Employee> lambdaQueryWrapper = new LambdaQueryWrapper<Employee>();
lambdaQueryWrapper.eq(Employee::getUsername, employee.getUsername());
Employee emp = employeeService.getOne(lambdaQueryWrapper);
// 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,并返回登录成功结果
httpServletRequest.getSession().setAttribute("employee", emp.getId());
return R.success(emp);
}
/*
* 员工退出*/
@PostMapping("/logout")
public R<String> logout(HttpServletRequest httpServletRequest) {
// 清理Session中保存的当前登录员工的ID
httpServletRequest.getSession().removeAttribute("employee");
return R.success("退出成功");
}
}