Skip to content

苍穹外卖

约 1899 个字 99 行代码 预计阅读时间 8 分钟

启动

后端:

  • 启动 maven 项目
  • 打开数据库:brew services start mysql

前端:

  • 启动ngnix:brew services start ngnix
  • 访问:localhost:80

接口文档

  • swagger:localhost:8080/doc.html
  • postman: 调试 api

Pojo

image-20240822105147396

image-20240822105027060

@RequestBody 是 Spring 框架中的一个注解,主要用于处理 HTTP 请求体中的数据。在开发基于 Spring 的 Java Web 应用程序时,@RequestBody 通常用于将 HTTP 请求的 JSON 或 XML 数据直接映射到 Java 对象中。

传参

  1. @RequestParam:用于绑定请求中的单个参数到方法参数或对象的某个字段。

  2. @RequestBody:用于绑定请求体中的数据(通常是 JSON)到 Java 对象。常用于处理 POST 请求的 JSON 数据。

  3. @ModelAttribute:用于绑定请求中的所有参数到一个模型对象上。它比不使用任何注解时的默认数据绑定更显式,更适合复杂的绑定场景。

1. URL 参数(Query Parameters)

对于通过 URL 参数(如 GET 请求)传递的数据,Spring Boot 可以使用 @RequestParam 注解来获取。

示例:

前端请求 URL:

http://localhost:8080/api/employees?id=123&name=John

后端控制器方法:

@RestController
@RequestMapping("/api")
public class EmployeeController {

    @GetMapping("/employees")
    public String getEmployee(@RequestParam("id") Long id, @RequestParam("name") String name) {
        // 使用 id 和 name 参数
        return "Employee ID: " + id + ", Name: " + name;
    }
}

2. 路径变量(Path Variables)

对于 URL 中作为路径一部分的变量,可以使用 @PathVariable 注解来获取。

示例:

前端请求 URL:

http://localhost:8080/api/employees/123

后端控制器方法:

@RestController
@RequestMapping("/api")
public class EmployeeController {

    @GetMapping("/employees/{id}")
    public String getEmployeeById(@PathVariable("id") Long id) {
        // 使用路径变量 id
        return "Employee ID: " + id;
    }
}

3. 表单数据或请求体数据(Form Data / Request Body)

对于 POST 请求,数据可以在请求体中发送,常见格式包括表单数据和 JSON 数据。

示例:

前端发送 JSON 数据的 POST 请求:

{
    "id": 123,
    "name": "John",
    "phone": "1234567890"
}

后端控制器方法:

@RestController
@RequestMapping("/api")
public class EmployeeController {

    @PostMapping("/employees")
    public String createEmployee(@RequestBody Employee employee) {
        // Spring Boot 会自动将请求体中的 JSON 数据映射到 Employee 对象
        return "Created employee with ID: " + employee.getId();
    }
}

4. 表单参数(Form Parameters)

如果前端以表单格式提交数据,可以使用 @RequestParam 进行接收:

示例:

前端提交表单:

<form action="/api/employees" method="post">
    <input type="text" name="name" />
    <input type="text" name="phone" />
    <button type="submit">Submit</button>
</form>

后端控制器方法:

@RestController
@RequestMapping("/api")
public class EmployeeController {

    @PostMapping("/employees")
    public String createEmployee(@RequestParam("name") String name, @RequestParam("phone") String phone) {
        // 使用 name 和 phone 参数
        return "Created employee with Name: " + name + ", Phone: " + phone;
    }
}

5. 使用 @ModelAttribute 注解

@ModelAttribute 注解用于从请求参数中绑定对象,对于需要从多个表单字段创建复杂对象时非常有用。

示例:

前端提交表单数据:

<form action="/api/employees" method="post">
    <input type="text" name="id" />
    <input type="text" name="name" />
    <input type="text" name="phone" />
    <button type="submit">Submit</button>
</form>

后端控制器方法:

@RestController
@RequestMapping("/api")
public class EmployeeController {

    @PostMapping("/employees")
    public String createEmployee(@ModelAttribute Employee employee) {
        // Spring Boot 会自动将请求参数映射到 Employee 对象
        return "Created employee with ID: " + employee.getId() + ", Name: " + employee.getName();
    }
}

总结

  • @RequestParam:用于获取查询参数或表单数据。
  • @PathVariable:用于获取 URL 中的路径变量。
  • @RequestBody:用于获取请求体中的 JSON 或 XML 数据,直接映射到 Java 对象。
  • @ModelAttribute:用于从请求参数中创建对象,常用于表单数据提交。

选择哪种方式取决于前端如何发送数据到服务器端,以及你在后端想如何处理这些数据。

逻辑

  1. Controller 层:负责处理客户端请求,调用 Service 层的业务逻辑,返回结果给客户端。
  2. Service 层:负责业务逻辑的处理,通过调用 Mapper 层来操作数据库。
  3. Mapper 层:使用 MyBatis 访问数据库,执行 SQL 查询和更新操作。

分类模块

@AutoWired

  • 这个类要用到那个东西,spring提前会把那个东西实例化一个放到维护的容器里,从容器里给这个类
  • 这样就不用 new 了,spring 统一管理

Controller

@RestController 是 Spring Boot 中的一个注解,它是 @Controller@ResponseBody 两个注解的组合,主要用于简化开发 RESTful Web 服务。

@RestController 的作用

  1. 标识控制器类@RestController 用于标识一个类是 Spring MVC 的控制器类,处理 HTTP 请求并返回响应数据。

  2. 简化返回 JSON/XML 格式的数据@RestController 直接将方法的返回值作为 HTTP 响应的正文(body)返回,默认以 JSON 格式序列化返回(如果没有指定其他的 HttpMessageConverter)。这样做的好处是不需要在每个方法上加 @ResponseBody 注解。

