SSM+Vue酒店管理系统毕设全解析:从状态机设计到并发控制实战
看到“2026毕设ssmvue酒店管理系统论文程序”这个题目很多同学的第一反应是这不就是一个增删改查吗前端Vue画页面后端SSM写接口再拼一份论文完事。但实际带过的毕设小组里因为这个题翻车的人真不少——房间状态无故错乱、同一间房被两个订单同时占用、退房金额和平台对账对不上更扎心的是答辩时被一句“你如何处理多人同时预订同一间房”问得说不出话。这个题目能成为热门毕设选题恰恰因为它表面是管理系统内核却牵涉状态机设计、权限模型、事务边界和并发控制属于“好上手、做精难”的典型。这篇文章我会按自己带项目的经验把这个题目从选题拆解、数据表设计、后端难点、前端联调到论文和答辩的完整链路过一遍。适合正在纠结选型的人也适合已经开工但卡在某个细节的人如果你打算把这套项目包装成面试项目后半段的“亮点提炼”同样有用。1. 选题拆解为什么“SSMVue酒店管理系统”是经典样本也是高危题目1.1 表面是管理系统实质是流程状态机很多同学做系统喜欢用“增删改查”来理解需求做酒店管理系统最容易死在这一步。酒店管理的核心不是用户表、订单表的简单维护而是“房间状态”和“订单状态”之间一环扣一环的状态迁移。以最基本的预订场景为例房间状态至少要有空闲、已预订、已入住、脏房、维修这几种。订单状态也要有已提交、待支付、已确认、已入住、已退房、已取消、已完成。同一个房间从“空闲”到“脏房”再到“空闲”的路程中间经过了预订和入住两个业务动作任何一个环节漏掉状态校验数据就会乱。这里建议所有同学在写第一行后端代码之前先画一张状态流转表比如“空闲 - 已预订 - 已入住 - 脏房 - 空闲”再标出每一个状态转换对应哪个接口、由哪个角色触发。这样既能指导后端代码也方便后续论文里画状态图推荐直接放在需求分析章节。1.2 SSM Vue 的选型逻辑与答辩话术很多老师看到“SSM”第一反应是“这技术是不是旧了”但这也恰恰是SSM项目的答辩红利知识点足够底层学生能讲透三层架构。Spring负责IoC和AOPSpringMVC负责请求路由和参数绑定MyBatis负责SQL映射与数据访问Vue负责前端交互和前后端分离。这个链条每一层都能被提问也都能被回答。如果被问到“为什么不直接用SpringBoot”合理的回答方式是SpringBoot确实简化了配置但SSM项目能更清楚地看到Spring容器如何管理对象、拦截器如何作用在DispatcherServlet之前、MyBatis如何把Mapper接口和XML绑定在一起。实际开发中也可以采用SpringBoot整合SpringMVC和MyBatis把“SSM的技术本质”和“SpringBoot的工程便利”都展示出来。1.3 开工前必须确认的三类边界第一是业务边界。酒店管理系统可以做得极简也可以做成带餐饮、会议室、会员积分、优惠券的大型系统。毕设正常范围建议做到房型管理、房间管理、预订、入住、退房、订单管理、会员管理、报表统计、公告管理最多再加一个“操作日志”。千万不要一上来就铺开十几个功能模块。第二是用户边界。系统至少要有三种角色管理员、前台员工、网站会员。会员只能在前台看到房型和预订前台员工能处理入住退房管理员能看到全部数据和报表。如果所有用户共用同一套权限答辩时“角色设计”环节就拿不出手。第三是交付边界。确认是只需要前后端代码加SQL脚本还是需要部署在云服务器上现场演示论文是需要完整八章结构还只是简要说明。这三件事不定清楚中期检查阶段会返工到怀疑人生。2. 系统骨架从房态与订单流转推导模块划分和数据表2.1 核心业务闭环预订、入住、退房、换房一个能自圆其说的酒店管理系统至少要把下面这条业务链路完整跑通会员在前台注册登录浏览房型选择房间填写入住和离店日期提交订单系统校验房间状态后生成待支付订单模拟支付成功后房间状态变成“已预订”前台员工办理入住房间变成“已入住”退房时系统计算房费、生成账单房间变成“脏房”保洁员或管理员把状态改成“空闲”。除了主链路还要处理两个常见的分支取消订单和换房。取消订单时必须恢复房间状态且要判断订单当前处于哪个阶段——已入住订单不能直接取消只能走“退房”流程。换房则建议拆成“原房间退房 新房间入住”两个操作不要试图做一个“原子换房”接口否则状态回滚会让你来回调试。2.2 数据库表设计最少要落这几张关键表很多同学一上来就做订单表结果后期发现缺字段重建了三次。我按做过的项目经验建议至少设计下面这一批表用户表、角色表、用户角色关联表、房型表、房间表、订单表、订单明细表、会员表、会员等级表、操作日志表、公告表。用表格整理一下核心表职责表名主要职责关键字段t_user后台用户管理员/前台员工id, username, password, real_name, statust_role角色id, role_code, role_namet_room_type房型id, type_name, price, bed_type, area, image_urlt_room具体房间id, room_no, room_type_id, floor, statust_order订单主表id, order_no, room_id, user_id, guest_name, check_in_date, check_out_date, total_amount, order_status, pay_statust_order_item订单明细/消费项目id, order_id, item_name, item_price, item_countt_member网站会员id, username, password, phone, points, levelt_operation_log操作日志id, user_id, action, target_type, target_id, create_time订单表是核心中的核心有几个字段容易漏order_no唯一订单号、price_snapshot房价快照、pay_status支付状态、cancel_reason取消原因。房价快照尤其重要因为房型价格会调整历史订单必须保留下单那一刻的价格不能每次退房都取房型表当前价格计算这样金额很容易对不上。房间表同样要注意room_no必须加唯一约束避免重复录入status建议用数字小整型存放而不是字符串比如0空闲、1已预订、2已入住、3脏房、4维修写代码时用常量类统一管理。2.3 接口约定与统一返回结构前后端分离项目里接口约定不统一是最浪费时间的隐形问题。后端返回格式建议全部统一成三层结构{ code: 200, message: success, data: {} }code表示业务状态码200是成功400是参数错误401是未登录或Token过期500是服务器异常。message给前端提示语data是真正的业务数据。分页接口可以设计成返回带total和records的结构建议提前定义好不要一个接口一种风格。接口路径建议按资源命名尽量用REST风格比如POST /api/order/reserve表示预订、PUT /api/order/checkin表示入住、PUT /api/order/checkout表示退房。虽然很多毕设并不严格要求REST但接口语义清晰能减轻前后端联调成本。3. 后端实现真正花时间的三个硬骨头3.1 登录鉴权与角色权限酒店管理系统的权限不像电商那样复杂但也不能完全“裸奔”。常见的实现方式有两类一是传统的Session 拦截器二是Token比如JWT 拦截器。现在做前后端分离建议用Token方式前端每次请求在请求头里带上Authorization后端写一个拦截器统一校验。拦截器要做三件事放行登录注册和对外开放的房型查询接口校验Token是否存在和过期把当前登录用户的信息放入ThreadLocal方便Service层获取。代码核心大概是下面这样public class AuthInterceptor implements HandlerInterceptor { Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 放行预检请求 if (OPTIONS.equalsIgnoreCase(request.getMethod())) { return true; } String token request.getHeader(Authorization); if (token null || token.isEmpty()) { throw new BusinessException(401, 请先登录); } LoginUser user TokenUtil.parse(token); if (user null) { throw new BusinessException(401, 登录已过期); } UserContext.set(user); return true; } }如果你想让项目更有亮点可以在登录认证基础上加入RBAC权限模型用户关联角色、角色关联权限菜单登录成功后把权限码列表一次性查出来前端再根据权限码控制按钮显示。这样虽然多写两张表但论文“详细设计”里的权限模块就丰满很多。3.2 预订并发处理和房态一致性这是整个项目里最容易被追问的硬骨头。简单做法是预订时先查房间是否空闲再插入订单。但这种方式在并发场景下会出问题两个请求同时查到房间空闲都去插入订单最终订单表里出现两个都成功的记录房间状态却只能对应其中一个。推荐做法是使用数据库条件更新把“查询修改”合并成一次原子操作。以MyBatis为例更新房间状态时带上旧状态条件UPDATE t_room SET status 1 WHERE id #{roomId} AND status 0如果更新影响行数为0说明房间已经不是空闲状态直接抛业务异常“房间已被预订”。这个方案比起在Java内存里加synchronized更可靠因为Java层的锁只能锁单台服务器进程将来部署多副本时会被打破。数据库行锁才是更安全的防线。如果是更严格的“按日期预订”也可以设计一张t_room_stock_day表把“房间号日期”作为唯一键预订时插入意向记录利用唯一索引去重保证同一日期同一房间不会生成多条订单。3.3 统计报表与动态SQL报表模块建议至少做两个营业数据日报表和房态统计。前台图表可以用ECharts但后端SQL写不好前端再好看也白搭。MyBatis里最常用的就是动态SQL拼接条件比如按日期范围统计每天订单数和营收select idselectDailyReport resultTypemap SELECT DATE(create_time) AS stat_date, COUNT(*) AS order_count, SUM(total_amount) AS total_amount FROM t_order where if teststartDate ! null AND create_time gt; #{startDate} /if if testendDate ! null AND create_time lt; #{endDate} /if AND pay_status 1 /where GROUP BY DATE(create_time) ORDER BY stat_date /select注意这里比较运算符在XML里要写成gt;和lt;不能用裸的大于号小于号否则XML解析会报错。也可以使用![CDATA[]]包住整段运算符。金额字段在Java实体中一定要用BigDecimal而不是double这是数据库科目老师最常盯的问题。4. 前端Vue与联调页面好写状态难管4.1 工程结构与请求封装Vue技术栈建议直接选Vue3 Vite Element Plus起步成本并不比Vue2高答辩时还能说“使用组合式API组织业务逻辑”。前端目录大致按功能划分views放页面router放路由storePinia放登录用户、菜单权限、通用状态api放接口请求utils放请求封装和工具函数。请求封装的核心是统一Axios实例。一定要在请求拦截器里从本地存储取出Token并设置到请求头在响应拦截器里统一处理后端返回的code尤其是401时跳转到登录页并清除本地缓存。代码示意如下axios.interceptors.request.use(config { const token localStorage.getItem(token); if (token) { config.headers.Authorization token; } return config; }); axios.interceptors.response.use(response { const res response.data; if (res.code 401) { router.push(/login); return Promise.reject(new Error(res.message)); } return res; });4.2 房态看板与状态刷新房态看板是酒店管理系统最直观的页面也是很多老师会打开的第一个页面。设计思路是把所有房间按楼层和房型放到网格或卡片里用背景色区分状态绿色空闲、黄色已预订、蓝色已入住、灰色维修、橙色脏房。每个房间卡片点击后弹出操作按钮比如空闲房间可以“预订”已入住房间可以“退房”。状态刷新常见做法是轮询接口每10秒调一次房间状态接口。注意离开页面时要清理定时器避免路由切换后定时器仍然在发请求。如果想把项目做出亮点可以考虑用WebSocket推送房态变化答辩时可以讲“实时性比传统轮询更好”但要注意WebSocket连接管理和断线重连工作量会大一些。4.3 跨域、Token和拦截器的配合前后端分离最常见的糟心事就是跨域本地前端跑在5173端口后端跑在8080端口前端请求被浏览器拦截。解决方式是后端配置CORS并且要把自定义的Authorization请求头加进允许列表registry.addMapping(/**) .allowedOrigins(http://localhost:5173) .allowedMethods(GET, POST, PUT, DELETE, OPTIONS) .allowedHeaders(*) .allowCredentials(true);另外别忘了在SpringMVC拦截器中放行OPTIONS请求否则预检请求会先被拦截器拦下来明明CORS配了却仍然报跨域。排查顺序建议这样走先看浏览器Console报错是CORS还是401再在Network面板确认预检请求是否返回200最后确认后端拦截器是否把Token校验放在OPTIONS之前。5. 从代码到论文测试、部署与答辩准备的完整闭环5.1 测试用例设计与数据准备很多同学写完功能就开始截图写论文测试章节全是“测试通过”四个字。这种论文经不起答辩。测试用例要写“可执行”的表格至少覆盖用户登录成功/失败、房型列表查询、提交订单成功、重复提交订单失败、取消订单恢复房间状态、入住成功、退房成功、报表按日期查询正确。建议准备20个以上的功能测试用例每条写完操作步骤、预期结果、实际结果、是否通过。测试数据也要提前准备好比如三个房型、十几间不同楼层和状态的房间、三个测试账号、几条不同状态的历史订单。测试数据要尽量贴近真实房价带两位小数日期覆盖当月和跨月。这样在演示时页面不会空荡荡答辩老师也会觉得数据有设计感。5.2 部署与运行环境梳理毕业设计评审不止看代码还看能不能跑起来。建议把运行环境整理成一张表放在论文附录也方便自己以后重新搭建环境JDK版本、MySQL版本、Maven版本、前端Node版本、后端打包方式、数据库初始化脚本路径。很多人吃亏在数据库密码写死在自己本机换一台电脑演示就链接失败。建议在配置文件中使用环境变量或统一配置项并在文档里写明如何修改。部署方式推荐先本地跑通再考虑打包成jar或war。如果有条件也可以直接部署到轻量云服务器把前端构建后的静态文件交给Nginx托管后端作为服务进程运行。部署过程本身也能作为论文“系统测试”里的一项非功能验证。5.3 论文结构、图表和答辩要点论文结构不要生搬硬套但以下顺序基本不会错摘要与Abstract、绪论背景意义、国内外现状、主要内容、相关技术介绍、需求分析可行性、功能需求、非功能需求、总体设计架构、功能模块、数据库设计、详细设计核心流程、类设计、接口设计、系统实现界面截图、代码片段、系统测试测试用例、测试结果、总结与展望。图表比文字重要。功能模块图、业务流程图、数据库ER图、用例图、时序图、界面截图、测试用例表这几类图是论文的骨架。千万不要用几张截图撑满整章“系统实现”每一张图都要配上说明文字解释“这个页面做了什么、对应哪个接口、数据来自哪张表”。答辩被提问的十有八九集中在三个方向为什么这样设计数据库、并发情况下为什么不会出错、某个状态能不能乱跳。准备答案时要回到状态机和条件更新这两条主线。如果老师问“你的系统有什么亮点”不要只说“用了Vue和Element Plus”可以说“房间状态迁移都放在数据库层面做了原子更新保证并发下不会超卖”。这句话比堆砌技术名词值钱得多。如果让我重新做一遍这个题目我会先把房态状态流转图用A4纸画出来贴在显示器旁边再开始写数据库和接口。后来答辩被问到“同一间房同时被两个人预订”的时候我直接指着状态图说“这里只允许空闲状态通过条件更新变成已预订没抢到的那个请求影响行数为0就会被拒绝”。一番话说完老师反而点了点头。这套项目真正吃透的不只是框架用法而是你想让业务在什么规则下稳定运行——这些东西比代码本身更能让人从一个毕设看到你的工程思维。

