news 2026/9/30 9:14:43

SpringBoot+Vue日用品仓储管理系统毕设完整设计与实现解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SpringBoot+Vue日用品仓储管理系统毕设完整设计与实现解析

每个做毕设的同学心里都清楚:选对题目等于成功一半。日用品仓储管理系统这个方向,属于典型的管理信息系统类题目,业务逻辑清晰、技术栈主流、功能可扩展性强,既不会像“电商秒杀”那样把并发复杂度拉满,也不会像“图书管理”那样显得过于基础。我前后经手过不少这类项目,也帮人看过几十份仓储类的毕设源码,说实话,SpringBoot+Vue这套组合在这个题目上确实是最稳的选择。

这篇文章不打算聊那些假大空的“项目亮点”,就把一个能顺利过查重、过答辩、能跑起来的日用品仓储管理系统,从技术选型到前后端实现,从数据库设计到论文框架,再到部署时最容易踩的坑,按我实际做项目的顺序完整拆一遍。无论你手里拿到的源码是完整可跑的,还是残缺需要补的,这篇文章都能帮你少走很多弯路。

1. 项目整体设计与技术选型思路

1.1 为什么是SpringBoot + Vue,而不是别的主流组合

先说结论:这个组合是当前毕设市场里综合性价比最高的方案,没有之一。

后端选SpringBoot,核心原因是它的“约定大于配置”大大降低了开发门槛。你不需要像SSH时代那样写一大堆XML配置文件,也不需要纠结Tomcat怎么部署,一个spring-boot-starter-web依赖拉进来,内嵌Tomcat帮你把Web环境全包了。对于毕设这种短周期项目,SpringBoot能把后端开发时间压缩到传统SSM的一半甚至更少。

有人会问,那用Python的Django或Flask不行吗?行,但有个很现实的问题:国内大部分高校的软件工程、计算机科学专业的课程体系里,Java是主语言,SpringBoot相关的课程和资料最多,答辩时老师问起来你也更容易答得上。Python做后端虽然轻巧,但只要你稍微接触过企业开发面试,就会知道Java后端岗位的需求量仍然巨大,用SpringBoot做毕设对找工作简历也是加分项。

前端选Vue的理由同样实在。Vue的学习曲线比React平缓太多,模板语法接近原生HTML,一个没怎么写过前端的人,看两天文档就能上手写页面。配合Element UI或者Element Plus的现成组件,表格、表单、弹窗、分页这些管理系统的标配功能基本就是拖组件,不用自己造轮子。Vue在国内中小企业的普及率极高,这一点对答辩时阐述“技术选型理由”非常有帮助。

1.2 核心功能模块拆解:一个仓储系统该有哪些东西

仓储管理系统的核心不是“登录注册”,而是围绕“商品”和“库存”的生命周期管理。我见过很多同学拿到的源码,功能看着一大堆,打开一看全是摆设,真正的核心链路却漏洞百出。一套合格的日用品仓储管理系统,功能维度应该这么拆:

  • 系统管理:用户管理、角色管理、菜单管理,这是管理系统的标配三件套。用RBAC(基于角色的访问控制)模型,一个用户挂多个角色,一个角色挂多个菜单/权限点。
  • 商品管理:日用品信息的CRUD,包括商品分类、商品名称、规格型号、单位、条形码、预警阈值。这里有一个关键点:商品表和库存表要分开。很多不合格的项目把商品数量直接存在商品表里,看起来省事,实际上查询、统计、并发更新全都会出问题。
  • 入库管理:采购入库、退货入库、其他入库。入库单审核后要自动更新对应商品的库存数量,同时写入库存流水。
  • 出库管理:销售出库、领用出库、报损出库。出库的核心逻辑是“扣减库存前必须先校验库存是否充足,不足则拦截”。
  • 库存管理:库存查询、库存预警、库存盘点。库存预警是仓储系统的灵魂,当商品当前库存低于预警阈值时,系统要能主动提醒。
  • 统计报表:用ECharts做柱状图和饼图,展示入库出库趋势、库存分类占比、热销商品排行。这块是答辩时的视觉亮点,不能缺。

1.3 数据库设计的几个核心原则