数据绑定:Spring MVC 通过数据绑定机制将 HTTP 请求的查询参数自动绑定到控制器方法的参数对象上(如 EmployeePageQueryDTO)。

自动装配:通过 Spring MVC 的自动装配功能,可以直接在控制器方法中使用 DTO 对象来获取请求参数,而不需要手动解析查询参数。

请求处理流程:前端发送 GET 请求,控制器方法接收并自动绑定参数,调用服务层进行处理,最后返回结果。

Service

@Service: 在 impl 中加该注解

Mapper

@Mapper

菜品模块

AOP

Spring AOP 思想,可以让开发人员,在不改变原有业务逻辑代码的基础上,扩展新的功能。

  • 切入点:想要扩展新功能的位置
  • 切面:新功能业务逻辑代码

通过将「切面」从「切入点」织入原有业务逻辑的方式,来达到业务功能扩展的目的。

SpringBoot 主要解决两点:“业务功能扩展” 和 “性能消耗管理”

  • AOP 负责业务功能扩展,他保证在扩展业务功能时,不用修改原有业务逻辑代码。
  • IOC 负责统一管理对象创建和依赖关系,解决内存消耗问题。

自动填充公共字段

  1. 自定义注解 AutoFill ,用于标识需要进行公共字段自动填充的方法
  2. 自定义切面类 AutoFillAspect,统一拦截加入了 AutoFill 注解的方法,通过反射为公共字段赋值
  3. 在 Mapper 的方法上加入 AutoFill 注解

自定义注解

创建自定义注解:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AutoFill {
    OperationType value();
}

@Target(ElementType.METHOD): - 这个元注解 (@Target) 指定了 @AutoFill 注解可以应用的程序元素。在这里,ElementType.METHOD 表示 @AutoFill 只能应用于方法上。

@Retention(RetentionPolicy.RUNTIME):

  • 这个元注解 (@Retention) 指定了 @AutoFill 注解的保留策略。在这里,RetentionPolicy.RUNTIME 表示该注解将在运行时保留,因此可以通过反射来读取。

自定义切面

@Pointcut("execution(* com.sky.mapper.*.*(..)) && @annotation(com.sky.annotation.AutoFill)")
public void autoFillPointCut(){}
  1. @Pointcut:这个注解用于定义一个切点表达式,它描述了哪些方法会被切面中的通知(advice)拦截。

  2. "execution( com.sky.mapper..*(..))": - execution是切点表达式的关键词,用于匹配方法执行。 - * com.sky.mapper.*.*(..)表示要匹配的目标方法:

    • *:表示匹配所有返回类型。
    • com.sky.mapper.*.*:表示匹配com.sky.mapper包下的所有类的所有方法。
    • (..):表示匹配任意参数的方法。
  3. &&:逻辑运算符,表示需要同时满足前后的条件。

  4. @annotation(com.sky.annotation.AutoFill): - 这个部分表示方法上有@AutoFill注解的那些方法会被匹配到。 - com.sky.annotation.AutoFill是注解的全限定名。

综上所述,这段代码定义了一个切点autoFillPointCut(),它会匹配所有com.sky.mapper包下的类的方法,这些方法的返回类型可以是任意类型,参数可以是任意的,但必须带有@AutoFill注解。

页面查询

<select id="pageQuery" resultType="DishVO">
    select dish.*,category.name categoryName from dish,category

    <where>
        dish.category_id = category.id
        <if test="name != null and name != ''">
            and dish.name like concat('%',#{name},'%')
        </if>
        <!--
            dish.name 是数据库中的,#{name} 是前端传过来的
            if 中的也是前端传过来的数据

            这里注意 categoryId 是前端穿过来的数据,是 DishPageQueryDTO 中的数据
            category_id 是数据库中的数据,要注意对应。
        -->
        <if test="categoryId != null and categoryId != ''">
            and dish.category_id = #{categoryId}
        </if>

        <!-- status 是 Integer ,所以不能加判断:status != '' , 字符串才需要加这个判断。-->
        <if test="status != null">
            and dish.status = #{status}
        </if>
    </where>
    order by create_time desc
</select>

Redis入门

Redis 是一个基于「内存」的 key-value 结构数据库

  • key 是字符串类型
  • value 有 \(5\) 种数据类型:string,hash(键值对),list,set,sorted set

字符串常用命令

设置值:set key value

获取值:get key

设置指定 key 的有效期(set with expiration): setex key seconds value

只有在 key 不存在时才会有效(set if not exist):setnx key value

哈希操作命令

设置field的值:hset key field value

获取field的值:hget key field

删除field字段:hdel key field

获取 key 的所有字段(field):hkeys key

获取 key 的所有值(value) :hvals key

列表操作命令

从头部(左边)加入:lpush key value

从头部(左边)删除:lpop key

从尾部(右边)删除:rpop key

获取列表中指定范围的元素: lrange key start stop

集合操作命令

添加成员:sadd key member

返回集合中所有成员:smembers key

获取集合的成员数:scard key

返回集合的交集:sinter key1 key2 ..

返回集合的并集:sunion key1 key2

返回集合的差集:sdiff key1 key2

删除集合的成员:sren key member

通用命令

查找所有给定模式的key:keys pattern

是否存在 key:exists key

查看 key 的类型:type key

删除 key :del key

查看 key 的有效期:ttl key (ttl means time to live)


Last update: February 24, 2025
Created: February 24, 2025

Comments