苍穹外卖¶
约 1899 个字 99 行代码 预计阅读时间 8 分钟
启动¶
后端:
- 启动 maven 项目
- 打开数据库:
brew services start mysql
前端:
- 启动ngnix:
brew services start ngnix
- 访问:
localhost:80
接口文档
- swagger:
localhost:8080/doc.html
- postman: 调试 api
Pojo¶
@RequestBody
是 Spring 框架中的一个注解,主要用于处理 HTTP 请求体中的数据。在开发基于 Spring 的 Java Web 应用程序时,@RequestBody 通常用于将 HTTP 请求的 JSON 或 XML 数据直接映射到 Java 对象中。
传参¶
-
@RequestParam:用于绑定请求中的单个参数到方法参数或对象的某个字段。
-
@RequestBody:用于绑定请求体中的数据(通常是 JSON)到 Java 对象。常用于处理 POST 请求的 JSON 数据。
-
@ModelAttribute:用于绑定请求中的所有参数到一个模型对象上。它比不使用任何注解时的默认数据绑定更显式,更适合复杂的绑定场景。
1. URL 参数(Query Parameters)¶
对于通过 URL 参数(如 GET 请求)传递的数据,Spring Boot 可以使用 @RequestParam
注解来获取。
示例:
前端请求 URL:
后端控制器方法:
@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:
后端控制器方法:
@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 请求:
后端控制器方法:
@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
:用于从请求参数中创建对象,常用于表单数据提交。
选择哪种方式取决于前端如何发送数据到服务器端,以及你在后端想如何处理这些数据。
逻辑¶
- Controller 层:负责处理客户端请求,调用 Service 层的业务逻辑,返回结果给客户端。
- Service 层:负责业务逻辑的处理,通过调用 Mapper 层来操作数据库。
- Mapper 层:使用 MyBatis 访问数据库,执行 SQL 查询和更新操作。
分类模块¶
@AutoWired
- 这个类要用到那个东西,spring提前会把那个东西实例化一个放到维护的容器里,从容器里给这个类
- 这样就不用 new 了,spring 统一管理
Controller¶
@RestController
是 Spring Boot 中的一个注解,它是 @Controller
和 @ResponseBody
两个注解的组合,主要用于简化开发 RESTful Web 服务。
@RestController
的作用
-
标识控制器类:
@RestController
用于标识一个类是 Spring MVC 的控制器类,处理 HTTP 请求并返回响应数据。 -
简化返回 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 负责统一管理对象创建和依赖关系,解决内存消耗问题。
自动填充公共字段¶
- 自定义注解 AutoFill ,用于标识需要进行公共字段自动填充的方法
- 自定义切面类 AutoFillAspect,统一拦截加入了 AutoFill 注解的方法,通过反射为公共字段赋值
- 在 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(){}
-
@Pointcut:这个注解用于定义一个切点表达式,它描述了哪些方法会被切面中的通知(advice)拦截。
-
"execution( com.sky.mapper..*(..))": -
execution
是切点表达式的关键词,用于匹配方法执行。 -* com.sky.mapper.*.*(..)
表示要匹配的目标方法:*
:表示匹配所有返回类型。com.sky.mapper.*.*
:表示匹配com.sky.mapper
包下的所有类的所有方法。(..)
:表示匹配任意参数的方法。
-
&&:逻辑运算符,表示需要同时满足前后的条件。
-
@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)
Created: February 24, 2025