数据库是这个项目的命脉,表结构设计得不好,后面写多少代码都白搭。我建议核心表不要低于10张:

  • 用户表、角色表、菜单表、用户角色关联表、角色菜单关联表(RBAC五件套)
  • 商品分类表、商品表
  • 库存表(商品ID唯一)、库存流水表
  • 入库单表、入库单明细表
  • 出库单表、出库单明细表

几个容易犯错的点,我重点说一下:

商品ID关联库存表时,库存表应该用product_id做唯一索引,而不是允许多条库存记录反复堆叠。这样做的目的是保证“一个商品只有一条当前库存记录”,查询和更新都走单行操作,逻辑清晰,性能也好。

库存流水表是很多源码里没有的,但对答辩和后续扩展非常关键。每一次库存变动都写一条流水,记录变动类型、变动数量、变动前后的库存值、操作人、操作时间。这条流水既能支撑报表统计,也能在老师追问“库存数据对不上怎么办”的时候,拿出对账方案。

日用品有一个特点:商品数量多、单值低、批次管理要求不高。所以不建议把批次管理做得太重,入库时只记录入库时间等基础信息,出库采用默认的先进先出逻辑即可。如果强行上批次+效期管理,数据库和业务代码的复杂度都会翻倍,对毕设来说是过度设计。

2. 后端核心设计与实操实现

2.1 项目分层结构与包命名规范

后端代码的组织方式直接决定了代码审查时老师对你的第一印象。我建议采用经典的四层结构:Controller、Service、Mapper、Entity,外加一个config包和common包。

com.example.warehouse ├── config // 配置类,如MyBatisPlus配置、跨域配置、JWT拦截器配置 ├── controller // 接收前端请求,不写业务逻辑 ├── service // 业务逻辑层,核心逻辑都在这里 │ └── impl ├── mapper // 数据访问层,继承BaseMapper ├── entity // 数据库实体类 ├── dto // 数据传输对象,接收前端参数 ├── vo // 视图对象,返回给前端的结构化数据 ├── common // 统一返回结果、异常处理、常量 └── utils // JWT工具类等

Controller层只做三件事:接收参数、调用Service、返回结果。业务逻辑一律放在Service层,这是答辩时老师一定会重点查看的代码组织方式。如果看到Controller里塞了一大堆if/else和SQL拼接,印象分直接掉一半。

统一返回结果类Result<T>也是必须的,格式固定为{code, message, data}。code用200表示成功,500表示失败,401表示未登录或token失效。

2.2 JWT登录鉴权:不用Session的原因与实现细节

仓储管理系统属于企业内部管理工具,登录鉴权必须做。传统方式用Session+Cookie,简单但有两个痛点:前后端分离后跨域携带Cookie很麻烦,而且Session在集群环境下不好共享。用JWT(JSON Web Token)可以一次性解决这两个问题。

JWT的本质是把用户身份信息加密成一个token字符串,后端签发后发给前端,前端每次请求都带上这个token,后端验签后就能确认身份。流程如下:

登录成功 -> 后端根据用户ID、用户名、角色生成token -> 前端存入localStorage -> 每次请求在Header里带Authorization: Bearer 你的token-> 后端拦截器验签通过后放行。

JWT工具有两个核心方法,一个是生成token,一个是解析token:

public String generateToken(Long userId, String username, List<String> roles) { Map<String, Object> claims = new HashMap<>(); claims.put("userId", userId); claims.put("username", username); claims.put("roles", roles); return Jwts.builder() .setClaims(claims) .setSubject(username) .setIssuedAt(new Date()) .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 24)) // 24小时过期 .signWith(SignatureAlgorithm.HS256, SECRET_KEY) .compact(); } public Claims parseToken(String token) { return Jwts.parser() .setSigningKey(SECRET_KEY) .parseClaimsJws(token) .getBody(); }

