数据库实验五:从建表到触发器,工程化设计实战全解析
简介面向西北工业大学软件学院数据库课程学习的实验五资料包聚焦E-Commerce电子商务系统的概念模型设计帮助读者完成从项目描述到完整ER Schema的构建适合正在做该实验或复习数据库设计的学生使用。包内共20个文件压缩后约282KB以gif操作演示、doc说明文档、txt注解、cdm概念数据模型及htm辅助页面为主gif直观展示各业务流程界面cdm可直接查看ER图逻辑结构txt配合ER图说明设计细节。内容覆盖会员注册、商品浏览、购物车、订单结算、支付与历史订单等典型电商模块提供实验指导书、ER图及配套文字解释相当于一套可对照的完整实验样例。目前已有910人学习下载对理解题目要求、快速梳理实体联系模型具有直接参考价值。1. 数据库实验五从“能跑”到“会设计”的分水岭很多人在数据库课程前几次实验里靠复制课件代码、改改表名就能混过去但实验五一出来这招立刻失效。它不再只考单表增删改查而是把视图、触发器、存储过程、事务、索引、用户权限这些东西全部揉进一个完整的业务场景里要求你从需求分析开始自己设计表结构、写约束、调性能。你之前欠下的账到这一关全要还。这份实验五资源适合两类人一类是被作业卡住、需要一个可参考的完整实现来对照思路的在校生另一类是自学 SQL 想验证自己设计能力、想知道“一个合格的数据库实验到底该交付什么”的从业者。它能帮你解决的问题很具体表结构怎么拆、外键怎么挂、触发器怎么写才不会把自己绕晕、存储过程怎么调参、事务并发下怎么避免脏读。2. 实验五到底在考什么需求文档里的隐藏考点2.1 从需求文本到 ER 图别跳过这一步直接建表实验五的题目通常会给你一段业务描述比如“某网上书店系统需要管理图书、作者、出版社、订单、客户、库存”之类的场景。很多同学拿到题就打开建表工具开写结果做到一半发现字段不够用、关系对不上又回头改表越改越乱。正确做法是先画 ER 图。你不需要用专业建模工具一张纸一支笔就行。把题面里出现的名词全部列出来标出哪些是实体、哪些是属性、哪些是实体间的关系。比如“订单”和“图书”之间是多对多关系那中间必然要有一张关联表字段至少包含订单 ID、图书 ID、购买数量、成交单价。这个关联表不是可选项是范式要求。在这份实验资源里完整交付了一个图书销售场景的 ER 图到建表 SQL 的全过程。实体一共 6 个图书、作者、出版社、客户、订单、库存关系有 7 条。你如果自己画完再对照资源里的设计能快速发现自己漏掉的联系。我自己做过助教见过最多的翻车现场就是忘了订单和图书之间的中间表直接把图书 ID 塞进订单表结果同一订单买了三本书就只能插三行重复的订单号主键都不知道该设谁。2.2 建表语句里的范式陷阱第三范式到底怎么落地实验五的建表部分通常要求达到第三范式3NF。很多学生对范式的理解停留在理论定义上一动手就出问题。比如图书表你把“出版社名称”直接写进去这违反第二范式还是第三范式答案是如果出版社还有地址、联系电话这些属性你就应该单独建出版社表图书表里只存出版社 ID这叫消除非主属性对候选键的传递依赖。资源里的建表脚本对每个表的字段都做了注释标注了哪个字段是主键、哪个是外键、为什么这样设计。我建议你拿到脚本后不要直接执行先自己尝试从 ER 图推导一遍建表顺序。建表顺序有讲究先建不依赖其他表的表比如出版社、作者再建图书表依赖出版社再建客户表最后建订单表和订单明细表依赖前面的所有表。如果顺序颠倒外键约束会让你报错。-- 先建立独立实体表 CREATE TABLE publisher ( publisher_id INT PRIMARY KEY AUTO_INCREMENT COMMENT 出版社ID自增主键, publisher_name VARCHAR(100) NOT NULL COMMENT 出版社全称, address VARCHAR(200) COMMENT 出版社地址, contact_phone VARCHAR(20) COMMENT 联系电话 ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT 出版社表;建表的先后逻辑可以这样理解MySQL 在创建外键约束时会去检查被引用的表是否存在所以被引用的表必须先创建。AUTO_INCREMENT 只对整数主键生效如果你用字符串做 ID 就没法自增。ENGINEInnoDB 是必须的因为只有 InnoDB 才支持事务和外键MyISAM 引擎虽然查询快但不支持这两样实验里如果没特别说明一律用 InnoDB。字符集选 utf8mb4 是因为它能存 emoji而且兼容所有中文字符utf8 在特殊字符上会报错。2.3 视图为什么会有一个“画蛇添足”的题目要求实验五通常要求创建 2 到 3 个视图。很多同学不理解明明直接 SELECT 就能查为什么要建视图。视图的本质是封装复杂查询逻辑它的价值在于第一简化客户端调用第二隐藏敏感字段。比如一个订单汇总视图里面聚合了订单总金额、图书总数量业务方直接查视图就行不用每次写 JOIN 和 GROUP BY。但视图有个坑MySQL 里对视图的更新操作限制很多。你如果创建一个包含 GROUP BY 或 JOIN 的视图然后试着 UPDATE 这个视图会直接报错“不是所有列都可以更新”。所以实验里创建完视图一般只要求做查询验证不要试图通过视图改数据。资源里建的三个视图分别服务三个场景图书销售排行、客户消费汇总、库存预警。第三个视图特别有用它查出库存低于安全阈值的图书清单业务上可以直接对接采购部门。-- 库存预警视图查出库存量低于安全库存的图书 CREATE VIEW v_book_stock_warning AS SELECT b.book_id, b.book_name, s.stock_quantity, s.safety_stock, s.stock_quantity - s.safety_stock AS shortage_amount FROM book b JOIN stock s ON b.book_id s.book_id WHERE s.stock_quantity s.safety_stock;这里 JOIN 是内连接只返回在库存表里有匹配记录的图书。shortage_amount 字段是计算出来的差值它不会真正存储在数据库里每次查视图时都会实时计算。创建一个视图后你可以用 SHOW CREATE VIEW v_book_stock_warning 查看它的定义如果后续源表结构变了视图可能失效需要你用 CREATE OR REPLACE VIEW 重建一次。3. 触发器和存储过程实验五里最容易丢分的两座大山3.1 触发器的业务语义什么时候用 BEFORE什么时候用 AFTER触发器在实验五里通常要求两个一个是下单时自动扣减库存一个是订单状态变更时自动记录日志。这两个场景代表了两类典型用法BEFORE 用于在新数据写入前做检查或预处理AFTER 用于在数据变更完成后做后续联动。库存扣减必须用 BEFORE INSERT 触发器。你得先去库存表里检查数量够不够不够就直接 SIGNAL 抛异常中止下单。这个逻辑如果用 AFTER 做就晚了——AFTER 在 INSERT 执行完之后才触发订单已经写进去了库存不够你也拦不住。日志记录用 AFTER 就行因为订单状态更新成功之后才需要记一条历史。-- 下单扣库存的触发器BEFORE INSERT 检查库存并扣减 DELIMITER $$ CREATE TRIGGER trg_stock_deduct BEFORE INSERT ON order_detail FOR EACH ROW BEGIN DECLARE current_stock INT; DECLARE need_stock INT; -- 查询当前库存量 SELECT stock_quantity INTO current_stock FROM stock WHERE book_id NEW.book_id FOR UPDATE; -- 如果库存不足抛异常阻止下单 IF current_stock NEW.quantity THEN SIGNAL SQLSTATE 45000 SET MESSAGE_TEXT 库存不足无法下单; END IF; -- 扣减库存 UPDATE stock SET stock_quantity stock_quantity - NEW.quantity WHERE book_id NEW.book_id; END$$ DELIMITER ;DELIMITER 这条语句特别重要MySQL 默认用分号作为语句结束符而触发器内部有大量分号如果不先把结束符改成 $$MySQL 在读完第一行分号就认为语句结束了后端代码全会被当成语法错误。FOR UPDATE 是行级锁它在 SELECT 查库存的同时锁定这行记录保证并发下两个订单不会同时读到相同的库存数然后各自扣减这是实验里最容易忽略的并发问题。SIGNAL SQLSTATE 45000 是 MySQL 5.6 之后支持的主动报错方式45000 是用户自定义错误专用状态码如果你的 MySQL 版本比较老需要换用另一种写法。3.2 存储过程的参数设计与返回值约定存储过程一般要求做一个订单统计或客户积分更新的功能。存储过程比触发器灵活的地方在于它可以接收输入参数、定义局部变量、用游标遍历结果集。在设计存储过程时必须想清楚哪些数据由调用者传入哪些数据需要在过程内部计算结果怎么返回。MySQL 的存储过程不支持直接 RETURN 值你只能通过 OUT 参数返回结果。-- 统计指定客户的总消费金额 DELIMITER $$ CREATE PROCEDURE sp_customer_total_spending( IN p_customer_id INT, OUT p_total_amount DECIMAL(10,2) ) BEGIN -- 初始化输出参数为 0避免出现 NULL SET p_total_amount 0; -- 聚合计算出总消费 SELECT IFNULL(SUM(o.order_amount), 0) INTO p_total_amount FROM orders o WHERE o.customer_id p_customer_id AND o.order_status completed; END$$ DELIMITER ;调用这个存储过程的 SQL 是 CALL sp_customer_total_spending(5, total); 然后再用 SELECT total; 查看结果。total 是用户自定义会话变量它只在当前数据库连接内有效连接关闭就消失。IN 参数和 OUT 参数的区别要记清楚IN 是你传入的值在过程内部只能读不能改OUT 是过程内部赋值然后传出来给调用者。IFNULL 在这里防止 SUM 返回 NULL —— 如果这个客户一单都没有聚合函数会返回 NULL而不是 0。DECIMAL(10,2) 一共 10 位有效数字小数占 2 位也就是整数部分最多 8 位算总消费额通常够了如果业务金额很大可以调成 DECIMAL(12,2)。3.3 游标的适用边界能不用就不用部分实验会增加一道游标题比如逐行遍历订单明细计算每个商品的总销售额。游标在存储过程里像是一个指针一行一行地扫描结果集每取一行做一次计算然后更新到另一个表。这个操作在数据量小的时候没问题但一旦数据超过万行就非常慢。实际上 90% 的游标场景可以用一条带有 GROUP BY 和聚合函数的 UPDATE 语句替代。实验里的游标要求更可能是在考察你是否理解游标的使用语法以及如何处理 NOT FOUND 边界条件。资源里对游标部分给出了完整的 FETCH ... LOOP ... END LOOP 示范同时注释里专门标注了替代方案让你对比看哪种写法更简单。这是这个实验资源一个比较实在的地方——它不是只给答案而是同时给了两种解法和各自的性能边界。如果你已经工作了一段时间再看这种对比就能理解为什么生产环境里几乎没人用游标全是写 JOIN 配合 UPDATE。4. 事务隔离级别与并发控制多用户同时下单的实战推演4.1 四个隔离级别分别防住了什么实验五在事务这块不会只让你写一个 BEGIN TRANSACTION 包住几条 UPDATE。常见考法有两种一种是解释不同隔离级别下的并发现象另一种是实际打开两个会话窗口演示一个会话插入数据后未提交时另一个会话能不能读到。MySQL 默认隔离级别是 REPEATABLE READ可重复读这也是 InnoDB 引擎的默认值。四个隔离级别按强度从低到高排列是 READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ、SERIALIZABLE。READ UNCOMMITTED 能读到别的会话未提交的数据也就是脏读READ COMMITTED 每次查询都拿最新已提交数据解决脏读但出现不可重复读——同一个事务里两次查询同一行值不一样REPEATABLE READ 在事务开始后创建快照整个事务内读到的都是这个快照解决不可重复读但解决不了幻读SERIALIZABLE 强制事务串行彻底解决幻读代价是并发性能极其底下。-- 查看当前隔离级别MySQL 8.0 语法 SELECT transaction_isolation; -- 设置当前会话隔离级别为读已提交 SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;实验报告里写隔离级别时不要只写结论要把你实际测试的过程记录下来。比如你开两个终端连同一个数据库终端 A 开启事务插入一条新图书但不提交终端 B 在 READ UNCOMMITTED 下能查到这条脏数据在 READ COMMITTED 下查不到。测试记录放在实验报告里非常有说服力这比空谈理论分高得多。SESSION 关键字只影响当前连接如果你不想影响别的窗口用 SESSION如果想改全局默认用 GLOBAL但 GLOBAL 在 MySQL 8.0 之后不只是作用域不同修改后新连接才生效老连接保持原值这一点很多教材都没提你在实验结论里写清楚能看出你是有实际操作经验的。4.2 死锁是怎么产生的以及你怎么向老师解释你没写错死锁在生产环境里不可避免在实验里如果设计得好也能复现。最常见的死锁场景是两个事务按相反顺序更新同一组数据。事务 A 先更新订单表再更新库存表事务 B 先更新库存表再更新订单表两边各持有对方要的锁谁也不让谁InnoDB 检测到死锁后会让代价较小的一方回滚另一方继续执行。实验验证死锁不复杂开两个查询窗口按下面顺序执行就能复现窗口 A 里 UPDATE stock SET stock_quantity stock_quantity - 1 WHERE book_id 1先不提交窗口 B 里也执行一模一样的语句但 book_id 2然后窗口 B 再更新 book_id 1 的记录这时窗口 B 会阻塞被窗口 A 持有的行锁挡住窗口 A 这边再试着去更新 book_id 2 的记录死锁立刻触发InnoDB 会随机让一边死掉。如果你在实验报告里把死锁的复现步骤写清楚然后解释 InnoDB 的检测策略这个小题基本满分。实际处理死锁的常见方案是重试机制——捕获死锁错误码后再执行一次事务而不是让用户看到报错页面。资源里在事务示例代码中明确打印了每个步骤的耗时和锁等待情况你在验证时能看到锁竞争发生在哪一行这比只看报错提示能提供更多信息。4.3 索引设计为什么实验五要求你把常用查询字段都加上索引索引在实验五里的显性要求通常是给频繁查询的字段建索引比如图书名称、订单创建时间。但很多同学为了省事给所有字段都加了索引这反而是严重的错误。索引虽然加速查询但每次 INSERT、UPDATE、DELETE 都要同步维护索引结构索引越多写入越慢磁盘占用也越大。-- 针对高频查询场景创建联合索引 CREATE INDEX idx_order_customer_time ON orders(customer_id, order_time DESC);联合索引要遵守最左前缀原则。上面这个索引如果查询条件是 WHERE customer_id 5 AND order_time 2024-01-01索引会生效如果查询条件里没有 customer_id只写了 order_time这个索引就用不上。所以设计联合索引时字段顺序必须把等值查询的列放在前面、范围查询的列放在后面。DESC 关键字是 MySQL 8.0 才支持在索引上声明排序方向老版本不加也可以但在 ORDER BY order_time DESC 时如果索引方向一致能避免文件排序查询性能会更好。5. 避坑指南实验五最常见的 8 个报错与逻辑陷阱5.1 中文乱码表建好了SELECT 出来全是问号现象插入的中文数据查出来是 “??” 或者一堆乱码。原因创建数据库时没指定字符集MySQL 默认用了 latin1。你虽然在建表语句里写了 utf8mb4但数据库整体是 latin1 的话连接层的字符集转换会出问题。解决创建数据库时就写好CREATE DATABASE db_name DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;同时确认客户端的连接字符集和数据库一致。执行SET NAMES utf8mb4;可以快速检查当前连接的字符集设置如果你是在图形化工具里操作也要在连接属性里把编码改为 utf8mb4。这个坑的隐蔽之处在于数字和英文字母永远正常只有中文出问题初看会怀疑是自己数据写错了。5.2 外键约束失败明明两个表都有数据为什么插入还是报错现象往订单表插入数据时提示 Cannot add or update a child row: a foreign key constraint fails。原因子表里引用的那个外键值在父表的主键里根本不存在。常见场景是你手动往订单表里插了一条测试数据customer_id 写成了 99但客户表里只有 1 到 10 号客户。解决先执行一条 SELECT 确认父表里有哪些合法 ID再修正子表里的引用值。如果这个约束确实不需要可以用 ALTER TABLE 语句 DROP FOREIGN KEY 把它删掉但前提是你确定业务逻辑上不需要这个约束。做实验时不要为了省事删外键因为实验评分点里可能会检查约束定义。5.3 存储过程语法报错DELIMITER 忘了写卡了半天现象存储过程或触发器创建时MySQL 报错提示接近你的第一行 SQL 的语法错误。原因你没写 DELIMITER $$或者写了 DELIMITER $$ 但创建完没有恢复成 DELIMITER ;。图形化工具里也可能出现这个问题因为工具本身对结束符有自己的处理。解决创建过程体内的每条 SQL 后用分号结尾在 DELIMITER $$ 和 CREATE PROCEDURE ... END$$ 结束后马上执行 DELIMITER ; 把结束符改回来。如果你是在命令行里操作不恢复结束符的话后续所有普通 SQL 的执行都会出问题。5.4 视图不可更新Updatable views 的典型限制现象你对一个含有 JOIN 或聚合函数的视图执行 UPDATEMySQL 直接拒绝提示视图不是可更新的。原因MySQL 对视图的可更新性有严格规定只要视图中包含 GROUP BY、DISTINCT、聚合函数、子查询、UNION、JOIN 等任一特征这个视图就只读不能用于 UPDATE、DELETE、INSERT。解决实验里创建的三个视图里有 JOIN 和聚合就别想着往视图里更新数据。如果某些操作逻辑上需要通过视图完成你只能回到基表执行。视图只用来做查询和分析这一点在实验报告里写明即可。5.5 主键冲突自增列不连续手工插入指定 ID 后乱了现象删除某几行后重新插入数据自增主键没有从你预期的地方继续或者直接报主键重复。原因AUTO_INCREMENT 的计数器不因为 DELETE 回退。MySQL 每产生一个新 ID 就把它持久化到系统表里除非 TRUNCATE TABLE 重置表否则自增主键永远不会重用已删除的 ID。解决实验里不要手工指定自增主键列的值让数据库自己生成。如果你想清空表并重置自增位点用 TRUNCATE TABLE 而不是 DELETE FROM。TRUNCATE 会删除全部行并重置自增计数但在有外键引用这个表时会失败需要先解除或停用外键检查。5.6 事务隔离级别与实验预期不一致REPEATABLE READ 下查不到刚提交的数据现象窗口 A 开启事务查询某表看不到窗口 B 刚提交的新数据你以为是自己代码写错了。原因这大概率不是 bug是 REPEATABLE READ 隔离级别下的一致性快照机制。事务第一次查询时生成了一个快照后续所有查询都基于这个快照直到事务结束。窗口 B 提交的数据在窗口 A 事务开始后出现快照里当然没有。解决如果你想在同一个事务里看到最新数据可以提交当前事务后重新开启或者把隔离级别切换成 READ COMMITTED。这个点应该在实验报告的并发测试部分写清楚你能解释清楚它说明你对 MVCC 机制有实际理解。5.7 批量插入慢得离谱逐条 INSERT 和批量 INSERT 差了一个数量级现象插入 5000 条测试数据一条一条 INSERT 花了接近一分钟换成批量 INSERT 几秒就完成。原因每条独立 INSERT 都隐含一次事务提交和一次磁盘同步批量 INSERT 把这些开销合并了。解决实验里造数据时用一条 INSERT 带多组 VALUES 的写法比如 VALUES (1,a),(2,b),...一次插入几百行。如果数据量再大可以考虑用 LOAD DATA INFILE 导入 CSV。注意批量 INSERT 也不是越大越好单条 SQL 超过 MySQL 的 max_allowed_packet 值会报错默认是 64MB按需分批。5.8 权限管理Root 用户被锁进了坑里出不来现象你创建了一个新用户授予了部分权限测试时发现新用户能查到不该查到的数据或者更严重——你把 root 的权限改坏了导致数据库拒绝连接。原因MySQL 的权限控制是基于用户主机组合的localhost 和 % 是两个不同的记录。你如果只改了一条而没改另一条MySQL 会用另一条旧配置。解决做权限实验前先备份权限相关的系统表尤其是 db、user 表。用 FLUSH PRIVILEGES 刷新权限缓存。如果 root 被锁可以在配置文件的 [mysqld] 段加一行 skip-grant-tables 跳过权限检查重启改回来再重启。这个技能在实验报告里可以作为加分项写进去但操作时一定小心不要在计算设备上随意尝试。6. 资源下载拿到手的文件怎么用效率最高下载解压后里面是完整的 SQL 脚本集和一份实验报告模板文件按执行顺序编号排列。不要从头到尾直接全部执行一遍就完事那样最多只能让你拿到一个能跑的数据库但你仍然说不清每个表为什么这样设计。建议按我的做法来第一步先把编号为 01 的建库脚本执行起来建一个干净的空数据库第二步把建表脚本打开但不执行一行一行读字段注释遇到不理解的语句在编辑器里标注第三步自己独立写完所有建表语句再和资源里的脚本逐表对比找出差异后分析为什么对方的写法更合理。做完整套对比、补上自己遗漏的关系之后再到 Navicat 或 DBeaver 里把整个脚本执行一遍。验证方式是用几条业务用例做端到端测试下单、扣库存、查订单、看日志表、回头看库存预警视图把这条链路跑通了才说明实验设计真的对了。不同分支版本里实验可能对数据库版本有要求。这个资源里的脚本是以 MySQL 8.0 为基础写的在 5.7 上大部分也能跑。如果用的是 SQL Server 或 Oracle 版本触发器和存储过程语法有差异比如 SQL Server 不支持 DELIMITER 语法Oracle 需要把存储过程包在 PACKAGE 里需要你自己对照翻译——这也是一个锻炼迁移能力的好机会。我还留了一套扩展用例把订单表的 order_status 字段改成 ENUM 类型来减少非法状态值再配合一个更新触发器自动记录状态变更时间这个设计在生产环境中相当常见你可以拿来作为加分项写进实验报告。数据库实验和学习中最大的障碍不是语法而是自己设计时的逻辑漏洞。就像我那次做库存管理实验设计表时没考虑同一本书多个订单并发扣库存的情况触发器写完测试时单线程没问题一开两个窗口同时下单立刻翻车从那以后我每次写完触发器都强制跑一遍并发场景用两个事务窗口模拟同一本书的抢购确认没有死锁和超卖才继续下一个功能。这个习惯希望帮到你。本文还有配套的精品资源点击获取

相关新闻

ILSpy汉化版实战:DLL反编译与C#源码恢复全攻略

ILSpy汉化版实战:DLL反编译与C#源码恢复全攻略

简介:ILSpy中文汉化版是一款面向.NET开发者的免费开源反编译工具,主要解决开发者无源码时查看程序集内部实现、学习优秀代码设计、排查第三方库问题的需求。该版本基于官方ILSpy完成全界面汉化,中文用户可直接使用反编译、可视化浏览、资源查…

2026/10/9 16:43:02 阅读更多 →
基于QT的教务选课管理系统:数据库事务与并发选课实战解析

基于QT的教务选课管理系统:数据库事务与并发选课实战解析

简介:这是一份基于QT开发的教务选课管理系统完整毕业设计资源,适合计算机相关专业学生用于课程设计、毕业设计或QT桌面应用开发入门参考。系统涵盖学生、教师、课程三类基本信息管理,支持增删查改、界面显示与排序;选课与退课模块…

2026/10/9 16:43:01 阅读更多 →
从控制体出发推导N-S方程:输运方程与动量守恒的通俗解读

从控制体出发推导N-S方程:输运方程与动量守恒的通俗解读

1. 从“控制体”视角看流体,N-S方程不再是天书我学流体力学的时候,也干过一件蠢事:把N-S方程当英语单词,先抄三遍再背三遍,结果考完就忘,做题照样卡壳。后来才想明白,问题不在于记性&#xff0c…

2026/10/9 16:43:00 阅读更多 →

最新新闻

Func、Skill 与 MCP:Agent 工具调用三层架构实战指南

Func、Skill 与 MCP:Agent 工具调用三层架构实战指南

最近在折腾 Agent 开发时,被一个概念问题搞得有点上头:工具到底该用 func、skill 还是 MCP?搜索引擎的结果五花八门,有说 skill 是未来,有说 MCP 才是标准,还有的直接把 function calling 当成全部。等我把…

2026/10/9 17:18:14 阅读更多 →
Android HTML答题引擎:Kotlin+Java双语言深度集成方案

Android HTML答题引擎:Kotlin+Java双语言深度集成方案

简介:这是一份面向Android开发初学者与进阶学习者的HTML整合型答题APP完整源码项目,适用于移动应用开发实践、混合式界面设计及Kotlin/Java协同开发场景。资源共786个文件,总大小47.87MB,涵盖182个Java与8个Kotlin源文件&#xff…

2026/10/9 17:18:14 阅读更多 →
手写BP神经网络实现鸢尾花和红酒分类:从原理到避坑

手写BP神经网络实现鸢尾花和红酒分类:从原理到避坑

简介:这是一份面向高校机器学习课程的BP神经网络实验资源,以鸢尾花与红酒数据集为对象,完成二分类/多分类建模练习,适合正在学习前馈神经网络、反向传播算法或需要快速搭建课程实验的学生参考。压缩包共收录18个文件,包…

2026/10/9 17:18:14 阅读更多 →
Ubuntu下zip压缩解压指南:命令行操作、乱码解决与tar.gz选型

Ubuntu下zip压缩解压指南:命令行操作、乱码解决与tar.gz选型

我最近在整理一批旧项目的归档文件,同事从Windows那边发过来的压缩包在Ubuntu下面解压时又是一堆乱码文件名,加上自己这边要批量打包日志目录上传,来来回回折腾了好几次。索性把在Ubuntu下用zip压缩和解压文件夹的完整操作、踩坑记录和替代方…

2026/10/9 17:18:14 阅读更多 →
MySQL新手避坑指南:从命令行实操到生产级排错

MySQL新手避坑指南:从命令行实操到生产级排错

简介:本资源是一份面向数据库初学者与Web开发入门者的MySQL基础教学课件,聚焦关系型数据库核心概念、设计方法与SQL实践,特别适合高校计算机课程教学、自学备考及后端开发岗新人夯实基础。课件以PPTX格式呈现,共1个文件&#xff0…

2026/10/9 17:18:13 阅读更多 →
抽象工厂与原型模式对比:从产品族到对象复制的创建型模式选型指南

抽象工厂与原型模式对比:从产品族到对象复制的创建型模式选型指南

说实话,我最早把抽象工厂和原型模式放在一起对比,并不是因为它俩长得像,恰恰相反,它俩一个是"批量生产新对象",一个是"复制已有对象",从设计思路上八竿子打不着。但最近在给几个做技术…

2026/10/9 17:17:10 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

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

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

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

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

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

2026/10/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 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/8 21:13:17 阅读更多 →
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/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练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/9 6:17:20 阅读更多 →