相关新闻

Go Channel 底层解析:锁、环形缓冲区与等待队列

Go Channel 底层解析:锁、环形缓冲区与等待队列

有一次排查线上并发服务&#xff0c;发现 goroutine 数量冲到几万&#xff0c;CPU 却不怎么涨。直觉告诉我问题出在 channel&#xff1a;一大票 goroutine 堵在ch <- v或v : <-ch上互相等待&#xff0c;活活把并发打成了串行的“等”。当晚我把 Go 运行时里 channel 的实…

2026/10/15 13:55:43 阅读更多 →
Intel SGX生产实践:EPC内存管理与远程证明避坑指南

Intel SGX生产实践:EPC内存管理与远程证明避坑指南

1. 为什么今天还有人认真研究Intel SGX——不是怀旧&#xff0c;而是现实倒逼“Intel SGX”这四个字母在2024年的技术讨论中&#xff0c;听起来像一句老派的暗号。它不像LLM、RISC-V或存算一体那样高频刷屏&#xff0c;也不在主流招聘JD里明晃晃挂着“精通SGX优先”的标签。但就…

2026/10/15 13:54:39 阅读更多 →
sebastian/global-state 版本演进全解读:从 ChangeLog 看全局状态快照组件的 API 变迁与 PHP 支持策略

