目录
1. 创建数据库
2. 导入表结构,直接运行外部SQL文件
数据表的说明
序号 表名 说明
1 employee 员工表 2 category 菜品和套餐分类表 3 dish 菜品表 4 setmeal 套餐表 5 setmeal_dish 套餐菜品关系表 6 dish_flavor 菜品口味关系表 7 user 用表(c端) 8 address_book 地址薄表 9 shopping_cart 购物车表 10 orders 订单表 11 orders_detail 订单明细表
1. 创建一个maven项目
注意:创建maven项目后,一定要检查项目的编码, maven仓库的配置,jdk的配置等
2. 导入pom文件
"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.0modelVersion> <parent> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-parentartifactId> <version>2.4.5version> <relativePath/> parent> <groupId>com.learngroupId> <artifactId>reggie_take_outartifactId> <version>1.0-SNAPSHOTversion> <properties> <maven.compiler.source>8maven.compiler.source> <maven.compiler.target>8maven.compiler.target> <java.version>1.8java.version> properties> <dependencies> <dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starterartifactId> dependency> <dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-testartifactId> <scope>testscope> dependency> <dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-webartifactId> <scope>compilescope> dependency> <dependency> <groupId>com.baomidougroupId> <artifactId>mybatis-plus-boot-starterartifactId> <version>3.4.2version> dependency> <dependency> <groupId>org.projectlombokgroupId> <artifactId>lombokartifactId> <version>1.18.20version> dependency> <dependency> <groupId>com.alibabagroupId> <artifactId>fastjsonartifactId> <version>1.2.76version> dependency> <dependency> <groupId>commons-langgroupId> <artifactId>commons-langartifactId> <version>2.6version> dependency> <dependency> <groupId>mysqlgroupId> <artifactId>mysql-connector-javaartifactId> <scope>runtimescope> dependency> <dependency> <groupId>com.alibabagroupId> <artifactId>druid-spring-boot-starterartifactId> <version>1.1.23version> dependency> dependencies> <build> <plugins> <plugin> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-maven-pluginartifactId> <version>2.4.5version> plugin> plugins> build> project>3. 创建 application.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/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true username: root password: ggm mybatis-plus: configuration: #在映射实体或者属性时,将数据库中表名和字段名中的下划线去掉,按照驼峰命名法映射 map-underscore-to-camel-case: true log-impl: org.apache.ibatis.logging.stdout.StdOutImpl global-config: db-config: id-type: ASSIGN_ID4. 创建Boot程序入口
package com.learn.reggie; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; /** * @author 咕咕猫 * @version 1.0 */ @Slf4j @SpringBootApplication public class ReggieApplication { public static void main(String[] args) { SpringApplication.run(ReggieApplication.class,args); log.info("项目启动成功"); } }
注意前端文件的位置,在Boot项目中,前台默认只能访问resource目录下的static和template文件夹下的文件;所以如果要使用这种方式,直接创建一个static目录就行,然后把这些前端资源放在这个static目录下就行;
如果不想把前端文件放在这两个默认的文件夹下,那么就可以自定义mvc的支持,如下(多学习一种定义的方法,以后自定义映射的时候可以使用)
package com.learn.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 咕咕猫 * @version 1.0 */ //此注解用于记录日志,方便调试 @Slf4j //Configuration注解说明了这是一个配置类 @Configuration 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/"); } }
前端页面访问地址:http://localhost:8080/backend/page/login/login.html
查看登陆请求信息:点击登录会发送登录请求:http://localhost:8080/employee/login
1. 创建相关的包:
2. 实体类和mapper的开发
在entity导入实体类employee类;
package com.learn.reggie.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.learn.reggie.entity.Employee; import org.apache.ibatis.annotations.Mapper; /** * @author 咕咕猫 * @version 1.0 */ //@Mapper在编译之后会生成相应的接口实现类 @Mapper public interface EmployeeMapper extends BaseMapper{ }使用快捷键 Ctrl + f3 就可以看见mybatis-plus 帮我们定义的mapper接口:
3. Service
package com.learn.reggie.service; import com.baomidou.mybatisplus.extension.service.IService; import com.learn.reggie.entity.Employee; /** * @author 咕咕猫 * @version 1.0 */ //这两个泛型一个是实体类对应的mapper,一个是实体类 public interface EmployeeService extends IService{ }查看帮我们实现的方法:
package com.learn.reggie.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.learn.reggie.entity.Employee; import com.learn.reggie.mapper.EmployeeMapper; import com.learn.reggie.service.EmployeeService; import org.springframework.stereotype.Service; /** * @author 咕咕猫 * @version 1.0 */ @Service public class EmployeeServiceImpl extends ServiceImplimplements EmployeeService { }4. 封装返回结果类R(result)
创建一个新的包common,用来存放共同使用的类,把这个返回结果类放入这个公共包
package com.learn.reggie.common; import lombok.Data; import java.util.HashMap; import java.util.Map; /** * 通用的返回结果,服务端响应的数据最终都会封装成此对象 * @param */ @Data public class R{ private Integer code; //编码:1成功,0和其它数字为失败 private String msg; //错误信息 private T data; //数据 private Map map = new HashMap(); //动态数据 public staticR success(T object) { Rr = new R (); r.data = object; r.code = 1; return r; } public staticR error(String msg) { R r = new R(); r.msg = msg; r.code = 0; return r; } public Radd(String key, Object value) { this.map.put(key, value); return this; } }5. Controller
先处理业务逻辑,再编写代码
1、将页面提交的密码password进行md5加密处理 2、根据页面提交的用户名username查询数据库 3、如果没有查询到则返回登录失败结果 4、密码比对,如果不一致则返回登录失败结果 5、查看员工状态,如果为已禁用状态,则返回员工已禁用结果 6、登录成功,将员工id存入Session并返回登录成功结果
package com.learn.reggie.controller; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; import com.learn.reggie.common.R; import com.learn.reggie.entity.Employee; import com.learn.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 咕咕猫 * @version 1.0 */ @Slf4j @RestController @RequestMapping("/employee") public class EmployeeController { @Autowired private EmployeeService employeeService; /** * 员工登录 * @param request * @param employee * @return */ @PostMapping("/login") //这里前端是Post请求,所以是PostMapping,并且是restful风格开发 //因为返回结果统一用json格式,所以用了RequestBody注解 //登录成功后HttpServletRequest接收session数据,方便getSession对象,获取当前登录用户 public Rlogin(HttpServletRequest request, @RequestBody Employee employee){ //这里为什么还有接收一个request对象的数据? //登陆成功后,我们需要从请求中获取员工的id,并且把这个id存到session中,这样我们想要获取登陆对象的时候就可以随时获取 //1、将页面提交的密码password进行md5加密处理, 得到加密后的字符串 String password = employee.getPassword(); password = DigestUtils.md5DigestAsHex(password.getBytes());//对用户密码进行加密 //2、根据页面提交的用户名username查询数据库中员工数据信息 LambdaQueryWrapperqueryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(Employee::getUsername,employee.getUsername()); //在设计数据库的时候我们对username使用了唯一索引,所以这里可以使用getOne方法 Employee emp = employeeService.getOne(queryWrapper); //3、如果没有查询到, 则返回登录失败结果 if (emp == null){ return R.error("登录失败"); } //4、密码比对,如果不一致, 则返回登录失败结果 if (!emp.getPassword().equals(password)){ //emp.getPassword()用户存在后从数据库查询到的密码(加密状态的) 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); } }
使用debug形式启动项目,在浏览器访问http://localhost:8080/backend/page/login/login.html
然后打开浏览器的f12,查看具体的请求情况:
在后台查看debug的状态:
运行成功后:(这个密码是123456),数据存在了浏览器中:这个代码是把返回的数据保持在浏览器中:
localStorage.setItem('userInfo',JSON.stringify(res.data))
在浏览器我们可以看见,key为userInfo,value为我们返回的数据
点击退出按钮,发送退出的请求:http://localhost:8080/employee/logout
后端代码处理:
①在controller中创建对应的处理方法来接受前端的请求,请求方式为post;
②清理session中的用户id
③返回结果(前端页面会进行跳转到登录页面)
前端代码,也要把浏览器中的数据给清除;
/** * 退出功能 * ①在controller中创建对应的处理方法来接受前端的请求,请求方式为post; * ②清理session中的用户id * ③返回结果(前端页面会进行跳转到登录页面) * @param request * @return */ @PostMapping("/logout") public Rlogout(HttpServletRequest request){ //1、清理Session中保存的当前的员工id request.getSession().removeAttribute("employee"); return R.success("退出成功"); }功能测试:先登陆,然后退出即可;看浏览器中的数据是否会被清除;