会议室预订系统高并发设计:时段切片与Redis原子锁实战
简介这是一套基于Django框架开发的会议室预订系统源码面向Web开发初学者与中小型组织信息化建设者解决会议室资源调度混乱、预订冲突频发、管理效率低下的实际问题。项目采用前后端一体化设计涵盖用户登录、会议室查询、时段预订、冲突检测、取消预约及管理员权限控制等核心功能适合作为Django MVC模式实践案例或企业内部轻量级预约工具二次开发基础。资源包共73个文件含14个Python后端逻辑文件models.py、views.py、urls.py等、7个JS前端交互脚本、5个CSS样式文件、2个HTML模板页及1个SQLite3数据库文件辅以配置、静态资源与IDE元数据整体仅471KB结构清晰、开箱即用。目前已有620人学习下载读者可直接运行调试深入理解Django ORM建模、CBV视图组织、模板渲染机制及前后端协同逻辑并快速掌握会议室类业务系统的完整开发范式。1. 会议室预订代码不是写个表单就完事而是要扛住并发抢订、时段冲突校验、权限穿透和日历同步这四重压力“会议室预订代码”听起来像入门级 CRUD 练手项目但真实业务里它常是内部系统第一个被骂爆的模块——某公司上线新预订系统首周市场部连续三天抢不到大会议室做产品发布会行政同事手动改 Excel 表格补漏到凌晨某高校实验室的智能预约平台在学期初选课高峰因未处理好“同一时段多人提交”导致重复锁定三组学生同时收到“预订成功”通知现场撞车。这类系统失败90% 不是因为没写完功能而是没想清楚谁在什么时间、以什么身份、通过什么路径、触发了哪类资源状态变更。它本质是轻量级工作流引擎 分布式锁 日历语义解析器的组合体核心挑战不在界面而在状态一致性保障。适合刚脱离 Hello World 的开发者练手高并发场景下的业务建模能力也适合有经验的工程师重构老旧系统时建立防御性编码习惯。本文不讲 Django/Flask 框架怎么搭只聚焦“预订”这个动作背后必须落地的五层逻辑资源建模、时段切片、冲突判定、并发控制、外部同步。2. 用「时段切片 冲突矩阵」建模会议室资源为什么不能直接存 start_time/end_time 字段很多新手一上来就建表CREATE TABLE bookings ( id BIGINT PRIMARY KEY, room_id INT, start_time DATETIME, end_time DATETIME, user_id INT );然后查冲突用WHERE ? BETWEEN start_time AND end_time OR ? BETWEEN start_time AND end_time—— 这是典型翻车起点。问题出在时间是连续域数据库索引对范围查询天然低效且无法表达“部分重叠”的语义边界。更致命的是它把“3:00–4:00 被占用”和“3:00–3:30 被占用”当成同构数据而实际业务中后者可能允许拼接如两人各订半小时前者则绝对禁止。2.1 采用「最小时间粒度切片」替代原始时间区间我们约定最小粒度为 15 分钟可配置将一天划分为 96 个 slot00:00–00:15 为 slot 0…23:45–24:00 为 slot 95。每个预订不再存起止时间而是存room_id date slot_list其中slot_list是整数数组或位图bitmask。例如预订 14:00–15:30 → 对应 slot [56, 57, 58, 59, 60, 61]14:0056×15min预订 10:15–10:45 → 对应 slot [41, 42, 43]这样做的好处冲突判定变成位运算两个预订冲突 ⇔slot_list_a slot_list_b ! 0索引高效room_id date slot_index可建联合索引查询某会议室某天某 slot 是否被占走索引回表仅需 O(1)支持灵活策略若需“允许相邻 slot 拼接”只需在应用层检查slot_list_a | slot_list_b是否连续若需“禁止跨午休时段”可预设 slot 分组标签如lunch_break [28,29,30,31]提示位图方案在 slot 数 ≤ 64 时可用BIGINT存储如 MySQLBIT(64)超过则用VARBINARY(12)存 96 bit 12 字节数组方案更直观但需额外去重逻辑。2.2 构建「冲突矩阵」显式表达资源约束关系光有 slot 不够。会议室有隐含规则A 会议室支持视频会议 → 需校验是否已预订同楼栋的 AV 设备B 会议室最大容纳 8 人 → 需关联用户部门人数上限C 会议室工作日 9:00 前不可用 → 属于“静态禁用时段”我们引入resource_constraints表CREATE TABLE resource_constraints ( id BIGINT PRIMARY KEY, resource_type ENUM(room, device, person) NOT NULL, resource_id INT NOT NULL, constraint_type ENUM(time_blacklist, capacity, dependency) NOT NULL, constraint_value JSON NOT NULL, -- 如 {start: 08:00, end: 09:00} 或 {max: 8} effective_from DATE, effective_to DATE );当用户提交预订时系统先查该会议室所有 active constraints再动态生成本次请求的“合法 slot 集合”最后与已有预订取交集。这比在 SQL 里硬写WHERE条件更易维护、可热更新。3. 用 Redis Lua 脚本实现原子化预订为什么乐观锁和数据库事务都不够用假设两个用户几乎同时提交对同一会议室 14:00–15:00 的预订。常见错误方案✅ 方案 A数据库唯一索引建(room_id, date, start_time, end_time)唯一索引 → 失败因为14:00–15:00和14:30–15:30不违反唯一性但业务上冲突。✅ 方案 BSELECT FOR UPDATE查是否有冲突 → 无 → INSERT → 但两事务查的都是“无冲突”最终双写成功。✅ 方案 C应用层加 synchronized单机有效集群下完全失效。真正可靠的解法是把“检查冲突 写入预订”封装成一个不可分割的原子操作且该操作必须跨进程可见。Redis 的单线程执行模型 Lua 脚本天然满足。3.1 设计 Redis Key 结构与 Lua 脚本逻辑Key 设计原则以资源为维度隔离避免全局锁。会议室维度room:{room_id}:date:{YYYYMMDD}→ value 为位图字符串如0000000100...每位代表一个 slot设备维度device:{device_id}:date:{YYYYMMDD}→ 同构Lua 脚本book_room.lua核心逻辑-- 输入KEYS[1]room_key, ARGV[1]slot_bitmap (e.g., 0000000100...), ARGV[2]booking_id local room_key KEYS[1] local target_slots ARGV[1] local booking_id ARGV[2] -- 1. 获取当前占用位图 local current_occupy redis.call(GET, room_key) if not current_occupy then current_occupy string.rep(0, 96) -- 初始化全空 end -- 2. 位运算检查冲突target current ! 0 ? local conflict false for i1,#target_slots do if string.sub(target_slots,i,i) 1 and string.sub(current_occupy,i,i) 1 then conflict true break end end if conflict then return {0, conflict} -- 0失败 end -- 3. 原子更新current | target local new_occupy for i1,#current_occupy do local c1 string.sub(current_occupy,i,i) local c2 string.sub(target_slots,i,i) if c1 1 or c2 1 then new_occupy new_occupy .. 1 else new_occupy new_occupy .. 0 end end -- 4. 写入新位图并记录 booking_id 到集合用于后续取消 redis.call(SET, room_key, new_occupy) redis.call(SADD, bookings:..room_key, booking_id) return {1, success} -- 1成功3.2 Python 调用脚本并处理返回值import redis import json r redis.Redis(hostlocalhost, port6379, db0) # 预加载脚本生产环境应提前 load with open(book_room.lua) as f: script_content f.read() book_script r.register_script(script_content) def try_book_room(room_id: int, date_str: str, slots: list[int]) - bool: # 将 slots 转为 96-bit 字符串如 [56,57,58] → 000...111000第56/57/58位为1 bitmap [0] * 96 for s in slots: if 0 s 96: bitmap[s] 1 target_bitmap .join(bitmap) room_key froom:{room_id}:date:{date_str} result book_script( keys[room_key], args[target_bitmap, fb_{int(time.time())}_{room_id}] ) if result[0] 1: return True else: # result[1] 是错误原因可记录日志 logger.warning(fBooking failed for {room_key}: {result[1]}) return False # 调用示例 if try_book_room(room_id101, date_str20240520, slots[56,57,58,59]): print(✅ 预订成功) else: print(❌ 预订失败时段已被占用)注意此脚本假设 slot 总数固定为 96。若需支持不同粒度如 30 分钟可将位图长度参数化但需同步修改 Lua 脚本循环逻辑。生产环境建议用BITOP命令替代手动字符串拼接性能更高。4. 预订冲突排查5 个血泪经验总结的必踩坑点与修复方案线上系统最怕的不是功能没做而是“看似正常却悄悄出错”。以下是我在三个不同规模项目中反复验证过的冲突类问题每一条都对应一次深夜告警。4.1 现象同一会议室同一时段A 用户看到“可预订”B 用户提交后 A 刷新仍显示“可预订”但实际已被占原因前端缓存了/api/available-slots?room101date20240520的响应且未设置Cache-Control: no-cache或 ETag。用户看到的是 5 分钟前的快照。解决所有时段查询接口强制添加Cache-Control: no-store前端调用预订接口前必须先用POST /api/check-conflict实时校验该接口不缓存且走相同 Redis 脚本逻辑。4.2 现象用户预订 13:00–14:00 成功但日历视图里显示 13:00–13:45 和 13:45–14:00 两条记录原因前端将13:00–14:00拆成两个 15 分钟 slot52,53但后端存储时误将slot_list当作字符串存入 JSON 字段如[52,53]导致 Redis 脚本读取时解析失败实际只写了 slot 52。解决严格区分数据传输层JSON与存储层位图。前端传slots: [52,53]后端立即转为位图字符串绝不把数组存进 Redis value数据库中bookings表只存booking_id,room_id,date,raw_slots_json仅作审计用主逻辑完全依赖 Redis 位图。4.3 现象跨天预订如 22:00–01:00永远失败原因日期字段date_str固定取start_time.date()导致 22:00–01:00 被拆到两个 keyroom:101:date:20240520和room:101:date:20240521而脚本只锁一个 key。解决禁止跨天预订业务规则或强制拆单自动创建两条预订记录分别对应20240520 22:00–24:00和20240521 00:00–01:00并用事务保证两者同时成功/失败。4.4 现象管理员后台“强制取消”某预订后该时段仍显示被占原因取消操作只删了数据库bookings表但未同步更新 Redis 位图。Redis 中该 slot 仍是1。解决所有状态变更必须双写DB Redis且取消流程为① 读取原预订的slot_list→ ② Redis 执行BITOP XOR清除对应位 → ③ 删除 DB 记录。严禁反向操作先删 DB 再清 Redis因网络分区可能导致 DB 删成功而 Redis 失败造成“幽灵占用”。4.5 现象节假日会议室自动关闭但用户仍能预订成功原因resource_constraints表中constraint_typetime_blacklist的规则未在预订脚本中加载。脚本只做了 slot 冲突检查没查约束表。解决将约束检查前置到 Lua 脚本中。方法在脚本开头EVALSHA加载一个预编译的约束校验函数或更简单——在应用层调用预订前先查约束表生成forbidden_slots位图与用户请求的target_slots做AND运算若结果非空则直接拒绝不进 Redis。5. 与企业日历系统双向同步用 Webhook 幂等令牌打通 Outlook/钉钉/飞书预订代码写完只是开始真正的价值在于“让会议室状态实时反映在每个人的日历里”。我们不推荐轮询浪费资源、延迟高而是采用事件驱动 幂等设计。5.1 同步架构三端角色与消息流向角色职责关键要求预订服务本系统产生booking.created/booking.cancelled事件每个事件带唯一idempotency_key sha256(booking_id event_type timestamp)消息队列如 RabbitMQ/Kafka持久化事件保证至少一次投递设置 TTL1h防堆积同步 Worker消费事件调用第三方日历 API必须实现幂等先查日历中是否存在同idempotency_key的事件5.2 钉钉日历同步实战从创建到渲染的完整链路钉钉开放平台要求日历事件必须包含summary,start,end,attendees最多 100 人且start/end为 ISO8601 格式。import requests import hashlib def sync_to_dingtalk(booking: dict): # 1. 生成幂等令牌 payload { booking_id: booking[id], event_type: created, timestamp: int(time.time()) } idempotency_key hashlib.sha256( json.dumps(payload, sort_keysTrue).encode() ).hexdigest()[:16] # 取前16位足够 # 2. 构造钉钉事件体 dingtalk_event { summary: f【会议室】{booking[room_name]} - {booking[purpose]}, start: { dateTime: booking[start_time].isoformat(), # 2024-05-20T14:00:00 timeZone: Asia/Shanghai }, end: { dateTime: booking[end_time].isoformat(), timeZone: Asia/Shanghai }, attendees: [ {email: u[email]} for u in booking[participants] ], description: f预订人{booking[user_name]}\n备注{booking.get(note,)} } # 3. 调用钉钉 API需提前获取 access_token headers { Content-Type: application/json, x-dingtalk-access-token: get_dingtalk_token(), x-dingtalk-idempotency-key: idempotency_key # 钉钉支持此 Header 做幂等 } resp requests.post( https://api.dingtalk.com/v1.0/calendar/events, jsondingtalk_event, headersheaders, timeout10 ) if resp.status_code 201: logger.info(fDingTalk sync success: {booking[id]}) elif resp.status_code 409: # Conflict已存在 logger.info(fDingTalk already synced: {booking[id]}) else: logger.error(fDingTalk sync failed: {resp.status_code} {resp.text}) # 放入死信队列人工介入提示飞书/Outlook 同步逻辑类似区别仅在 API 地址、认证方式和字段名。关键教训是——永远不要相信第三方 API 的文档说“幂等”必须自己加idempotency_key并在 Worker 层做二次校验。曾有项目因钉钉文档未明确说明x-dingtalk-idempotency-key在部分 region 不生效导致重复创建 20 个日历事件。5.3 反向同步当用户在 Outlook 直接删除会议如何通知本系统这是更难的一环。Outlook 不提供“日历事件删除 Webhook”但我们可以通过Microsoft Graph 的 delta query实现准实时感知每 5 分钟调用GET https://graph.microsoft.com/v1.0/me/calendar/events/delta?$deltatoken{token}解析返回的odata.deltaLink和事件列表若发现本系统创建的事件通过iCalUId字段匹配该字段在创建时由我们写入状态为removed则触发本地取消流程# 示例解析 delta response delta_resp graph_client.get_delta_events(since_token) for event in delta_resp[value]: if event.get(iCalUId) and event.get(removed): # 提取 iCalUId 中的 booking_id如 bk_1001_20240520 booking_id extract_booking_id_from_uid(event[iCalUId]) cancel_booking_locally(booking_id) # 走标准取消流程DB Redis 双删注意iCalUId必须在创建 Outlook 事件时由我们生成并写入格式建议为f{prefix}_{booking_id}_{date_str}确保全局唯一且可反查。这是反向同步的唯一可靠锚点。6. 生产环境必备的 3 个验证技巧用真实数据跑通最后一公里代码写完、部署上线前必须用真实业务数据过一遍“死亡行军测试”。以下是我每次上线前必做的三件事少一个都可能埋雷。6.1 技巧一用「时段碰撞矩阵」可视化验证冲突逻辑写一个脚本生成某会议室一周内所有可能的 15 分钟 slot 组合共 C(96,1)C(96,2)...C(96,8) 种实际取前 1000 个高频组合对每一对组合运行你的冲突判定函数输出一个 1000×1000 的布尔矩阵。用 Python seaborn 画热力图import seaborn as sns import numpy as np # matrix[i][j] True if combo_i conflicts with combo_j conflict_matrix np.array([...]) sns.heatmap(conflict_matrix, cmapRdBu, cbarFalse) plt.title(Conflict Matrix for Room 101 (15-min slots)) plt.savefig(conflict_matrix.png)看什么主对角线必须全为True自己和自己冲突若存在combo_A [56,57]14:00–14:30、combo_B [57,58]14:15–14:45则matrix[A][B]必须为True因 slot 57 重叠若combo_C [56,57]、combo_D [58,59]则matrix[C][D]必须为False无重叠这张图能一眼揪出位运算逻辑错误比写 100 个单元测试更直观。6.2 技巧二用「时间偏移注入」测试时区与夏令时陷阱在测试环境临时修改系统时区为America/Los_Angeles然后执行# 模拟用户在 PDT 时间 2024-03-10 01:30 提交预订夏令时切换日 TZAmerica/Los_Angeles python -c from datetime import datetime print(datetime.now().strftime(%Y-%m-%d %H:%M:%S %Z)) # 输出2024-03-10 01:30:00 PST → 但下一秒会跳到 03:00:00 PDT 观察你的预订服务是否✅ 正确将2024-03-10 01:30解析为2024-03-10T01:30:00-08:00PST而非...-07:00✅ 在生成date_str时使用datetime.date()而非strftime(%Y%m%d)后者受时区影响✅ Redis key 中的date_str与数据库date字段严格一致都基于 UTC 归一化后的日期6.3 技巧三用「混沌工程」模拟 Redis 故障验证降级策略用iptables模拟 Redis 不可达# 阻断本机到 Redis 的连接 sudo iptables -A OUTPUT -p tcp --dport 6379 -j DROP # 恢复 sudo iptables -D OUTPUT -p tcp --dport 6379 -j DROP此时触发预订系统应✅ 自动降级到数据库悲观锁SELECT ... FOR UPDATE模式虽慢但保正确性✅ 记录WARN redis_unavailable_fallback_to_db日志✅ 返回用户友好提示“系统繁忙请稍后再试”而非 500 错误❌ 绝不允许跳过冲突检查直接写库这是最危险的降级我曾在某次压测中发现降级代码里忘了重置slot_list的计算逻辑导致数据库锁的粒度变成整条记录而非 slot 级别瞬间锁表。从此这条成了上线 checklist 的第一条。写到这里你手里的“会议室预订代码”应该已经从玩具变成了能扛住真实业务压力的模块。它不再只是增删改查而是你理解分布式状态管理的第一块基石。我后来所有涉及资源调度的项目——无论是工单系统排期、GPU 卡分配还是充电桩预约——底层都复用了这套“切片位图原子脚本”的范式。它不炫技但足够结实。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