sebastian/global-state 版本演进全解读:从 ChangeLog 看全局状态快照组件的 API 变迁与 PHP 支持策略

测试 【免费下载链接】global-state Snapshotting of global state, factored out of PHPUnit into a stand-alone component 项目地址&#xff1a; https://gitcode.com/gh_mirrors/gl/global-state 点击查看 免费下载 sebastian/global-state 是从 PHPUnit 中独立出来的全局…

2026/10/15 13:54:39 阅读更多 →

最新新闻

OpenShell:面向开发者的Windows桌面增强工具

OpenShell:面向开发者的Windows桌面增强工具

1. OpenShell 是什么&#xff1f;它不是 Shell&#xff0c;更不是“开源外壳” OpenShell 这个名字&#xff0c;乍一听容易让人误以为是某种 Linux 或 macOS 的 shell 替代品——比如像 zsh、fish 那样的命令行解释器&#xff0c;或者某个带图形界面的终端模拟器。但事实恰恰相…

2026/10/15 14:31:41 阅读更多 →
OpenShell:跨平台终端环境协同方案详解

OpenShell:跨平台终端环境协同方案详解

1. OpenShell 是什么&#xff1a;一个被严重误读的“跨平台终端体验重构计划”OpenShell 这个名字在当前技术社区里&#xff0c;正经历一场典型的语义漂移——它既不是某个已发布的开源项目官方名称&#xff0c;也不是微软、苹果或Linux发行版的正式组件代号。但恰恰是这种模糊…

