• 瑞吉外卖(1)—


    目录

    一、开发环境的搭建

    1.1 数据库环境的搭建

    1.2 Maven项目搭建

    1.3 导入前端文件

    二、后台登录功能开发

    2.1 需求分析

    2.2 代码开发

    2.3 功能测试

    三、后台系统退出功能


    一、开发环境的搭建

    1.1 数据库环境的搭建

    1. 创建数据库

     2. 导入表结构,直接运行外部SQL文件

    数据表的说明

    序号表名

    说明

    1employee员工表
    2category菜品和套餐分类表
    3dish菜品表
    4setmeal套餐表
    5setmeal_dish套餐菜品关系表
    6dish_flavor菜品口味关系表
    7user用表(c端)
    8address_book地址薄表
    9shopping_cart购物车表
    10orders订单表
    11orders_detail订单明细表

    1.2 Maven项目搭建

    1. 创建一个maven项目

    注意:创建maven项目后,一定要检查项目的编码, maven仓库的配置,jdk的配置等

     2. 导入pom文件

    1. "1.0" encoding="UTF-8"?>
    2. <project xmlns="http://maven.apache.org/POM/4.0.0"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    5. <modelVersion>4.0.0modelVersion>
    6. <parent>
    7. <groupId>org.springframework.bootgroupId>
    8. <artifactId>spring-boot-starter-parentartifactId>
    9. <version>2.4.5version>
    10. <relativePath/>
    11. parent>
    12. <groupId>com.learngroupId>
    13. <artifactId>reggie_take_outartifactId>
    14. <version>1.0-SNAPSHOTversion>
    15. <properties>
    16. <maven.compiler.source>8maven.compiler.source>
    17. <maven.compiler.target>8maven.compiler.target>
    18. <java.version>1.8java.version>
    19. properties>
    20. <dependencies>
    21. <dependency>
    22. <groupId>org.springframework.bootgroupId>
    23. <artifactId>spring-boot-starterartifactId>
    24. dependency>
    25. <dependency>
    26. <groupId>org.springframework.bootgroupId>
    27. <artifactId>spring-boot-starter-testartifactId>
    28. <scope>testscope>
    29. dependency>
    30. <dependency>
    31. <groupId>org.springframework.bootgroupId>
    32. <artifactId>spring-boot-starter-webartifactId>
    33. <scope>compilescope>
    34. dependency>
    35. <dependency>
    36. <groupId>com.baomidougroupId>
    37. <artifactId>mybatis-plus-boot-starterartifactId>
    38. <version>3.4.2version>
    39. dependency>
    40. <dependency>
    41. <groupId>org.projectlombokgroupId>
    42. <artifactId>lombokartifactId>
    43. <version>1.18.20version>
    44. dependency>
    45. <dependency>
    46. <groupId>com.alibabagroupId>
    47. <artifactId>fastjsonartifactId>
    48. <version>1.2.76version>
    49. dependency>
    50. <dependency>
    51. <groupId>commons-langgroupId>
    52. <artifactId>commons-langartifactId>
    53. <version>2.6version>
    54. dependency>
    55. <dependency>
    56. <groupId>mysqlgroupId>
    57. <artifactId>mysql-connector-javaartifactId>
    58. <scope>runtimescope>
    59. dependency>
    60. <dependency>
    61. <groupId>com.alibabagroupId>
    62. <artifactId>druid-spring-boot-starterartifactId>
    63. <version>1.1.23version>
    64. dependency>
    65. dependencies>
    66. <build>
    67. <plugins>
    68. <plugin>
    69. <groupId>org.springframework.bootgroupId>
    70. <artifactId>spring-boot-maven-pluginartifactId>
    71. <version>2.4.5version>
    72. plugin>
    73. plugins>
    74. build>
    75. project>

    3. 创建 application.yml 文件

    1. server:
    2. port: 8080
    3. spring:
    4. application:
    5. #应用的名称,可选
    6. name: reggie_take_out
    7. datasource:
    8. druid:
    9. driver-class-name: com.mysql.cj.jdbc.Driver
    10. url: jdbc:mysql://localhost:3306/reggie?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
    11. username: root
    12. password: ggm
    13. mybatis-plus:
    14. configuration:
    15. #在映射实体或者属性时,将数据库中表名和字段名中的下划线去掉,按照驼峰命名法映射
    16. map-underscore-to-camel-case: true
    17. log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    18. global-config:
    19. db-config:
    20. id-type: ASSIGN_ID

    4. 创建Boot程序入口

    1. package com.learn.reggie;
    2. import lombok.extern.slf4j.Slf4j;
    3. import org.springframework.boot.SpringApplication;
    4. import org.springframework.boot.autoconfigure.SpringBootApplication;
    5. /**
    6. * @author 咕咕猫
    7. * @version 1.0
    8. */
    9. @Slf4j
    10. @SpringBootApplication
    11. public class ReggieApplication {
    12. public static void main(String[] args) {
    13. SpringApplication.run(ReggieApplication.class,args);
    14. log.info("项目启动成功");
    15. }
    16. }

    1.3 导入前端文件

    注意前端文件的位置,在Boot项目中,前台默认只能访问resource目录下的static和template文件夹下的文件;所以如果要使用这种方式,直接创建一个static目录就行,然后把这些前端资源放在这个static目录下就行;

    如果不想把前端文件放在这两个默认的文件夹下,那么就可以自定义mvc的支持,如下(多学习一种定义的方法,以后自定义映射的时候可以使用)

    1. package com.learn.reggie.config;
    2. import lombok.extern.slf4j.Slf4j;
    3. import org.springframework.context.annotation.Configuration;
    4. import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
    5. import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
    6. /**
    7. * @author 咕咕猫
    8. * @version 1.0
    9. */
    10. //此注解用于记录日志,方便调试
    11. @Slf4j
    12. //Configuration注解说明了这是一个配置类
    13. @Configuration
    14. public class WebMvcConfig extends WebMvcConfigurationSupport {
    15. /**
    16. * 设置静态资源映射
    17. * @param registry
    18. */
    19. @Override
    20. protected void addResourceHandlers(ResourceHandlerRegistry registry) {
    21. log.info("开始静态资源映射");
    22. registry.addResourceHandler("/backend/**").addResourceLocations("classpath:/backend/");
    23. registry.addResourceHandler("/front/**").addResourceLocations("classpath:/front/");
    24. }
    25. }

    二、后台登录功能开发

    2.1 需求分析

    2.2 代码开发

    前端页面访问地址:http://localhost:8080/backend/page/login/login.html

     查看登陆请求信息:点击登录会发送登录请求:http://localhost:8080/employee/login

    1. 创建相关的包:

    2. 实体类和mapper的开发

    在entity导入实体类employee类;

    1. package com.learn.reggie.mapper;
    2. import com.baomidou.mybatisplus.core.mapper.BaseMapper;
    3. import com.learn.reggie.entity.Employee;
    4. import org.apache.ibatis.annotations.Mapper;
    5. /**
    6. * @author 咕咕猫
    7. * @version 1.0
    8. */
    9. //@Mapper在编译之后会生成相应的接口实现类
    10. @Mapper
    11. public interface EmployeeMapper extends BaseMapper {
    12. }

     使用快捷键 Ctrl + f3 就可以看见mybatis-plus 帮我们定义的mapper接口:

    3. Service

    1. package com.learn.reggie.service;
    2. import com.baomidou.mybatisplus.extension.service.IService;
    3. import com.learn.reggie.entity.Employee;
    4. /**
    5. * @author 咕咕猫
    6. * @version 1.0
    7. */
    8. //这两个泛型一个是实体类对应的mapper,一个是实体类
    9. public interface EmployeeService extends IService {
    10. }
    1. package com.learn.reggie.service.impl;
    2. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
    3. import com.learn.reggie.entity.Employee;
    4. import com.learn.reggie.mapper.EmployeeMapper;
    5. import com.learn.reggie.service.EmployeeService;
    6. import org.springframework.stereotype.Service;
    7. /**
    8. * @author 咕咕猫
    9. * @version 1.0
    10. */
    11. @Service
    12. public class EmployeeServiceImpl extends ServiceImpl implements EmployeeService {
    13. }
    查看帮我们实现的方法:

    4. 封装返回结果类R(result)

    创建一个新的包common,用来存放共同使用的类,把这个返回结果类放入这个公共包

    1. package com.learn.reggie.common;
    2. import lombok.Data;
    3. import java.util.HashMap;
    4. import java.util.Map;
    5. /**
    6. * 通用的返回结果,服务端响应的数据最终都会封装成此对象
    7. * @param
    8. */
    9. @Data
    10. public class R {
    11. private Integer code; //编码:1成功,0和其它数字为失败
    12. private String msg; //错误信息
    13. private T data; //数据
    14. private Map map = new HashMap(); //动态数据
    15. public static R success(T object) {
    16. R r = new R();
    17. r.data = object;
    18. r.code = 1;
    19. return r;
    20. }
    21. public static R error(String msg) {
    22. R r = new R();
    23. r.msg = msg;
    24. r.code = 0;
    25. return r;
    26. }
    27. public R add(String key, Object value) {
    28. this.map.put(key, value);
    29. return this;
    30. }
    31. }

    5. Controller

    先处理业务逻辑,再编写代码

    1. 1、将页面提交的密码password进行md5加密处理
    2. 2、根据页面提交的用户名username查询数据库
    3. 3、如果没有查询到则返回登录失败结果
    4. 4、密码比对,如果不一致则返回登录失败结果
    5. 5、查看员工状态,如果为已禁用状态,则返回员工已禁用结果
    6. 6、登录成功,将员工id存入Session并返回登录成功结果
    1. package com.learn.reggie.controller;
    2. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
    3. import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
    4. import com.learn.reggie.common.R;
    5. import com.learn.reggie.entity.Employee;
    6. import com.learn.reggie.service.EmployeeService;
    7. import lombok.extern.slf4j.Slf4j;
    8. import org.springframework.beans.factory.annotation.Autowired;
    9. import org.springframework.util.DigestUtils;
    10. import org.springframework.web.bind.annotation.PostMapping;
    11. import org.springframework.web.bind.annotation.RequestBody;
    12. import org.springframework.web.bind.annotation.RequestMapping;
    13. import org.springframework.web.bind.annotation.RestController;
    14. import javax.servlet.http.HttpServletRequest;
    15. /**
    16. * @author 咕咕猫
    17. * @version 1.0
    18. */
    19. @Slf4j
    20. @RestController
    21. @RequestMapping("/employee")
    22. public class EmployeeController {
    23. @Autowired
    24. private EmployeeService employeeService;
    25. /**
    26. * 员工登录
    27. * @param request
    28. * @param employee
    29. * @return
    30. */
    31. @PostMapping("/login") //这里前端是Post请求,所以是PostMapping,并且是restful风格开发
    32. //因为返回结果统一用json格式,所以用了RequestBody注解
    33. //登录成功后HttpServletRequest接收session数据,方便getSession对象,获取当前登录用户
    34. public R login(HttpServletRequest request, @RequestBody Employee employee){
    35. //这里为什么还有接收一个request对象的数据?
    36. //登陆成功后,我们需要从请求中获取员工的id,并且把这个id存到session中,这样我们想要获取登陆对象的时候就可以随时获取
    37. //1、将页面提交的密码password进行md5加密处理, 得到加密后的字符串
    38. String password = employee.getPassword();
    39. password = DigestUtils.md5DigestAsHex(password.getBytes());//对用户密码进行加密
    40. //2、根据页面提交的用户名username查询数据库中员工数据信息
    41. LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
    42. queryWrapper.eq(Employee::getUsername,employee.getUsername());
    43. //在设计数据库的时候我们对username使用了唯一索引,所以这里可以使用getOne方法
    44. Employee emp = employeeService.getOne(queryWrapper);
    45. //3、如果没有查询到, 则返回登录失败结果
    46. if (emp == null){
    47. return R.error("登录失败");
    48. }
    49. //4、密码比对,如果不一致, 则返回登录失败结果
    50. if (!emp.getPassword().equals(password)){
    51. //emp.getPassword()用户存在后从数据库查询到的密码(加密状态的) password是前端用户自己输入的密码(已经加密处理)
    52. return R.error("登录失败");
    53. }
    54. //5、查看员工状态,如果为已禁用状态,则返回员工已禁用结果
    55. if(emp.getStatus() == 0){
    56. return R.error("账号已禁用");
    57. }
    58. //6、登录成功,将员工id存入Session, 并返回登录成功结果
    59. request.getSession().setAttribute("employee",emp.getId());
    60. //把从数据库中查询到的用户返回出去
    61. return R.success(emp);
    62. }
    63. }

    2.3 功能测试

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

    ③返回结果(前端页面会进行跳转到登录页面)

    前端代码,也要把浏览器中的数据给清除;

    1. /**
    2. * 退出功能
    3. * ①在controller中创建对应的处理方法来接受前端的请求,请求方式为post;
    4. * ②清理session中的用户id
    5. * ③返回结果(前端页面会进行跳转到登录页面)
    6. * @param request
    7. * @return
    8. */
    9. @PostMapping("/logout")
    10. public R logout(HttpServletRequest request){
    11. //1、清理Session中保存的当前的员工id
    12. request.getSession().removeAttribute("employee");
    13. return R.success("退出成功");
    14. }

    功能测试:先登陆,然后退出即可;看浏览器中的数据是否会被清除;

  • 相关阅读:
    三数之和(python)
    计算几何求线段与交点
    Java静态变量在静态方法内部无法改变值
    CDH6下线DataNode节点
    酷开科技丨大屏购物买买买,酷开系统助力网购模式再升级
    U-BOOT小全(二)
    element中el-switch用法汇总(拓展:el-switch开关点击弹出确认框时,状态先改变,点击确认/取消失效,怎么解决?)
    现代 React Web 开发实战——kanban实现卡片拖拽
    Android studio常用的快捷键和基础使用(非常实用)
    MongoDB 索引和常用命令
  • 原文地址:https://blog.csdn.net/weixin_61843013/article/details/127041925