写拦截器的时候有一个坑要提醒:拦截器只能拦截/**,然后放行登录接口、退出登录接口,以及静态资源路径。前端访问不到数据接口,第一件事就是检查拦截器是不是把所有路径都拦了。

密码存储不要用明文,至少用MD5加盐或者BCrypt。BCrypt是Spring Security自带的加密工具,每次加密结果都不同,安全性比MD5高一个量级。很多毕设论文里只写“密码经过MD5加密存储”,答辩时老师一般不会深究,但你能主动说出BCrypt的优势,是个加分项。

2.3 出入库核心业务:库存更新的原子性

出入库是整个系统业务逻辑最密集的地方,也是老师最喜欢追问的地方。先看入库的核心流程:

前端提交入库单(包含入库单信息和多条明细)-> 后端接收 -> 校验商品ID是否存在 -> 循环处理每条明细 -> 更新库存表 -> 写入库存流水 -> 保存入库单主表和明细表 -> 返回结果。

这里最大的技术难点是“一次请求里必须同时更新多张表”,任何一个环节失败都要整体回滚。实现方案就是在Service方法上加上@Transactional事务注解,让Spring帮我们管理事务边界。

@Transactional(rollbackFor = Exception.class) public Long createInboundOrder(InboundOrderDTO dto) { // 1. 保存入库单主表 // 2. 调用Mapper查出商品信息,校验是否存在 // 3. 更新库存表:库存 = 库存 + 入库数量 // 4. 写入库存流水表 // 5. 保存入库单明细表 }

出库逻辑稍微复杂一点。先查出当前库存,判断当前库存 >= 出库数量,不满足则抛出异常,提示“库存不足”。这里有一个关键点:判断和更新要放在同一个事务里,避免“先查到库存够,但下单过程中被另一个请求扣减”的并发问题。毕设项目虽然不一定有高并发压力,但代码逻辑要体现这个意识。

MyBatis-Plus在库存更新这里有个好用的小方法,直接写在Mapper接口里,用UpdateWrapper做原子更新:

int update = stockMapper.update(null, new UpdateWrapper<Stock>() .eq("product_id", productId) .ge("quantity", outQuantity) // 条件:当前库存 >= 出库数量 .setSql("quantity = quantity - " + outQuantity)); if (update == 0) { throw new BusinessException("库存不足,出库失败"); }

把库存扣减写成一条带条件的UPDATE语句,由数据库保证原子性,这是实战项目里常用的做法,比“先查再改”更可靠。写论文的时候可以把这个点作为“系统设计亮点”之一,答辩时老师会认可这种容错设计。

2.4 报表统计的SQL写法和接口设计

统计报表在毕设里属于锦上添花的模块,但不可或缺。通常做三块:近30天出入库趋势折线图、库存分类占比饼图、商品库存排行柱状图。

要用到Group By和日期函数,例如近7天入库趋势:

<select id="getInboundTrend" resultType="map"> SELECT DATE(create_time) AS date, SUM(quantity) AS total FROM inbound_detail WHERE DATE(create_time) BETWEEN #{startDate} AND #{endDate} GROUP BY DATE(create_time) </select>

前端拿到这种列表数据,填充进ECharts的series就行。这里给自己留个心眼:后端返回的数据格式要跟前端图表需要的数据格式对齐,比如饼图需要[{name: "生活用品", value: 120}]这种结构,直接在SQL里把name和value取出来,前端几乎零处理就能渲染。很多同学在这一步反复改前端,就是因为后端给的字段对不上,来回联调浪费时间。

3. 前端Vue核心模块与前后端联调细节

3.1 Vue项目的初始化和路由设计

前端工程创建用的是Vue CLI,命令是vue create warehouse-web,组件库我用的是Element UI(如果你的Vue版本是3.x,就用Element Plus)。前端目录结构按功能拆:

src ├── api // 接口请求模块 ├── assets // 静态资源 ├── components // 公共组件 ├── router // 路由配置 ├── store // Vuex状态管理 ├── views // 页面视图组件 └── utils // axios封装等工具

路由设计遵循“页面即路由”的原则:

const routes = [ { path: '/login', component: Login, hidden: true }, { path: '/', component: Layout, redirect: '/dashboard', children: [ { path: 'dashboard', name: '首页', component: Dashboard, meta: { title: '首页' } }, { path: 'product', name: '商品管理', component: ProductList, meta: { title: '商品管理' } }, { path: 'inbound', name: '入库管理', component: InboundOrder, meta: { title: '入库管理' } }, { path: 'outbound', name: '出库管理', component: OutboundOrder, meta: { title: '出库管理' } }, { path: 'stock', name: '库存管理', component: StockList, meta: { title: '库存管理' } }, { path: 'report', name: '统计报表', component: Report, meta: { title: '统计报表' } } ] } ]

路由加meta.title的目的是配合面包屑导航和页面标题显示。菜单权限如果要做,思路是:用户登录后,后端返回该用户有权限的菜单树,前端动态生成侧边栏菜单。这个功能做好以后,在答辩时展示效果是很加分的,因为直观体现了RBAC权限模型。

3.2 Axios封装:统一处理token和错误码

Axios封装是所有前端模块的基础。项目里所有请求都应该走同一个入口,不封装的话,每个页面都要重复写一遍请求头和错误处理,代码丑陋且容易出错。常规封装方案:

// utils/request.js import axios from 'axios' import { Message } from 'element-ui' import router from '@/router' const service = axios.create({ baseURL: '/api', timeout: 10000 }) // 请求拦截器:自动带上token service.interceptors.request.use(config => { const token = localStorage.getItem('token') if (token) { config.headers['Authorization'] = `Bearer ${token}` } return config }) // 响应拦截器:统一处理返回码 service.interceptors.response.use( response => { const res = response.data if (res.code === 200) { return res } else { Message.error(res.message || '系统错误') return Promise.reject(new Error(res.message)) } }, error => { if (error.response && error.response.status === 401) { Message.error('登录状态已过期,请重新登录') localStorage.removeItem('token') router.push('/login') } else { Message.error('网络请求失败') } return Promise.reject(error) } )

两个细节值得注意:

第一,baseURL设置为/api,前端开发时通过Vue CLI的proxy代理把请求转发到后端8080端口,避免开发环境跨域问题。生产部署时用Nginx把/api反向代理到后端服务即可。

第二,401响应拦截跳转登录页。这个功能看似简单,实际上把你的系统从“报错让用户手动处理”升级为“自动引导用户重新登录”,整体体验是完全不同的档次。

3.3 库存预警、出入库单据这些关键页面怎么写

商品列表页是最典型的CRUD页面,用到Element UI的el-table,分页用el-pagination。前端提交查询条件时,通过params对象传给后端,后端用MyBatis-Plus的分页插件查询并返回总条数。这里要确保后端返回的分页数据结构跟前端表格的data属性对得上,否则表格是空的。

库存预警页面是体现系统业务价值的功能。后端提供一个专门的接口,按预警阈值过滤库存数据,前端用el-tag把“正常”和“预警”状态用不同颜色展示出来,低于阈值的行标红。这样一个页面,既不需要复杂逻辑,又能直观表达业务判断力。

出入库单据页面稍微复杂一点,涉及主表和明细表的联动。前端做法是:主表单放单据基本信息(供应商/经办人/备注),明细用el-table动态添加商品行,每行包含商品选择器、数量、单价、金额。提交前做一次校验:至少有一行明细,每行商品不能为空、数量必须大于0。后端的事务逻辑保证整单提交,前端也要在体验上先拦截掉无效数据,前后端双重校验是专业项目的基本素养。

4. 论文怎么写才能顺利过查重过答辩

4.1 论文结构框架:标准七章式

毕设论文不是开发文档,它的核心逻辑是:“提出问题 -> 分析问题 -> 设计解决方案 -> 验证方案”。大部分高校要求的框架是七章式,我建议这样安排:

第一章绪论:研究背景与意义。日用品仓储领域现在面临的痛点是信息孤岛严重、人工记录易出错、库存数据不透明,这些都可以写进背景里。国内外研究现状需要引用文献,这部分注意不要照抄,用自己的话转述。

第二章相关技术介绍:SpringBoot、Vue、MySQL。这里要写透“为什么选这些技术”,不要只是罗列概念。技术选型理由写清楚了,老师才会认为你有独立思考能力。

第三章系统需求分析:功能性需求按功能模块写,非功能性需求写性能、安全、易用性。画出用例图,这是必配的。

第四章系统设计:架构设计、功能模块设计、数据库设计。数据库设计部分要贴核心表的建表SQL或者表结构描述,字段名、类型、约束都要写清楚,这是论文里最容易挑错的地方。

第五章系统实现:按模块展示核心代码和截图。代码要精简,不要整段贴几百行,贴关键业务逻辑片段即可,配合文字说明。

第六章系统测试:功能测试用例表和结果、性能测试简述。测试用例表要有:用例编号、测试模块、操作步骤、预期结果、实际结果、是否通过,这个表格是老师必看的。

第七章总结与展望:写你做了什么、有什么不足、未来可以怎么扩展。注意不要写空话,比如“未来可以引入人工智能”这种就是典型的空话,可以写“后续可以增加批次管理和效期预警功能”,具体才可信。

4.2 测试章节的干货写法

测试部分最容易被同学敷衍,但对最终成绩影响不小。功能测试用例至少写10条以上,覆盖登录、用户管理、商品CRUD、入库、出库、库存预警、报表统计。每一条用例都要格式规范。

性能测试如果时间紧,用JMeter跑一下登录接口和商品列表接口,设置100个并发线程,统计响应时间和错误率,截图放进论文。不要为了追求数据好看去压后台服务,真实数据即可。

4.3 答辩现场:老师最可能问的五个问题

答辩的紧张感主要来自于未知。我把仓储管理系统里老师最高频的追问整理一下,你可以提前准备:

第一个问题:“数据库表为什么这样设计?”——回答思路:围绕业务场景说,核心是一对多关系拆分和库存表独立设计,理由是好维护、好扩展、支持统计。

第二个问题:“库存扣减怎么保证数据一致?”——回答思路:事务、条件更新、流水记录三件套。先说出@Transactional,再说UPDATE stock SET quantity = quantity - x WHERE product_id = ? AND quantity >= x,最后说每次变动都写流水。

第三个问题:“你的系统怎么保证安全?”——回答思路:JWT鉴权拦截未登录请求,密码BCrypt加密存储,前端对输入做校验防止恶意数据,后端再次校验防止绕过前端。

第四个问题:“如果库存数据错了怎么排查?”——回答思路:查库存流水表,按时间序列重建每次出入库变动,对比系统当前库存和实际盘点结果,定位异常操作。

第五个问题:“你这个系统跟市面上已有的仓储软件有什么区别?”——回答思路:不要硬吹功能,诚实说出这是课程设计和工程实践的产物,业务上聚焦日用品场景,技术架构上前后端分离、代码可维护性强。

5. 部署步骤与踩坑实录

5.1 本地部署三步走

我把部署步骤收敛成三步,照着做就能把项目跑起来。

第一步,导入数据库。用Navicat或者DataGrip连接本地MySQL,新建数据库,然后导入项目里的warehouse.sql。导入完成后重点检查三件事:表是否齐全、是否有初始管理员账号数据、商品表和库存表是否有测试数据。如果导入报错,大概率是数据库版本或者编码问题,用UTF-8重新导入一次基本能解决。

第二步,启动后端。用IDEA打开后端项目,等Maven下载完依赖。修改application.yml里的数据库账号密码,端口号确认是8080。直接运行主类。看到“Started Application in x seconds”就说明启动成功。启动失败最常见的原因就是端口被占用和数据库连不上,用命令行查一下8848端口或者改掉默认端口都行。

第三步,启动前端。需要提前装好Node.js,然后用npm install安装依赖。这一步是真正的大坑,国内网络拉取npm包经常失败。解决办法是配淘宝镜像:

npm config set registry https://registry.npmmirror.com npm install npm run serve

启动成功后浏览器访问localhost:8081,能看到登录页说明前后端联调成功。如果接口报404,检查后端是否启动成功以及前端proxy配置是否正确;如果报500,请检查数据库表结构和连接配置;如果报401,请先到数据库里确认初始密码是否被BCrypt加密过。

5.2 反转和实践里最常翻车的细节

我自己带人部署这个项目时,发现几个翻车率极高的细节,提前给你们打上预防针:

第一,数据库版本不兼容。项目如果用了MySQL 5.7的某些特性,在MySQL 8.0上可能运行异常,比如时区问题。解决办法是在JDBC连接URL里加上serverTimezone=Asia/Shanghai。

第二,后端端口和前端代理端口不一致。这是很多同学跑不通联调的终极原因:后端配的是8080,前端proxy配置写的却是9090。出现这种问题,先别乱改代码,打开两个配置文件逐行核对。

第三,Element Plus和Vue 2混用。拿到别人的源码,第一件事就是看package.json里的Vue版本。Vue 2只能用Element UI,Vue 3只能用Element Plus,混用的话页面直接白屏。这个错误发生的频率远超你的想象。

第四,npm install卡住不动。不管换什么源,只要node_modules清理不干净就会出怪问题。建议遇到依赖问题,先执行rm -rf node_modules package-lock.json,再重新安装,成功率很高。

5.3 二次开发的两个小建议

如果你拿到手的源码需要二次开发,我建议优先从这两个方向下手:一是给商品模块加一个条形码录入和查询功能,代码量不大,但日用品仓储确实需要这个能力,打印条形码标签后可以用扫码枪直接录入;二是增加导入导出的Excel能力,用EasyExcel工具类,把商品列表和库存列表导出成Excel文件。这两个功能一旦做好,答辩时的演示效果立刻上升一个档次,因为它是真正贴合企业实际场景的功能,不是那种“看起来有但没人用”的摆设页面。

补充一个我个人常用的判断标准:拿到任何一套仓储系统源码,先别急着跑,先打开数据库表结构看三张核心表——商品表、库存表、流水表。这三张表设计得合理,系统底子在;这三张表混乱,界面再好看也救不回来。用这个标准去评估你手上的项目源码,比盲改代码高效得多。

说回到部署和交付这回事,很多同学以为项目能跑起来就万事大吉了,实际上答辩老师更在意的是你对自己项目的理解深度。你如果能讲清楚为什么用JWT而不是Session,为什么库存表要独立出来,为什么出库要用条件更新保证原子性,这套系统的价值就已经超越了大多数毕设。把这些内容提前消化,答辩的时候你自然会显得游刃有余。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/30 9:14:39

113个JS特效动画合集:从Canvas粒子到页面动效的实战指南

收集JS特效动画这件事&#xff0c;我干了至少有五年。一开始只是想给自己维护的组件库配一套统一的动效选集&#xff0c;后来发现每次做活动页、官网、数据大屏、产品落地页&#xff0c;都会遇到几乎同样的诉求——需要一个“不落俗套”的入场动画、一个能跟着数据变的图表动效…

作者头像 李华
网站建设 2026/9/30 9:14:25

C++享元模式高级实践:内存优化与对象共享的工程细节

写C的人&#xff0c;十有八九都在某个版本的内存优化项目里见过“对象太多、内存爆炸”的报警&#xff0c;或者为了把一坨重复数据反复拷贝而恼火。享元模式&#xff08;Flyweight Pattern&#xff09;就是为这类问题准备的&#xff1a;把大量细粒度对象里可以共用的部分抽出来…

作者头像 李华
网站建设 2026/9/30 9:14:15

风-水电联合优化运行分析及Matlab实现全攻略

做EI论文复现项目&#xff0c;尤其是“风-水电联合优化运行分析”这种题目&#xff0c;最容易踩的坑就是拿到标题就急着找代码、跑仿真。我去年底刚给一个课题组做完类似的复现&#xff0c;用Matlab从建模到出图整整折腾了两周多。这期间踩过初始化陷阱、目标函数权重设计不合理…

作者头像 李华
网站建设 2026/9/30 9:13:12

AnythingLLM本地部署实战:从Docker到Ollama搭建私有知识库

做AI应用折腾得多了&#xff0c;你会发现一个特别尴尬的卡点&#xff1a;模型越来越强&#xff0c;但真想把模型接到自己的业务数据上&#xff0c;大多数人第一步就被挡在门外。公司内部文档不敢往云端传&#xff0c;个人笔记散落各处&#xff0c;本地跑个Ollama能聊几句却连上…

作者头像 李华
网站建设 2026/9/30 9:10:47

上篇手写多Agent写了500行?Spring AI Alibaba官方就有,几行搞定

上一篇我们手写了一套多Agent协作框架&#xff1a;定义AgentRole、写任务分发器、自己起线程池做并行、手写executeWithFeedback做反馈循环&#xff0c;前前后后500多行。发出去之后&#xff0c;评论区有个同学说得很直接&#xff1a;“这不就是自己造了个迷你版Spring AI Alib…

作者头像 李华
网站建设 2026/9/30 9:09:05

LeetCode 101 对称二叉树:递归与迭代的完整解题指南

对称二叉树这道题&#xff0c;我在LeetCode上刷了不下三遍&#xff0c;每次以为彻底搞懂了&#xff0c;过一阵子再看代码&#xff0c;又会发现一个新的理解角度。101这个题号在二叉树专题里属于那种"看起来人畜无害&#xff0c;实际上很考验递归思维"的题目&#xff…

作者头像 李华