机器人操作不微调:冻结权重+推理期优化提升成功率

机器人操作不微调:冻结权重+推理期优化提升成功率

做机器人操作的人应该都有同感:模型在仿真里跑得飞起,一上真机就原形毕露。更让人头疼的是,很多时候问题不在模型本身,而在部署环境、任务分布、示范数据这些外围因素上。遇到这类问题,常规做法是拉数据、微调、再评测…

2026/10/14 12:15:20 阅读更多 →
校园乐器排练自动成片要换镜头和音乐,先保主演奏声音,再核实际编辑对象

校园乐器排练自动成片要换镜头和音乐,先保主演奏声音,再核实际编辑对象

自动成片后继续换镜头、字幕和音乐,可以先查看剪映当前模板与输出结构,再按实际能改的对象返工。乐器排练里主演奏声音的连续与真实范围优先,镜头切换不能把两次演奏拼成一次现场;生成成功也不证明每层素材都能自由拆开。本文没有…

2026/10/14 12:15:20 阅读更多 →
机器学习提取胃癌分型标志基因:从数据清洗到跨队列验证

机器学习提取胃癌分型标志基因:从数据清洗到跨队列验证

简介:一份PDF格式的学术论文《基于机器学习方法的胃癌分型标志基因提取》,面向生物信息学、肿瘤医学与机器学习研究者,围绕胃癌亚型精准分类中的标志基因筛选展开,适合需要开展高维基因表达谱特征选择或了解机器学习在癌症分型中应…