2026/10/15 14:31:41 阅读更多 →
FFmpeg转码核心技术解析与实战应用

FFmpeg转码核心技术解析与实战应用

1. 为什么需要系统掌握FFmpeg转码&#xff1f;第一次接触FFmpeg时&#xff0c;我像大多数人一样只会用简单的命令转换视频格式。直到有次客户要求将4K HDR素材转码为适配老旧机顶盒的MPEG-2格式&#xff0c;才发现参数配置不当会导致画质严重劣化。那次经历让我意识到&#xff…

2026/10/15 14:31:41 阅读更多 →
ShardingJDBC分库分表入门:分片键设计、配置实战与生产避坑指南

ShardingJDBC分库分表入门:分片键设计、配置实战与生产避坑指南

这两年总有同事问我&#xff0c;说订单表已经两千多万行了&#xff0c;到底要不要拆表&#xff1f;我的回答通常是&#xff1a;先别急着拆&#xff0c;先想想你的数据访问规律到底是什么。很多人被性能问题逼到分库分表面前&#xff0c;却没搞清楚中间件到底是怎么工作的&#…

2026/10/15 14:31:41 阅读更多 →
Intel SGX入门:硬件级可信执行环境原理与落地实践

Intel SGX入门:硬件级可信执行环境原理与落地实践

