写在最前:此文章为黑马程序员瑞吉外卖项目学习笔记,感谢黑马的教程。附上链接: 点击跳转到视频教程
同时文章同步至本人个人博客网站,点击跳转: https://ldd21.github.io
学习本项目所需前置知识:
Java基础知识 javaweb、MySQL、maven、SSM、springboot、mybatisplus
1.瑞吉外卖项目概述
1.0项目中所需要的资源,百度网盘链接:https://pan.baidu.com/s/1WKULh5F7BwjjPRpDnhozAA
提取码:ldd1
1.1项目效果展示
1.2软件开发整体流程
1.3整体项目介绍
1.3.1技术选型:
1.3.2功能架构
1.3.3 角色
2.开发环境搭建
2.1数据库环境搭建
创建名为reggie的数据库,并导入sql文件(sql文件在文首百度网盘链接中)
以下为创建出来的11个表
2.2搭建项目工程
2.2.1 idea创建项目
我们直接创建一个springboot工程,选择SpringWeb,MySQL,mybatis,接着在pom.xml文件中导入druid,lombok,mybatisplus的依赖坐标。(ps:视频中创建的是Maven工程,比较麻烦,我们直接创建springboot工程。)
2.2.2导入项目所需的前端资源(本项目注重后端开发,前端不需要我们自己写)
将百度网盘分享的资源中的前端资源导入到resources/static目录下。(如果这里创建的是maven工程,需要配置静态资源映射,代码如下)
@Configuration
@Slf4j
public class WebMvcConfig extends WebMvcConfigurationSupport {
/**
* 设置静态资源映射
* @param registry
*/
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
log.info("开始进行静态资源映射...");
registry.addResourceHandler("/backend/**").addResourceLocations("classpath:/backend/");
registry.addResourceHandler("/front/**").addResourceLocations("classpath:/front/");
}
}
2.2.3导入yml配置文件
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
username: root
password: password
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
注意用户名和密码要配置成自己的
3.后台登录功能开发
3.1后台功能开发
/**
* 员工实体
*/
@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;
}
3.2创建对应的包结构
3.3导入结果返回类
此类是一个通用结果类,服务端响应的所有结果最终都会包装成此种类型返回给前端对象
/**
* 通用的返回结果类,服务端相应的数据最终封装成此对象
* @param <T>
*/
@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;
}
}
3.4梳理登录方法处理逻辑
3.5代码实现登录功能
@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将页面提交的密码进行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登录成功
request.getSession().setAttribute("employee",emp.getId());
return R.success(emp);
}
3.6后台系统退出功能
/**
* 员工退出
* @param request
* @return
*/
@PostMapping("/logout")
public R<String> logout(HttpServletRequest request){
request.getSession().removeAttribute("employee");
return R.success("退出成功");
}
}
只需把以上代码加到login方法后面
以上,为瑞吉外卖业务开发day01学习笔记。