2026/10/14 12:14:20 阅读更多 →

最新新闻

2026最新降AI率实测:DeepSeek+Kimi指令合集,AI感显著降低!

2026最新降AI率实测:DeepSeek+Kimi指令合集,AI感显著降低!

熬夜码出的几万字大作,查阅资料费尽心血,但整体语调却显得机械生硬,急需寻找降低ai的方法。 为了让文字回归真实的表达质感,我拿废弃文档当小白鼠,深度测评了市面上热门的免费降ai率工具。 今天就把这段填坑经验全盘…

2026/10/14 13:12:14 阅读更多 →
《远征:泥泞奔驰》硬核越野模拟技术解析

《远征:泥泞奔驰》硬核越野模拟技术解析

1. 项目概述:越野模拟游戏的硬核体验"远征:泥泞奔驰"是一款专注于极限越野驾驶体验的模拟游戏,35.3GB的容量暗示着游戏包含大量高精度车辆模型、真实物理引擎和广阔开放场景。作为越野模拟类游戏的新作,它通过官方简体中…

2026/10/14 13:12:14 阅读更多 →
无论放大多少倍还是清晰的翻页电子书,我用FLBOOK免费版一口气做了上百本

无论放大多少倍还是清晰的翻页电子书,我用FLBOOK免费版一口气做了上百本