1. 从一个真实困惑说起&#xff1a;为什么需要关注SGX我第一次接触Intel SGX是在做一个跨平台数据协作项目的时候。当时的需求很朴素&#xff1a;多个参与方想联合计算一个统计结果&#xff0c;但谁都不愿意把原始数据交出去。我们试过同态加密&#xff0c;性能损耗大到没法接受…

2026/10/15 14:31:41 阅读更多 →
基于 GPU 算力集群利用率的反向限流:防止私有化推理卡池进入热崩溃

基于 GPU 算力集群利用率的反向限流:防止私有化推理卡池进入热崩溃

大模型私有化部署在各行各业落地过程中&#xff0c;绝大多数架构师在传统微服务中积累的限流经验都会彻底失效。传统的 API 网关限流通常基于固定的 QPS 或并发连接数&#xff0c;比如给某个接口配置 200 QPS 的令牌桶。但这套逻辑放在大模型推理集群上几乎等于自杀。 在 LLM 推…

2026/10/15 14:30:40 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时&#xff0c;网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上&#xff0c;依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里&#xff0c;扩缩容到底难在哪做过大模型推理服务部署的人&#xff0c;大概都经历过这样的场景&#xff1a;一个团队共用一套推理集群&#xff0c;A 业务跑的是 7B 的小模型&#xff0c;B 业务跑的是 72B 的大模型&#xff0c;C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子&#xff1a;一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减&#xff0c;为了把启动时间压进两秒以内&#xff0c;我手贱地把一串自认为“没用”的 systemd 服务给 disable 了&#xff0c;其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介&#xff1a;基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码&#xff0c;面向计算机相关专业课程设计与期末大作业学生&#xff0c;以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程&#xff0c;…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程&#xff1a;键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化&#xff0c;十个新手有八个栽在"往输入框里填东西"这件事上&#xff1a;要么填不进去&#xff0c;要么填了一半&#xff0c;要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程&#xff1a;阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀&#xff1a;什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面&#xff0c;跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →