学生选课系统数据库设计:从表结构到并发控制,避免选课季崩溃
简介这份PPT面向高校计算机相关专业学生与数据库课程学习者聚焦学生选课系统的数据库设计全流程可作为期末课设、课程答辩或数据库综合练习的参考方案。资源包共1个pptx文件大小约629KB以幻灯片形式系统梳理了需求分析、概念结构设计、逻辑结构设计与数据库实施维护等核心环节。内容涵盖教师、学生、管理员三类角色的功能划分院系、专业、班级、课程、教研室等实体的E-R图建模以及从E-R模型向关系模型转换的完整过程并逐一给出各表的规范化分析说明如何达到第三范式、避免数据冗余与更新异常。读者可借此掌握多对多、一对多关系的处理方法理解选课联系表的分解思路并参考八张表的最终结构完成自己的数据库设计。目前已有2285人学习适合需要完整设计框架与规范化分析范例的读者。1. 学生选课系统数据库设计为什么你的第一版表结构总在选课季崩掉每年选课季总有一批学生选课系统的数据库被瞬时流量打穿。表面看是并发问题根子往往在数据库设计阶段就埋下了。学生选课系统~数据库设计这个题目看起来像是课程作业级别的练手题但真正做过生产环境的人都知道它几乎覆盖了关系型数据库设计的全部核心难点多对多关系、事务竞争、热点行更新、历史数据归档、容量规划。我见过太多团队把选课系统当玩具做结果上线第一周就出现超卖、死锁、查询超时三连击。这篇文章面向的是正在做选课系统、或者准备重构选课模块的开发者我会从表结构设计一路讲到并发控制、索引策略和压测验证把每一步的参数和踩坑点都摊开说。如果你只想要一个能跑的 demo随便建几张表就够了但如果你想让系统在选课季不翻车下面的内容值得逐段看完。2. 表结构设计从 ER 图到建表语句的完整落地2.1 核心实体识别与关系梳理选课系统的数据库设计第一步不是急着写 CREATE TABLE而是把实体和关系理清楚。常见做法是先画一张 ER 图但很多新手画的 ER 图只停留在“学生选课程”这个层面漏掉了学期、教学班、培养方案、先修课这些关键实体。我一般会按下面的顺序做实体识别学生student学号、姓名、院系、年级、状态课程course课程号、课程名、学分、课程性质必修/选修教学班teaching_class教学班号、课程号、学期、教师、容量、已选人数选课记录enrollment选课 ID、学号、教学班号、选课时间、状态学期semester学期 ID、学期名称、选课开始时间、选课结束时间这里最关键的一个区分是“课程”和“教学班”。课程是抽象概念比如“数据结构”这门课教学班是具体开设的实例比如“2024 秋季数据结构 01 班”。一个课程可以有多个教学班选课实际上是选教学班不是选课程。很多第一版设计把这两个概念合并成一张表结果同一个课程多个老师开课时就傻眼了。另一个容易漏掉的是选课状态。选课记录不能只有“已选”一种状态至少要有已选、已退、被踢教师操作、候补。状态字段的设计直接影响后续查询和统计逻辑。2.2 建表语句与字段类型选择下面是我常用的一套建表语句以 MySQL 8.0 为例字段类型的选择都有明确理由-- 学生表 CREATE TABLE student ( student_id VARCHAR(12) NOT NULL COMMENT 学号固定12位, name VARCHAR(32) NOT NULL COMMENT 姓名, department VARCHAR(64) NOT NULL COMMENT 院系, grade SMALLINT NOT NULL COMMENT 入学年份, status TINYINT NOT NULL DEFAULT 1 COMMENT 1在读 2休学 3毕业, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (student_id), KEY idx_department_grade (department, grade) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT学生表; -- 课程表 CREATE TABLE course ( course_id VARCHAR(10) NOT NULL COMMENT 课程号, course_name VARCHAR(64) NOT NULL COMMENT 课程名, credit DECIMAL(3,1) NOT NULL COMMENT 学分保留1位小数, course_type TINYINT NOT NULL COMMENT 1必修 2选修 3通识, PRIMARY KEY (course_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT课程表; -- 教学班表 CREATE TABLE teaching_class ( class_id BIGINT NOT NULL AUTO_INCREMENT COMMENT 教学班ID, course_id VARCHAR(10) NOT NULL COMMENT 课程号, semester_id INT NOT NULL COMMENT 学期ID, teacher_name VARCHAR(32) NOT NULL COMMENT 授课教师, capacity SMALLINT NOT NULL COMMENT 容量上限, enrolled_count SMALLINT NOT NULL DEFAULT 0 COMMENT 已选人数, schedule_info VARCHAR(128) DEFAULT NULL COMMENT 上课时间地点, PRIMARY KEY (class_id), KEY idx_course_semester (course_id, semester_id), KEY idx_semester (semester_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT教学班表; -- 选课记录表 CREATE TABLE enrollment ( enroll_id BIGINT NOT NULL AUTO_INCREMENT COMMENT 选课记录ID, student_id VARCHAR(12) NOT NULL COMMENT 学号, class_id BIGINT NOT NULL COMMENT 教学班ID, status TINYINT NOT NULL DEFAULT 1 COMMENT 1已选 2已退 3被踢 4候补, enroll_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 选课时间, PRIMARY KEY (enroll_id), UNIQUE KEY uk_student_class (student_id, class_id), KEY idx_class_status (class_id, status), KEY idx_student_status (student_id, status) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT选课记录表;这套建表语句有几个设计决策需要解释。第一学号用 VARCHAR(12) 而不是 INT因为学号可能包含前导零而且不同学校的学号规则不同用字符串更安全。第二学分用 DECIMAL(3,1) 而不是 FLOAT避免浮点精度问题0.5 学分的课程很常见。第三教学班表的 enrolled_count 是一个冗余字段目的是避免每次查询已选人数都要 COUNT 选课记录表这个字段的更新策略后面会详细讲。第四选课记录表的唯一索引 uk_student_class 保证同一个学生不能重复选同一个教学班这是最基础的约束。2.3 索引策略与查询模式匹配索引不是越多越好选课系统的索引设计要匹配实际的查询模式。我梳理了选课系统最常见的五类查询查询场景典型 SQL 条件推荐索引学生查已选课程WHERE student_id? AND status1idx_student_status教学班查选课名单WHERE class_id? AND status1idx_class_status按学期查开课列表WHERE semester_id?idx_semester查某课程的所有教学班WHERE course_id? AND semester_id?idx_course_semester统计选课人数WHERE class_id? AND status1idx_class_status注意 idx_class_status 和 idx_student_status 这两个联合索引的字段顺序。class_id 在前是因为按教学班查名单的查询频率更高而且 class_id 的区分度比 status 大。如果反过来把 status 放在前面因为 status 只有几个值索引选择性会很差优化器可能直接走全表扫描。还有一个容易被忽略的点选课记录表的 enroll_time 字段。如果业务需要按选课时间排序比如候补转正按先来后到那么 idx_class_status 可以扩展成 (class_id, status, enroll_time)这样排序也能走索引避免 filesort。3. 并发控制选课季不超卖的核心机制3.1 超卖问题的本质与三种解决方案选课系统最经典的 bug 就是超卖教学班容量 50 人结果选了 52 个人。超卖的本质是“检查容量”和“插入选课记录”这两个操作不是原子的。两个请求同时读到 enrolled_count49都认为还有一个名额然后都插入记录最后变成 51 人。解决超卖有三种常见方案我逐一分析适用场景方案一数据库悲观锁。在事务中用 SELECT ... FOR UPDATE 锁住教学班行再检查容量、插入记录、更新计数。这是最直观的方案适合并发量不高的场景。缺点是锁竞争激烈时大量请求排队响应时间飙升。方案二数据库乐观锁。在 teaching_class 表加一个 version 字段更新时检查版本号。适合冲突较少的场景但选课季冲突非常频繁乐观锁会导致大量重试。方案三Redis 预扣减 异步落库。把容量扣减放在 Redis 里用 Lua 脚本原子执行扣减成功后再异步写入数据库。这是高并发场景的主流方案但引入了缓存和数据库一致性问题。我一般会先用方案一跑通业务逻辑等压测发现瓶颈后再考虑方案三。不要一上来就上 Redis复杂度会拖慢开发进度。3.2 悲观锁方案的完整实现下面是基于悲观锁的选课核心逻辑用 Python 伪代码展示事务边界def enroll_course(student_id, class_id): conn get_connection() try: conn.begin() # 1. 锁住教学班行防止并发修改 cursor.execute( SELECT capacity, enrolled_count FROM teaching_class WHERE class_id %s FOR UPDATE, (class_id,) ) row cursor.fetchone() if row is None: raise BizError(教学班不存在) capacity, enrolled row # 2. 检查容量 if enrolled capacity: raise BizError(容量已满) # 3. 检查是否已选唯一索引兜底 cursor.execute( SELECT enroll_id FROM enrollment WHERE student_id %s AND class_id %s AND status 1, (student_id, class_id) ) if cursor.fetchone(): raise BizError(已选过该教学班) # 4. 插入选课记录 cursor.execute( INSERT INTO enrollment (student_id, class_id, status) VALUES (%s, %s, 1), (student_id, class_id) ) # 5. 更新已选人数 cursor.execute( UPDATE teaching_class SET enrolled_count enrolled_count 1 WHERE class_id %s, (class_id,) ) conn.commit() except Exception as e: conn.rollback() raise e finally: conn.close()这段代码的关键点在于 FOR UPDATE 的位置。必须在事务开始后第一时间锁住教学班行而且锁的行要尽量少。如果先查选课记录再锁教学班两个事务可能互相等待造成死锁。另外UPDATE 语句用的是 enrolled_count enrolled_count 1 而不是先读后写这样即使有并发也能保证计数正确。参数方面事务隔离级别建议用 READ COMMITTED 而不是默认的 REPEATABLE READ。RC 级别下锁的持有时间更短并发性能更好而且选课场景不需要可重复读。在 MySQL 中可以通过 SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED 设置。3.3 热点行更新的性能瓶颈与优化悲观锁方案在单教学班并发超过 200 时会出现明显排队。原因是所有请求都在竞争同一行的锁。我做过一轮压测单行锁在 4 核 8G 的机器上TPS 大概在 300 左右就到顶了。优化思路有两个方向。第一个方向是减少锁持有时间把选课记录插入和计数更新放在同一个事务里但把非关键操作比如写日志、发通知移到事务外异步执行。第二个方向是拆分热点如果某个教学班特别热门可以考虑把容量拆成多个桶每个桶独立计数但这对业务逻辑有侵入一般不建议。更实用的优化是给 teaching_class 表的 enrolled_count 更新加一个条件UPDATE ... WHERE class_id ? AND enrolled_count capacity。这样即使锁竞争也能保证不会超卖而且更新失败时直接返回“容量已满”省去了先查后判的步骤。4. 避坑指南选课系统数据库设计的五个血泪教训4.1 坑一用 COUNT 查已选人数导致慢查询现象选课列表页加载越来越慢教学班多了之后查询超时。原因每次查教学班列表都执行 SELECT COUNT(*) FROM enrollment WHERE class_id ? AND status 1当选课记录表达到百万级时即使有索引大量 COUNT 操作也会拖垮数据库。解决在 teaching_class 表维护 enrolled_count 冗余字段选课和退课时同步更新。注意更新要用原子操作退课时用 enrolled_count enrolled_count - 1并且加 WHERE enrolled_count 0 防止减成负数。如果担心数据不一致可以每天凌晨跑一次对账脚本修正。4.2 坑二退课不释放容量导致名额浪费现象学生退课后教学班显示已选人数没减少其他学生选不进来。原因退课逻辑只更新了 enrollment 表的 status 字段忘记同步更新 teaching_class 的 enrolled_count。解决把退课和选课放在同一个服务层方法里确保两个表的更新在同一个事务中。退课逻辑要检查当前状态是否为“已选”避免重复退课导致计数错误。另外候补转正逻辑也要在退课时触发从候补队列里取第一个学生自动选上。4.3 坑三唯一索引冲突没有友好处理现象学生重复点击选课按钮页面报 500 错误日志里是 Duplicate entry 异常。原因唯一索引 uk_student_class 阻止了重复插入但代码没有捕获这个异常直接抛到上层。解决在插入选课记录时捕获 IntegrityError返回“已选过该课程”的友好提示。更好的做法是在插入前先查一次虽然不能完全避免并发冲突但能拦截大部分重复请求。前端也要做按钮防抖减少无效请求。4.4 坑四学期切换时数据没有隔离现象新学期开始后学生能看到上学期的选课记录统计报表也混在一起。原因查询选课记录时没有按学期过滤或者教学班表的 semester_id 没有正确关联。解决所有涉及选课的查询都要带上学期条件。enrollment 表虽然不直接存 semester_id但可以通过 class_id 关联 teaching_class 获取。如果查询频繁可以考虑在 enrollment 表冗余一个 semester_id 字段用空间换时间。学期切换时把旧学期的数据归档到历史表减少主表数据量。4.5 坑五压测时用错隔离级别导致死锁频发现象压测时数据库频繁出现 Deadlock found when trying to get lock 错误。原因默认的 REPEATABLE READ 隔离级别下间隙锁的范围更大两个事务如果加锁顺序不一致就容易死锁。解决把选课相关事务的隔离级别设为 READ COMMITTED减少间隙锁。同时确保所有事务都按相同的顺序加锁比如先锁 teaching_class 再操作 enrollment。如果还是出现死锁检查是否有事务在锁住教学班后又去锁学生表这种跨表的加锁顺序要统一。5. 验证与进阶用压测数据驱动索引优化5.1 构造压测数据与执行压测设计完成后必须验证。我一般用 sysbench 或者自己写脚本构造数据。选课系统的压测重点是模拟并发选同一个热门教学班的场景。下面是一个简单的 Python 压测脚本框架import threading import pymysql import time def enroll_worker(student_id, class_id, results, idx): conn pymysql.connect(hostlocalhost, usertest, passwordtest, databasecourse_system, autocommitFalse) try: cursor conn.cursor() conn.begin() cursor.execute(SELECT capacity, enrolled_count FROM teaching_class WHERE class_id %s FOR UPDATE, (class_id,)) row cursor.fetchone() if row and row[1] row[0]: cursor.execute(INSERT INTO enrollment (student_id, class_id, status) VALUES (%s, %s, 1), (student_id, class_id)) cursor.execute(UPDATE teaching_class SET enrolled_count enrolled_count 1 WHERE class_id %s, (class_id,)) conn.commit() results[idx] success else: conn.rollback() results[idx] full except Exception as e: conn.rollback() results[idx] str(e) finally: conn.close() def run_test(concurrency, total): results [None] * total threads [] for i in range(total): t threading.Thread(targetenroll_worker, args(fS{i:010d}, 1, results, i)) threads.append(t) start time.time() for t in threads: t.start() for t in threads: t.join() elapsed time.time() - start success results.count(success) print(f并发 {concurrency} 总请求 {total} 成功 {success} 耗时 {elapsed:.2f}s fTPS {total/elapsed:.0f}) if __name__ __main__: run_test(50, 500)这个脚本模拟 500 个学生抢同一个教学班。运行后观察 TPS 和成功数如果成功数等于容量说明没有超卖。然后逐步提高并发数找到 TPS 开始下降的拐点那就是当前方案的容量上限。5.2 根据压测结果调整索引和参数压测跑完后用 EXPLAIN 分析慢查询重点看这几个指标type 是否为 ref 或 eq_refrows 扫描行数是否过大Extra 是否出现 Using filesort 或 Using temporary。如果选课名单查询出现 filesort说明排序字段没走索引需要调整联合索引的字段顺序。MySQL 的几个关键参数也值得调整。innodb_buffer_pool_size 建议设为物理内存的 60% 到 70%选课系统的热数据主要是教学班和选课记录缓冲池够大才能减少磁盘 IO。innodb_flush_log_at_trx_commit 如果对数据安全性要求不是极致可以设为 2把日志刷盘频率从每次事务降低到每秒一次能显著提升写入性能。max_connections 要根据压测结果调整太小会导致连接等待太大反而增加上下文切换开销。5.3 一个容易被忽略的技巧用覆盖索引减少回表最后分享一个我在实际项目中验证有效的技巧。选课名单查询如果只需要学号和选课时间可以建一个覆盖索引ALTER TABLE enrollment ADD INDEX idx_class_status_cover (class_id, status, student_id, enroll_time);这样查询 SELECT student_id, enroll_time FROM enrollment WHERE class_id ? AND status 1 时数据直接从索引里取不需要回表查主键。在选课记录表达到千万级时这个优化能把查询时间从几百毫秒降到几十毫秒。代价是索引占用的空间变大了但选课系统的写入频率远低于查询频率这个 trade-off 是值得的。我自己踩过最深的坑是早期版本没有加覆盖索引选课名单页面在选课季第一天就崩了后来加了索引才扛住。数据库设计这件事前期多花一小时想清楚后期能省一周的救火时间。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

高考满分作文与数学45分:偏科生的天赋困境与突围路径

高考满分作文与数学45分:偏科生的天赋困境与突围路径

看到这则新闻的后续,我心里咯噔了一下。前段时间大家都在讨论那位高考作文写古体长诗拿到满分的考生,一片赞叹声还没落下,就被“数学仅得45分”这个后续浇了个透心凉。满分作文和45分数学,出现在同一个人身上,这种极端…

2026/10/17 13:45:52 阅读更多 →
WinForms+SQLite+EF Core本地数据层方案详解

WinForms+SQLite+EF Core本地数据层方案详解

简介:基于 .NET Framework 4.8 的 WinForms 桌面示例项目,演示了如何在桌面程序中集成 SQLite 数据库与 EntityFramework ORM 框架,适合正在学习 C# 桌面开发、数据持久化或对象关系映射的开发者参考,也可作为小型数据管理工具的起…

2026/10/16 19:26:58 阅读更多 →
防沉迷SDK接入全解析:状态机设计、跨平台实践与避坑指南

防沉迷SDK接入全解析:状态机设计、跨平台实践与避坑指南

简介:一套手机游戏防沉迷系统SDK,同时兼容iOS、Android及Unity引擎,主要面向需要完成毕业设计、课程设计或工程实训的学生,也适合希望快速为游戏接入合规实名认证与防沉迷限制的开发者。压缩包共331个文件,大小约10.8M…

2026/10/12 14:45:15 阅读更多 →

最新新闻

AI时代程序员必看:脱离大模型,你还能独立工作吗?Vibe Coding挑战与应对

AI时代程序员必看:脱离大模型,你还能独立工作吗?Vibe Coding挑战与应对

本文探讨了Vibe Coding(氛围编码)如何借助AI改变编程方式,引发对程序员核心能力的思考。文章指出,AI擅长生成代码,但复杂系统判断、风险识别仍需人类智慧。强调基础知识和底层原理的重要性,提出程序员应驾驭…

2026/10/17 13:45:46 阅读更多 →
2026年企业网盘终极对比:坚果云 vs OneDrive vs Dropbox vs 百度网盘企业版

2026年企业网盘终极对比:坚果云 vs OneDrive vs Dropbox vs 百度网盘企业版

文章目录一、企业网盘选型,为什么不能只看容量和价格?二、测评方法论:15 个维度的统一标尺2.1 测评维度定义2.2 测试环境说明三、四款产品逐一深度测评3.1 坚果云团队版 —— 专业同步盘,技术团队首选🔧 核心技术要点拆…

2026/10/17 13:45:46 阅读更多 →
新手程序员必看:3个实操任务,教你如何高效利用AI大模型提升办公效率

新手程序员必看:3个实操任务,教你如何高效利用AI大模型提升办公效率

本文介绍了如何通过三个具体任务(整理文件、汇总资料、生产公众号文章)来测试和利用AI大模型提高办公效率。文章强调了明确任务需求、设定边界条件以及验证交付物的重要性,并提供了可直接复制的提示词模板。通过这些实操步骤,即使…

2026/10/17 13:45:46 阅读更多 →
普通人也能抓住的AI高薪风口!学会这些技能,薪资翻倍不是梦

普通人也能抓住的AI高薪风口!学会这些技能,薪资翻倍不是梦

AI岗位迎来大爆发,2026年1-7月同比暴涨近8倍,平均月薪破6万。不再是顶尖技术人才专属,运营、文案等普通岗位也能结合AI提效。普通人只需学会借助AI工具优化工作,即可快速提升竞争力,实现薪资翻倍。抓住AI风口&#xff…

2026/10/17 13:45:46 阅读更多 →
C# OpenXml 操作 Word 表格:从基础结构到样式合并的完整指南

C# OpenXml 操作 Word 表格:从基础结构到样式合并的完整指南

简介:面向需要在C#程序中自动化生成Word报表的.NET开发者,这份PDF演示了如何借助OpenXml SDK为Word文档添加表格。内容从引入DocumentFormat.OpenXml命名空间开始,逐步讲解AddTable方法的封装、TableGrid列数定义、表格边框样式设置&#xff…

2026/10/17 13:45:46 阅读更多 →
TPS54201低输入电压hiccup误触发,PNP三极管补偿方案解析

TPS54201低输入电压hiccup误触发,PNP三极管补偿方案解析

简介:面向LED照明系统设计人员,尤其适合熟悉电源管理IC与LED驱动器的工程师,围绕TPS54201宽输入电压(4.5V~28V)1.5A同步降压LED驱动芯片,解决低输入电压下负载LED电流不稳定的问题,并给出实际电…

2026/10/17 13:44:45 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 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/16 21:54:38 阅读更多 →
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/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →