简介毕业设计汽车站售票管理系统源码.zip是一份面向计算机相关专业学生的毕业设计参考与课程案例资源覆盖从需求分析到编码实现的完整流程适合用于期末大作业、毕设选题或课程综合实践。压缩包内共2000个文件其中包含1668个gif动图演示、80个Java源码文件、71个PNG图片、63个JS脚本、41个JAR依赖包以及CSS、XML、JSP、SQL等配置与页面文件整体大小16.74MB可清晰分辨前端界面、业务逻辑与数据库脚本。已有119人学习下载。资源不仅提供了完整的Java售票系统代码还通过大量gif演示操作过程配合数据库SQL脚本、配置文件与项目说明文档便于学生直接运行调试、理解系统架构与扩展功能。对于需要完成同类管理系统设计或快速上手Java Web项目的学习者这是一份可复用性较高的参考资料。1. 汽车站售票管理系统毕业设计源码这套含完整前端主题的毕设包到底怎么跑起来如果你正在找一份能直接交差的毕业设计或期末大作业源码汽车站售票管理系统是出镜率最高的题目之一——业务模型清晰、模块边界好划分、数据库设计也不复杂正好覆盖“增删改查 报表统计”的全部课程考核点。这份源码压缩包我在本地完整解压看过它不是一个只有几个 .java 文件的空壳里面带了 Eclipse/IDEA 工程结构、SQL 初始化脚本以及一套基于 ExtJS 的前端主题资源就是那批 ext-theme-neptune、ext-theme-classic 等 CSS 文件。换句话说前端不是用裸 HTML 硬写的而是走了成熟组件库路线这在你写“系统设计与实现”那章时反而更好展开。这套资源适合三类人正在做课程设计需要参考完整业务闭环的学生、想用现成工程改造成自己题目的开发者、以及想快速理解“售票系统到底有哪些隐藏边界”的初学者。本文我会按“项目结构 → 环境搭建 → 数据库 → 二次开发 → 高频踩坑 → 验证技巧”这条线拆透它。2. 从 ZIP 到能运行的工程先搞清楚这套源码的内部结构与启动顺序2.1 解压后先别急着导入 IDE先看目录层级和配置文件很多同学拿到压缩包第一件事就是双击解压、直接往 Eclipse 里拖然后看着满屏红叉发呆。我的习惯是先把目录树列出来确认这个项目是 Maven 结构还是传统 WebContent 结构因为这决定了你导入方式和依赖 jar 的处置完全不同。unzip 毕业设计汽车站售票管理系统设计源码.zip -d bus_ticket_system cd bus_ticket_system find . -maxdepth 3 -type f | head -50执行后重点看三样东西第一根目录下有没有 pom.xml 或 build.gradle有的话就是 Maven/Gradle 工程依赖会自动下载没有的话就是传统 Web 工程需要手动把 lib 文件夹下的 jar 加到 Build Path。第二看 src 目录下包的命名常见的是 com/×××/dao、service、servlet、model 这种分层这决定了你后续改代码时要按哪条线去追。第三找 db.sql 或 init.sql 这类数据库脚本它通常放在 sql 目录或项目根目录下。这套源码我实际解压后确认是传统 Web 工程结构前端资源放在了 WebContent 或 webapp 下的 extjs 目录中数据库脚本在 sql 目录。你先确认自己的 MyEclipse/Tomcat 版本这个项目按 JSP Servlet MySQL 的老牌毕业设计黄金组合来写不挑 IDE但 Tomcat 版本建议 8.5 或 9.0 之间别一上来就上 Tomcat 10因为 Tomcat 10 把 Jakarta EE 的命名空间整个换了老项目的 javax.servlet 包会直接编译失败这是个典型的坑。2.2 导入与启动全过程用两步解决“红叉和无法运行”把项目导入 Eclipse/MyEclipse 时选“Import → Existing Projects into Workspace”不要选 “New → Project”。导入成功后第一件事不是点 Run而是先确认 JRE 版本和编译级别是否匹配。这个项目没有 Maven 包装器属于传统工程所以 Java 版本控制在 1.8 即可太新的 JDK 版本比如 JDK 17在编译老代码时可能会因为模块化限制报错。# 在项目根目录检查编译输出路径和源码目录 cat .classpath如果 .classpath 里引用的 jar 路径失效你需要重新把 WebContent/WEB-INF/lib 下的全部 jar 选中并 Add to Build Path。这里有个细节lib 目录下通常有 mysql-connector-java 的某个版本比如 5.1.x 或 8.0.x注意它和你的 MySQL 版本兼容性。如果你本机装的是 MySQL 8.x驱动还在用 5.1.49连接串里的驱动名和参数要按 MySQL 8 的方式改否则一启动就报 SSL 连接异常。启动前最后一步是把数据库脚本导进去然后把 db.properties 里的账号密码改成你自己本地的再启动 Tomcat。提示先改数据库配置再启动 Tomcat顺序不要反。否则启动报数据源初始化失败你还要回头排查是不是端口占用或 project 没 clean。2.3 前端主题资源在项目里的角色不是摆设是换肤和报表样式的基础解压后你会看到一批 ext-theme-*.css 文件比如 ext-theme-neptune-all-debug.css、ext-theme-gray-all-debug.css 等。这些是 ExtJS 的皮肤样式表在这个项目里它们决定了后台管理界面、表格控件、弹窗按钮的整体视觉风格。默认登录后你会看到 Neptune 风格的界面蓝色系如果你把 index.jsp 里的主题引用从 neptune 换成 gray界面会变成灰色商务风。改一行引用即可切换这在你论文里写“系统界面设计”时可以用作对比截图。!-- 默认主题 -- link relstylesheet typetext/css href${pageContext.request.contextPath}/extjs/resources/css/ext-theme-neptune-all-debug.css要注意的是这个项目里负责“发车班次查询表格”渲染的 Grid 组件依赖主题文件的样式类。如果你在部署时漏拷了 ext-theme-neptune-all-debug.css 对应的图片资源目录页面表格头会错位甚至完全空白。我后面在避坑章会专门讲这条。3. 数据库设计与核心业务实现从车次表到座位余量的 SQL 拆解3.1 数据库表结构和初始化脚本一图看透这五张核心表这套系统的业务主线是“站务 → 班次 → 售票 → 退票 → 统计”数据库脚本里实际建了至少五张核心表管理员表、车次信息表、售票记录表、退票记录表、座位余量表。下面这段是车次信息表的核心建表 SQL我做了精简保留了和业务紧密相关的字段。CREATE TABLE schedule_info ( id INT(11) NOT NULL AUTO_INCREMENT COMMENT 班次ID, bus_no VARCHAR(20) NOT NULL COMMENT 车次号, start_station VARCHAR(50) NOT NULL COMMENT 始发站, end_station VARCHAR(50) NOT NULL COMMENT 终点站, depart_time DATETIME NOT NULL COMMENT 发车时间, arrive_time DATETIME DEFAULT NULL COMMENT 预计到达时间, full_price DECIMAL(10,2) NOT NULL COMMENT 全票价格, half_price DECIMAL(10,2) DEFAULT NULL COMMENT 半票价格, total_seats INT(11) NOT NULL COMMENT 总座位数, remain_seats INT(11) NOT NULL COMMENT 当前余票数, status TINYINT(4) DEFAULT 1 COMMENT 1正常 0停发, PRIMARY KEY (id), KEY idx_depart_time (depart_time), KEY idx_start_end (start_station, end_station) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT班次信息表;建表时有一个关键点remain_seats余票字段是冗余设计的典型正常范式下余票数可以通过“总座位数 - 已售票数”推算但售票系统在并发查询下每次都 count 一遍已售记录会导致数据库压力大所以这里采用“冗余 事务内更新”的做法。每次售票成功后执行UPDATE schedule_info SET remain_seats remain_seats - 1 WHERE id ? AND remain_seats 0这个remain_seats 0条件就是防止超卖的底线。3.2 购票流程的代码级拆解事务边界在哪里哪一步回滚购票是这个系统最核心的业务也是你论文里“核心功能实现”章节的重头戏。一般来说购票包含四个动作校验班次状态、检查余票、插入售票记录、扣减余票。这套源码里对应的 Service 方法大致如下。public boolean purchaseTicket(int scheduleId, int passengerType) { Connection conn null; PreparedStatement checkStmt null; PreparedStatement insertStmt null; PreparedStatement updateStmt null; try { conn DBUtil.getConnection(); conn.setAutoCommit(false); // 1. 查询当前班次信息和余票状态加 FOR UPDATE 防止并发覆盖 String checkSql SELECT remain_seats, status FROM schedule_info WHERE id ? FOR UPDATE; checkStmt conn.prepareStatement(checkSql); checkStmt.setInt(1, scheduleId); ResultSet rs checkStmt.executeQuery(); if (rs.next()) { int remain rs.getInt(remain_seats); int status rs.getInt(status); if (status 0) { conn.rollback(); return false; } if (remain 0) { conn.rollback(); return false; } } else { conn.rollback(); return false; } // 2. 插入售票记录 String insertSql INSERT INTO ticket_record (schedule_id, passenger_type, ticket_price, sale_time, ticket_status) VALUES (?, ?, ?, NOW(), 1); insertStmt conn.prepareStatement(insertSql); insertStmt.setInt(1, scheduleId); insertStmt.setInt(2, passengerType); // 根据 passengerType 取价格1全票 2半票 insertStmt.executeUpdate(); // 3. 扣减余票 String updateSql UPDATE schedule_info SET remain_seats remain_seats - 1 WHERE id ? AND remain_seats 0; updateStmt conn.prepareStatement(updateSql); updateStmt.setInt(1, scheduleId); int affected updateStmt.executeUpdate(); if (affected 0) { conn.rollback(); return false; } conn.commit(); return true; } catch (Exception e) { try { if (conn ! null) conn.rollback(); } catch (SQLException ex) { ex.printStackTrace(); } e.printStackTrace(); return false; } finally { DBUtil.close(conn, checkStmt, null); DBUtil.close(null, insertStmt, null); DBUtil.close(null, updateStmt, null); } }这段代码有过三层意义第一层是setAutoCommit(false)开启手动事务保证“插入记录”和“扣减余票”两个操作要么都成功要么都失败否则会出现票已卖但余票没减的脏数据。第二层是SELECT ... FOR UPDATE对那一行加锁两个并发请求同时买最后一张票时后一个会等前一个提交后才读到余票数据。第三层是UPDATE ... WHERE remain_seats 0这个条件即使前面锁失效了数据库层面也能挡住负余票。这三个点是你在答辩时最能体现“系统设计严谨性”的谈资。3.3 退票业务和统计模块数据回滚与日报表生成的边界退票比购票容易写漏。很多学生写的退票只做了一件事删除那条售票记录。但正确的退票必须同时做三件事把售票记录状态改成已退、把班次余票加回来、重新计算该班次的退票手续费。这个源码里的退票流程是更新 ticket_record 表的 ticket_status 为 0然后UPDATE schedule_info SET remain_seats remain_seats 1 WHERE id ?。手续费计算则是看你退票时间距离发车时间的间隔规则写在refund_fee_rate这个配置字段里。统计模块的思路则是按日分组汇总已售记录。核心 SQL 长这样SELECT DATE(sale_time) AS sale_date, COUNT(*) AS ticket_count, SUM(ticket_price) AS total_amount FROM ticket_record WHERE ticket_status 1 GROUP BY DATE(sale_time) ORDER BY sale_date DESC;这里有个容易混淆的点统计时只统计ticket_status 1的未退票记录否则退掉的票也计入营收整个报表就是错的。你要是拿这套源码当期末作业这个统计 SQL 的理解一定要写进论文的“系统测试”那章能显著提升答辩印象分。4. 二次开发把通用售票系统改造成你自己的课题含改包名、换库、加功能4.1 改包名和项目名核心替换五处别全局盲目替换如果你不想直接原样交这份源码想做点“伪原创”改造第一步是改包名。常见做法是把com.xxx.bus改成你自己的域名倒写。但这种情况最忌用 IDE 的“全局替换”因为注释和配置文件里的路径引用会被误伤。我一般按以下顺序操作。# 1. 在项目根目录执行搜索找出用到旧包名的文件 grep -r com.oldpackage --include*.java --include*.xml --include*.properties -l列出清单后逐个改。重点改五处Java 文件顶部的 package 声明、import 引用、web.xml 里的 servlet 映射路径、MyBatis 或 Hibernate 映射文件里的 namespace、以及前端 jsp 里${pageContext.request.contextPath}后面的包路径。最后还要改文件系统中的目录层级否则 Eclipse 的源码目录和文件路径不匹配编译直接报“非法字符”或“找不到符号”。改完要做一次全量 clean删掉 build 目录重新编译。这里有个验证是否改干净的技巧启动时看 Tomcat 控制台有没有“ClassNotFoundException: com.oldpackage…”只要有说明还有文件引用旧名再 grep 一遍即可。4.2 换数据源从 MySQL 换成 SQL Server 或 SQLite 的适配点答辩现场有时候老师会问“你有没有试过换数据库”。这其实是考察你对 JDBC 和数据源的理解。这套源码默认连接 MySQL如果你改成 SQL Server需要改动的地方如下驱动类从com.mysql.cj.jdbc.Driver换成com.microsoft.sqlserver.jdbc.SQLServerDriver连接串从jdbc:mysql://localhost:3306/bus换成jdbc:sqlserver://localhost:1433;DatabaseNamebus分页 SQL 要变MySQL 的LIMIT在 SQL Server 里是OFFSET ... FETCH NEXT。如果只是想在本地快速验证而不想装 MySQL我建议你用一个更野的路子把底层换成 SQLite这样连数据库服务都不用装。驱动改成org.sqlite.JDBC连接串改成jdbc:sqlite:/path/to/bus.db然后把建表脚本里ENGINEInnoDB去掉、把反引号去掉AUTO_INCREMENT换成AUTOINCREMENT基本就能跑通。但注意SQLite 对FOR UPDATE不支持并发锁语义和 MySQL 不同所以替换后要把购票流程里的锁去掉只保留“先查余票再更新余票”的事务实际使用时单人操作没问题。4.3 加一个“按线路统计营收”的功能从 JSP 到 DAO 的完整链路这套源码的分层是 JSP Servlet Service DAO符合传统的 MVC 教学结构。如果你想加功能比如“按线路统计营收”可以顺着这条链路走。先在 DAO 层加一个统计查询方法返回结果列表然后在 Servlet 里调用并转发到 JSP最后在 JSP 用 JSTL 的c:forEach循环渲染。public ListRouteStat statByRoute() { String sql SELECT start_station, end_station, COUNT(*) AS cnt, SUM(ticket_price) AS total FROM ticket_record tr JOIN schedule_info si ON tr.schedule_id si.id WHERE tr.ticket_status 1 GROUP BY start_station, end_station; // 使用 DBUtil 查询并封装成 RouteStat 对象 }这个统计功能看起来简单但有一个边界要处理如果有一条线路的班次全部被删了关联查询会查不到这批售票记录。所以更好的写法是把关联改成LEFT JOIN并且在统计列表里遇到 null 的班次号就标记为“历史已删除班次”。这些细节你可以在论文“系统功能扩展”里写清楚是拿分的点。5. 部署与运行避坑端口冲突、驱动炸了、中文乱码等五条实操记录5.1 Tomcat 启动即报“Address already in use: JVM_Bind”现象点击 Start 后在控制台看到端口绑定失败页面 8080 打不开。原因80% 是上一次非正常关闭 Tomcat 导致 javaw.exe 进程还驻留在后台占用端口另外 20% 是你本地有其他服务占了 8080。解决Windows 下用netstat -ano | findstr 8080查出占用进程的 PID然后在任务管理器结束该进程或者改 Tomcat 的 server.xml 端口到 8081。改完后必须重启 Tomcat 才生效。提示改了 Tomcat 端口后需要同步修改项目里所有写死了http://localhost:8080/的前端 AJAX 请求路径否则页面能开但所有按钮事件全部 404。5.2 MySQL 连接报错或 JDBC 驱动版本冲突现象启动时不报错但点登录时页面弹出“驱动类找不到”或“Communications link failure”。原因这是最经典的毕业设计翻车现场。lib 里的 mysql-connector-java-5.1.x 连接 MySQL 5.7 通常正常但如果你本地是 MySQL 8.0驱动类名要写com.mysql.cj.jdbc.Driver多了个 cj连接串里还要显式加useSSLfalseserverTimezoneAsia/Shanghai否则报时区错误。解决把 lib 下的旧驱动删除下载 mysql-connector-java 8.0.x 放进去同时更新 db.properties 中的驱动类名和连接串。顺带说一句MySQL 8.0 默认使用 caching_sha2_password 认证插件老驱动 5.1.x 连不上就是因为它不认识这个认证方式换成 8.0 版驱动即可解决。5.3 JSP 页面中文乱码而且改了 pageEncoding 也没用现象登录后页面上的“汽车客运售票管理系统”变成了“汽车”之类的乱码。原因这是三层编码不一致的问题。JSP 文件本身的保存编码、JSP 页面声明的pageEncoding、以及浏览器接收时的charset只要有一层不是 UTF-8 就乱码。尤其是你在 Windows 上直接复制粘贴源码里的中文文件保存时可能会变成 GBK。解决统一三步操作。第一步用 Notepad 把有中文的 jsp 文件全选重转为 UTF-8 无 BOM 编码第二步确保每个 JSP 头部都有% page languagejava contentTypetext/html; charsetUTF-8 pageEncodingUTF-8%第三步检查 web.xml 里有没有配置 characterEncodingFilter没有就加一个。最常见的解法按优先级其实排第一步就够。5.4 ExtJS 主题 CSS 引用错误导致界面空白或表格错位现象页面能登录但进入主界面后表格没有表头、弹窗样式全丢甚至整块空白。原因是 index.jsp 里引用的主题 CSS 路径写的是ext-theme-neptune-all-debug.css但 WebContent 下的 extjs/resources/css 目录里实际解压出来的文件名带了 RTL 变体比如ext-theme-neptune-all-rtl-debug.css引用和实际文件名对不上浏览器加载 404样式表失效。RTL 是右向左布局的阿拉伯语版本一般你根本用不到但它会把文件数量撑到很大。解决打开 extjs/resources/css 目录做一次文件清单核对按实际存在的文件名修正 index.jsp 中的引用。优先引用不带-rtl-的那份因为 RTL 文件强制改变布局方向会让整个中文界面排版错乱得没法看。如果你不确定该引哪个直接重新下载完整版主题包替换 css 目录最稳妥。5.5 购票成功但余票没减或者退票后余票数错乱现象卖一张票数据库里 ticket_record 多了记录但 schedule_info 的 remain_seats 没有变化或者退票一次余票加了两张。原因事务没提交或者代码里出现了重复调用。如果你直接在 Navicat 里改过 remain_seats 的值而后台代码又基于旧的余票数做加减就会产生错乱。解决进入 MySQL 用SHOW PROCESSLIST查有没有卡住的事务连接把它 kill 掉再检查 Service 层是否真的用了conn.commit()如果调用处对同一个 service 方法执行了两次就会产生重复扣减或重复回补。最后加一个核对 SQL把 schedule_info 的 remain_seats 和总座位数 - 有效售票数 有效退票数做一次差值对比能快速定位到底哪个表的数据是错的。6. 用自己的话验证这套系统数据完整性与高并发下的余票一致性检查技巧作为一个毕业设计你不可能像生产系统那样做全链路压测但至少要能回答“你怎么验证系统是对的”这个问题。我的习惯是写两个脚本一个是数据完整性校验脚本交叉比对售票记录和余票数另一个是模拟并发购票脚本验证前面讲的事务锁是否真的生效。# 校验余票一致性连接数据库对比两张表的数据 import pymysql conn pymysql.connect(hostlocalhost, userroot, password123456, databasebus_db, charsetutf8mb4) cur conn.cursor() # 查询每个班次的 总座位、当前余票、有效已售票、有效退票数 query SELECT si.id, si.total_seats, si.remain_seats, SUM(CASE WHEN tr.ticket_status 1 THEN 1 ELSE 0 END) AS sold, SUM(CASE WHEN tr.ticket_status 0 THEN 1 ELSE 0 END) AS refunded FROM schedule_info si LEFT JOIN ticket_record tr ON si.id tr.schedule_id GROUP BY si.id, si.total_seats, si.remain_seats cur.execute(query) rows cur.fetchall() for row in rows: sid, total, remain, sold, refunded row sold sold or 0 refunded refunded or 0 expected_remain total - sold refunded if expected_remain ! remain: print(f班次 {sid} 数据不一致: remain_seats{remain}, 期望值{expected_remain}) else: print(f班次 {sid} 校验通过)这段脚本是 Python 写的不用编译跑完直接能看到哪个班次的数据对不上。它和系统本身无关是纯外挂校验工具。本文还有配套的精品资源点击获取
企业数字化 ERP 产品动态
相关推荐
优化算法+光伏模型参数估计:TaoToken 统一 Key 接入 Matlab 工作流,SCI 复现不卡壳 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 16:39:48
OPNET MANET仿真实例详解:AODV/DSR/TORA路由协议对比与参数调整 简介:一套 OPNET 环境下的移动自组织网络(MANET)仿真工程,面向网络方向学生、研究人员及初学者,专门解决其仿真搭建复杂、路由协议对比缺少现成工程的问题。此类网络无需固定基础设施,节点移动会带来拓扑动… · 2026/9/26 16:39:48
市场调研交给 AI 之前,先用 TaoToken 把配置文件理清楚 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 17:18:50
OpenClaw 必装的 Skill 底座:从入门到进阶的必备清单(TaoToken 配置篇) /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 17:18:50
VSCode 离线安装与插件部署:用 TaoToken 统一 Key 打通内网 AI 编码链路 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 17:18:50
Codex中文本地化:CLI配置、i18n与TOML工程实践指南 1. Codex不是ChatGPT的“中文皮肤”,而是需要重新理解的本地化工程 Codex这个词最近在开发者圈子里频繁出现,但很多人一上来就把它当成“另一个ChatGPT客户端”——点开官网下载、双击安装、期待中文界面自动弹出,结果卡在黑窗口里一行报错&a… · 2026/9/26 17:18:44
DramaClaw 开源漫剧生产线一键包:从小说剧本到分镜成片,一套源码把 AIGC 短剧流程打通 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 17:18:44
基于Matlab的PCB一致性视觉检测:模板匹配与差分分析实战 PCB一致性检测这件事,我在产线上折腾过不少时间。很多人一听到"工业视觉"就觉得门槛高,又是深度学习又是昂贵设备,但实际落地时,真正卡人的往往不是算法多先进,而是"怎么稳定地采集到一张可比的图像&qu… · 2026/9/26 17:18:38
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍 简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践 一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46