前阵子领导让我把公司那套两百多页的产品手册挂到官网:要能翻页、手机上能看、放大后参数表格要清清楚楚。我前后试了好几个翻页电子书工具,结果不是导出后字糊成一团,就是免费版只给前10页、页面上还挂着别人的广告。直到在 FLBOOK 上试了一…

2026/10/14 13:12:14 阅读更多 →
Robot Learning 知识库实战:从仿真选型到数据闭环

Robot Learning 知识库实战:从仿真选型到数据闭环

简介:Robot Learning_32是一份面向机器人学习领域的实用知识库,内容横跨机器人学、强化学习、计算机图形学与仿真建模。PDF内按32篇主题组织,重点围绕MuJoCo仿真器展开:从URDF模型转换、DAE/STL网格处理、XML编译参数配置&#xf…

2026/10/14 13:12:14 阅读更多 →
基于STM32的温控风扇闭环控制:从传感器选型到PID调优

基于STM32的温控风扇闭环控制:从传感器选型到PID调优

简介:这是一份面向嵌入式初学者与电子设计竞赛选手的STM32温控风扇完整工程源码,围绕温度采集、PID运算与PWM调速展开,可用于课程设计、毕业设计或智能散热方案的二次开发。压缩包共181个文件,约3.73MB,以44个c源文件与…

2026/10/14 13:12:13 阅读更多 →
REA模型落地指南:从概念、表结构到SQL实践

REA模型落地指南:从概念、表结构到SQL实践

如果你维护过一套企业后台系统,应该见过这种场面:业务部门问“这批货为什么到了,财务上还没入账”,你翻完订单、入库、应付几张表,最后只能说“状态没对上”。我开始接触REA(Resource-Event-Agent&#xff…

2026/10/14 13:11:13 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/13 22:01:27 阅读更多 →
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/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练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/14 7:53:34 阅读更多 →