自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(31)
  • 收藏
  • 关注

原创 RabbitMQ异步下单架构设计

没有 RabbitMQ,MySQL 任务太多,一损俱损不要说:“我用了 RabbitMQ 做异步。太浅。

2026-08-13 16:33:01 243

原创 Redis库存系统设计

它就是一个“开机自启动”方法,负责在应用上线前把准备工作做好。在库存同步里用它思路是对的,但要注意别让它干活太久,否则会影响应用上线速度。

2026-08-11 08:37:55 213

原创 完善订单生命周期+支付部分

封装”。文件封装了什么?解决了什么问题?枚举封装了“数字 -> 中文”的翻译规则代码内聚,状态自己管自己的解释权。封装了“实体 -> VO”的转换组装流程业务逻辑干净,Controller 只需一行调用,VO 自己搞定一切。最终效果现在,如果你想给订单加一个新状态(比如REFUNDING),你只需要改 OrderStatus枚举这一个地方。以后如果你想创建一个订单 VO,只需要写,永远不会漏掉statusName,时间格式也永远统一。这就是所谓的“高内聚、低耦合”

2026-08-07 11:22:32 322

原创 购物车模块v1

关于 entity的设计 必须包含主键生成策略自动或者雪花算法 直接用雪花就完了注意:雪花生成的 ID 是 19 位长整型(如),数据库的BIGINT字段足够存,MySQL 的 AUTO_INCREMENT 虽然设了但不会被用到。目前的 流程首先 数据库建表第二 创建entity(建立 Java 对象映射)第三 创建mapper第四 创建service接口第五 实现接口注意如果你用double存储0.1元,在计算机里它实际存的是。

2026-08-05 21:03:02 193

原创 订单基础模块 v1

包含:✅ 数据库设计✅ Order实体✅ OrderItem实体✅ 创建订单接口✅ 查询我的订单接口✅ 库存扣减✅ 订单状态设计完成后:可以实现:order订单主表表示:表示:为什么表名不用:?因为:order 是 MySQL 关键字。这里虽然加了反引号:可以运行。企业项目更推荐:避免冲突。CREATE TABLE orders ( id BIGINT PRIMARY KEY AUTO_INCREMENT, user_id BIGINT NO

2026-08-04 08:11:26 228

原创 一些零碎的知识5

很多新手第一反应:商品不用了:但是企业商城一般不会这么做。

2026-08-03 15:29:40 170

原创 一些零碎的知识4

只要数据,Jackson 就会自动插手。具体到你项目里,就这你写(Java 对象)→ 给前端(JSON) →。你写(前端传 JSON)→ 接成 Java 对象 →。你写(Java 对象)→ 存进 Redis(JSON) →。你写(Redis 返回 JSON)→ 拿成 Java 对象 →(你之前就是这一步翻的车)。发消息时把 Java 对象转 JSON,收消息时把 JSON 转 Java 对象,一样靠 Jackson。

2026-08-02 14:25:46 172

原创 redis部分原理理解(商品查询demo)

支柱对应代码/配置职责连接工厂提供通往 Redis 服务器的物理网线。序列化器保证存进去的是 JSON 文本,取出来的是 Java 对象。缓存旁路策略getProduct方法里的 4 步逻辑查缓存 → 没命中查库 → 回填缓存(真货存真货,空货存标记)→ 返回。你现在可以这样跟面试官吹牛“我通过自定义配置了 JSON 序列化,实现了可读性强的缓存存储。

2026-07-27 11:23:54 294

原创 jwt和springsecurity协同登录机制

首先 秘钥和过期时间存在配置文件 也就是!然后 JwtProperties.java 获取配置文件中的秘钥和过期时间通过注解是 Spring Boot 中的注解。jwt。第三步userId.subject()username.claim()打个比方:userId 是你的身份证号(唯一、用来识别你是谁),username 是你的名字(友好、方便显示)。实际上只用 userId 就够了,存 username 是为了后续可能直接展示、不需要再查库。三个部分用分隔。

2026-07-27 08:23:47 214

原创 一些杂碎的知识3

对象交给 Spring 之前,先要经过自己的“内部管道”,这个管道就是 FilterChain。接口,Tomcat 作为 Servlet 容器按照这个规范来识别和管理它。Servlet 规范规定:过滤器必须实现。Tomcat只认实现接口的是过滤器。交给 OrderService。这是企业开发非常重要的思想。因为 Spring 的。这个类符合过滤器规范。交给 Filter。

2026-07-24 21:44:28 218

原创 一些杂碎的知识2

Java 数据库连接规范。注意:它不是 MySQL 发明的。而是Java 官方(Oracle)制定的一套标准接口。为什么要制定标准?因为数据库有很多种:MySQLOraclePostgreSQLSQL ServerSQLite如果每个数据库连接方式都不一样,那 Java 开发者就太痛苦了。所有数据库都必须提供一个 JDBC Driver(驱动)。这样 Java 就不用关心你到底是什么数据库。Spring Boot 并没有发明连接数据库的方法。它只是帮我们把 JDBC 封装得非常简单。

2026-07-20 08:32:35 200

原创 一些杂碎的知识1

staticjava// ❌static属于类,所有枚举实例共享一份。SUCCESS赋值为 200,赋值为 201 时会把 200 覆盖掉,最后所有枚举的 code 都变成最后一个值。(去掉 static,每个实例独有一份)。staticjava} // ❌msg是实例字段(非 static),静态方法无法访问非静态字段。(去掉 static)。java// ❌ResultCode是类名,是实例方法,必须通过具体对象(如SUCCESS或参数resultCode)调用。(用参数名)或(用实例)。

2026-07-15 08:29:23 171

原创 苍穹外卖day14

现在进入redis学习目标让Ai帮帮你然后 关于一些基础知识例如:菜价:38涨到:40结束。如果是:这就是 Hash 存在的意义。Redis 放弃了"灵活",换来了"极致速度"。数据库:100 万条菜品。如果:数据库怎么办?甚至扫描很多数据。Redis:根本不允许这样。例如:dish:10086我立刻给你。

2026-07-12 22:31:37 216

原创 苍穹外卖day13

List<Long> ids 传入一个参数 里面包含多个需要删除的东西 spring 会自动分开。Mapper 从来都不是"返回数据库表",而是"返回 SQL 映射出来的 Java 对象"。加上这个 spring才能知道把前端传来的请求参数放进ids这个变量里。log.info("菜品删除{}", ids);"当前方法无法处理这个问题,把异常交给调用我的人。一对一的关系 可以使用 可以减少查找数据库的次数喵~此时只有一个id 当然需要了解这个id下的菜品状态。@ApiOperation("菜品删除")

2026-07-11 22:08:03 237

原创 苍穹外卖day12

浏览器 ↓ HTTP请求 ↓ Tomcat ↓ Spring MVC ↓ DishController.save() ↓ Service ↓ Mapper。看见@RequestBody 把json格式的数据封装成DTO 也就是dishdto 然后 @postmapping 表示只有post请求能访问。前端点击 保存按钮 根据注解@RequestMapping("/admin/dish")找到对应的控制层。说清楚一次新增菜品请求是如何从前端流转到 Service 的?@Api(tags="菜品相关接口")

2026-07-11 11:14:38 150

原创 苍穹外卖day11

java在 Java 里,只要遇到字符串,它就是把两段文本拼起来。".jpg"最终目的:保证这张图片存到阿里云时,名字是独一无二的,永远不会覆盖掉以前的老图片。这里接口测试要采用前后端联调 swagger不支持上传文件语法回忆:对象.方法(参数)关于报错的提示信息 可以直接写一个字符串 但是 更规范的写法是 引用一个常量文件上传接口结束开始新增菜品接口回忆过去内容。

2026-07-10 08:05:08 169

原创 苍穹外卖day10

阿里云oss 就是一个超级便宜的超大服务器帮你存东西的 存自己电脑的话 你关机了图片就显示不了了。data返回string(字符串) 返回图片绝对路径 前端进行图片回显(上传了直接显示出来)因为阿里云oss认钥匙 不能把钥匙藏在浏览器里 不安全 所以钥匙要藏在后端里。为什么这个接口只接收 file,不把“红烧肉”这个名字一起传上去?请求头 这里使用了这个参数值 代表图片是大文件 必须用这个。文件上传是一个通用接口 不止菜品 什么图片上传都调用这个。也就是为什么 图片上传和文字内容上传要分开?

2026-07-09 08:12:15 192

原创 理论知识学习部分

接口不只是“规范”,更是为了解耦和支撑 Spring 底层机制。没有接口,Controller 就和具体实现绑死了,事务也加不上。

2026-06-11 19:46:20 153

原创 苍穹外卖day9

通过aop面向切面编程 也就是定义一个切面类 统一拦截加了注解的方法 通过反射为公共字段赋值。在具体的注解里面指定一个属性 我们当前数据库操作的类型 (可以通过枚举的方式来指定)也就是 写一个通知方法 传一个参数 也就是连接点 获取 被拦截方法的信息。枚举 可以标识当前操作的类型 因为不同的操作 最终操作的字段是不一样的。主要的逻辑都在这里面 统一拦截加入了AutoFill注解的方法。这个手段也就是 定义注解 为mapper的方法加入注解。加入注解后就表示当前的方法需要被拦截 需要为公共字段赋值。

2026-06-11 19:45:46 242

原创 苍穹外卖day8

这类注解没有可以依附的目标,IDEA会暂时报错,等你把方法声明补全,错误就会立即消失。直接在页面上填参数,点“发送”,就能看到后端返回的 JSON 数据。不需要 Postman,不需要前端页面,就能测试你的接口能不能用。你不用装任何软件,只要项目启动成功,打开浏览器访问。,就能看到一个网页,上面列出了你写过的所有接口。列出所有接口(新增员工、分页查询……点开接口,能看到需要传什么参数。

2026-06-07 12:45:19 199

原创 苍穹外卖day7

后端返回 result+pageresult 里面包含 "id": 0, "type": 0, "name": "string", "sort": 0, "status": 0, "createTime": "string", "updateTime": "string", "createUser": 0, "updateUser": 0 这些参数+result。name page pagesize type 请求体json(错误的 是直接拼接在url后面)打包成DTO进行处理。

2026-05-31 15:25:10 226

原创 苍穹外卖day6

把这段敲进去,然后继续写后面几个接口。导入分类模块功能代码。

2026-05-27 13:20:15 20

原创 苍穹外卖day5

注意:返回密码或者和密码有关的操作都要做好脱敏。

2026-05-25 21:06:08 16

原创 苍穹外卖day4

编辑员工功能的开发依旧先分析需求来设计接口需求 我的猜想:新增员工 删除员工 员工禁用与启用 修改员工信息 查找员工实际 需求分析:点击修改按钮 页面跳转到对应的修改页面 根据实际需要修改信息 点击保存按钮进行保存 完成需要几个接口?教学:接口是什么?以及要几个接口?回答:学习 什么是回显?回答:也就是 这个功能需要两个接口 首先 页面上需要显示员工的旧信息好的 现在自己试试设计这一个接口:1.请求方式 get(只是返回数据不修改)

2026-05-24 20:15:19 324

原创 苍穹外卖day3

PostMapping("/status{status}") 这里要带上路径参数 注解@PathVariable 用来获取这个参数。如果不封装dto的话 路径参数需要加上注解@PathVariable 就是url末尾的那一段 通过地址栏传递的就不用。log.info("员工状态切换,参数为:{},{}",status,id);Service 层的作用就是把所有动态的可能,都转成 Mapper 能理解的固定格式——既然是动态的 那么编写的mapper层方法的参数 不适宜使用id和status。

2026-05-24 19:08:20 27

原创 苍穹外卖day2

员工分页查询1.需求分析设计接口查询操作 get请求接口需要提交的参数有3页码每页记录数员工姓名(通过姓名查询)希望后端返回什么数据总记录数数据集合总结一下就是单表的数据查询操作代码开发:1.依据接口设计对应的DTO后端分页查询 返回给前端的统一封装成PageResult对象通过查看api文档得知 不是json格式的 三个参数首先把参数通过DTO进行封装也就是要先有DTO 不要忘记@Date。

2026-05-22 15:33:18 382

原创 苍穹外卖day1

java专业名词接口(Interface),它只定义方法签名,不写具体实现。大白话:接口就是一份合同。它规定:“我做菜必须叫save,用料必须是但具体怎么做菜,合同不管Impl 是 implements 的缩写,翻译过来就是“实现类”或者“具体干活的人”

2026-05-21 12:45:17 365

原创 2026.5.19java学习

练习题。

2026-05-19 17:20:19 401

原创 2026.5.19java学习记录

面向对象类:public class 类名{类属性:访问修饰符public(任何类都能访问)和默认(default)其他修饰符类方法:静态 不能直接访问非静态方法非静态构造方法封装:隐藏类内部实现的细节 通过公共方法(getter和stter)提供受控的访问可以提高安全性纠错1.变量不能在方法内申明为public或private 方法内部的变量只能是局部变量 不能使用访问修饰符2.在main方法中声明的变量是,只能在main方法内部使用4.- 对!

2026-05-19 16:22:08 294

原创 2026.5.17 java2

public static void main(String[] args){}(这是主方法)int 中括号 变量名=花括号{“”,“”};一切都是变量之间的操作 所以使用数据类型 比较 是与否所以是boolean。string类 的变量说明是大写开头说明是引用类型 有自己的方法。replace(单引号单个字符双引号子字符串)第一次出现的位置和最后一次出现的位置。isBlank在java8里没有实现。只能访问从索引0到长度减一的长度。不能使用==(比较的是地址)替换单个字符与替换子字符串。

2026-05-18 20:43:16 40

原创 学习记录.2026.5.17 java

相加会大于Int类型 直接输出int会溢出 加法完成之后输出的时候已经溢出再复制给long 那还是会溢出 加之前先转换就好。这是 Java 的增强 for 循环(也称 for-each 循环),专门用于遍历数组或集合。1.放大转换(隐式转换) 自动进行 将小类型转换为大的类型 不会精度丢失。手写 直接转换会报错 前面加括号 如果后面是算式 要加括号不然只转头一个。方法(比如main方法)外面只能写:变量定义、方法定义。语法:目标类型 变量 = (目标类型)原值;意思就是c=c+3;

2026-05-18 17:56:44 359

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除