首页/新闻资讯/正文详情

BigBlueButton 隐私与数据保护实践指南:录制、日志、缓存与 GDPR 合规配置

发布时间:2026/9/25 3:55:12 来源:云帆数科 栏目:资讯中心
BigBlueButton 隐私与数据保护实践指南:录制、日志、缓存与 GDPR 合规配置
教育音视频后端前端【免费下载链接】bigbluebuttonA complete web conferencing system for virtual classes and more!项目地址https://gitcode.com/gh_mirrors/bi/bigbluebutton点击查看免费下载本篇技术指南以 BigBlueButton 官方管理文档《Privacy》为骨架系统梳理了在虚拟课堂等真实部署场景中个人数据的处理与存储位置涵盖录制Recordings的全局开关、缓存文件与保留期、各类日志的轮转与降噪、TURN/coturn 等集成组件的隐私影响以及 Greenlight、Scalelite 前端联动下的合规配置方案。读完本文你将掌握如何在 BigBlueButton 服务器上实现默认最小化留存的隐私策略并能针对 GDPR 等法规要求逐项落地的可执行配置。概述隐私法规与 BigBlueButton 的合规定位许多国家与地区都出台了个人数据保护法规。对 BigBlueButton 服务的运营者而言私有数据保护是最重要的议题之一欧盟有《通用数据保护条例》GDPR美国加州有《加州消费者隐私法案》CCPA巴西有《通用数据保护法》LGPD且部分法规在特定条件下对境外主体同样具有域外效力。本节文档的目的是帮助运营者理解在一个典型 BigBlueButton 部署中私人数据在哪里被处理、在哪里被存储以及有哪些配置选项可以控制它。需要特别说明的是以下内容既不是法律意见也不完整属于持续完善中的工作文档work-in-progress。在涉及具体合规决策时仍应咨询法律专业人士。BigBlueButton 核心组件的隐私相关配置本节记录 BigBlueButton 自身的隐私相关设置、默认值及配置选项。有一点需要特别注意通过 apt 升级时你在配置文件中的修改可能会被静默覆盖参见上游 issue 9111。为防止这一点务必使用/etc/bigbluebutton目录存放本地覆盖配置参见 配置文件的本地覆盖机制以确保更改在升级和重启后仍然保留。录制Recordings要么全部录制要么完全不录制BigBlueButton 在录制行为上有一个重要的技术特性当一个房间被创建为允许录制即录制按钮可见时BigBlueButton 会录制整个会话无论录制按钮是否真的被按下。技术原因在于录制产物的一部分尤其是白板的 SVG 文件依赖于早期的状态才能被正确加工详见 录制Recording开发文档。默认情况下这些文件会保存两周见下文缓存文件的保留期。此外根据不同的使用场景与司法管辖要求保留追溯录制的能力例如当用户忘记点击录制按钮时可能是审慎的做法。前端通过 BigBlueButton API 创建/开启房间时行为如下前端指定recordtrue整个会话都会被录制除非 BigBlueButton 中全局禁用了所有房间的录制前端指定recordfalse或未指定该参数会话不会被录制会话期间也不会出现开始/停止录制按钮。解决方案一在 BigBlueButton 中全局禁用录制服务器运营者可以在/etc/bigbluebutton/bbb-web.properties中覆盖/usr/share/bbb-web/WEB-INF/classes/bigbluebutton.properties里disableRecordingDefault的默认值——将disableRecordingDefaultfalse改为disableRecordingDefaulttrue即可全局禁用录制。此外还建议设置breakoutRoomsRecordfalse禁用分组讨论室breakout rooms的录制。这一点值得独立于disableRecordingDefaulttrue来推行因为分组讨论室对典型用户而言往往隐含着一定程度的隐私预期。从仓库源码可以印证这两个参数的实际含义与注入路径bigbluebutton.properties 中定义了默认值disableRecordingDefaultfalse注释明确说明true - dont record even if record param in the api call is set to record以及breakoutRoomsRecordfalse这两个属性随后通过 resources.xml 注入到 Spring Bean 中disableRecordingDefault与breakoutRoomsRecord属性最终影响会议创建时的录制开关。解决方案二部署后处理脚本删除无录制标记的录制服务器运营者可以部署一个自定义脚本用于清理**没有创建任何录制标记recording markers**的录制及其缓存文件。简单版本在/etc/sudoers中授权bbb-recordbigbluebutton ALL NOPASSWD: /usr/bin/bbb-record并在/usr/local/bigbluebutton/core/scripts/archive/archive.rb约第 242 行之后加入删除逻辑BigBlueButton.logger.info(There are no recording marks for #{meeting_id}, deleting the recording.) system(sudo, bbb-record, --delete, #{meeting_id}) || raise(Failed to delete local recording)该思路与仓库中 archive 脚本的现有逻辑一脉相承archive.rb 在检测到没有录制标记时会记录日志Theres no recording marks for #{meeting_id}, not processing recording.并写入一个.norecord状态文件archive_norecord_file该文件正是后续 cron 清理任务判断未录制会议的依据。对于还需要显式删除 FreeSWITCH/Kurento 录制缓存文件的更完整版本可参考社区项目 bbb-recording-archive-workaround。BigBlueButton 会存储会话期间上传的演示文稿即使房间以recordfalse启动BigBlueButton 仍会把会话中的演示文稿presentations存储在/var/bigbluebutton目录下。解决方案官方文档目前标注为未知不清楚未产生录制时哪些后处理动作会被触发TODO 待补充最佳实践。运营者需自行评估该目录的数据留存策略。BigBlueButton 会完整存储原始录制数据对于有录制标记的会议BigBlueButton 会无限期存储原始录制数据其中包括主持人/演示者尚未点击录制按钮的会话片段。解决方案在会议成功归档archived后删除原始录制数据。使用 Scalelite 的部署可通过以下修改实现在/etc/sudoers中授权bigbluebutton ALL NOPASSWD: /usr/bin/bbb-record并在/usr/local/bigbluebutton/core/scripts/post_publish/scalelite_post_publish.rb约第 66 行之后加入system(sudo, bbb-record, --delete, #{meeting_id}) || raise(Failed to delete local recording)对于其他部署方式应将删除/var/bigbluebutton/recording/raw/$meeting/的操作加入 post-archive 脚本。该数据也可以按周期清理参见下文缓存文件的保留期。所有录制默认始终可访问默认情况下BigBlueButton 的录制是公开可访问的参见上游 issue 8505。此外录制的 URL 很容易被枚举参见 issue 1466 与 issue 9443。解决方案服务器管理员可以修改 nginx 配置限制录制 URL 的访问。根据具体场景nginx 中的鉴权语句可以与前端联动以实施更严格的限制例如要求与前端相同的凭据。可参考社区项目 bbb-rec-perm 提供的配置示例与面向 Greenlight 前端的认证回调。缓存文件Cache files启用录制时BigBlueButton 组件栈会产生多种缓存文件具体位置包括/var/bigbluebutton/recording/raw//var/bigbluebutton/unpublished//var/bigbluebutton/published/presentation//usr/share/red5/webapps/video/streams//usr/share/red5/webapps/screenshare/streams//usr/share/red5/webapps/video-broadcast/streams//var/kurento/recordings//var/kurento/screenshare//var/freeswitch/meetings/解决方案除通过上文后处理脚本自动清理外还可以将这些目录以tmpfs 挂载让录制缓存只驻留在内存中、不落盘。为此需在/etc/fstab中添加如下条目tmpfs /var/bigbluebutton/recording/raw/ tmpfs rw,nosuid,noatime,uid998,gid998,size16G,mode0755 0 0 tmpfs /var/bigbluebutton/unpublished/ tmpfs rw,nosuid,noatime,uid998,gid998,size16G,mode0755 0 0 tmpfs /var/bigbluebutton/published/presentation/ tmpfs rw,nosuid,noatime,uid998,gid998,size16G,mode0755 0 0 tmpfs /usr/share/red5/webapps/video/streams/ tmpfs rw,nosuid,noatime,uid999,gid999,size16G,mode0755 0 0 tmpfs /usr/share/red5/webapps/screenshare/streams/ tmpfs rw,nosuid,noatime,uid999,gid999,size16G,mode0755 0 0 tmpfs /usr/share/red5/webapps/video-broadcast/streams/ tmpfs rw,nosuid,noatime,uid999,gid999,size16G,mode0755 0 0 tmpfs /var/kurento/recordings/ tmpfs rw,nosuid,noatime,uid996,gid996,size16G,mode0755 0 0 tmpfs /var/kurento/screenshare/ tmpfs rw,nosuid,noatime,uid996,gid996,size16G,mode0755 0 0 tmpfs /var/freeswitch/meetings/ tmpfs rw,nosuid,noatime,uid997,gid997,size16G,mode0755 0 0应用后服务器管理员需执行bbb-conf --stop; mount -a; bbb-conf --start。需要特别注意的是uid/gid 必须按本地安装实际情况调整上例假设的用户如下red5:x:999:999:red5 user-daemon:/usr/share/red5:/bin/falsebigbluebutton:x:998:998:bigbluebutton:/home/bigbluebutton:/bin/falsefreeswitch:x:997:997:freeswitch:/opt/freeswitch:/bin/bashkurento:x:996:996::/var/lib/kurento:官方文档 TODO 注明应进一步说明这些 uid/gid 的含义以及如何获取本机正确的取值——建议通过id命令对照各服务用户实际 UID/GID 后再填入。已删除的录制仍残留在磁盘上通过deleteRecordingsAPI 删除录制时BigBlueButton不会立即从磁盘移除文件而是将其移动到/var/bigbluebutton/deleted/目录这是一种软删除机制。这样做的目的是在误删时还能恢复但管理员应意识到这些文件会持续占用存储空间且可能包含受合规要求约束的敏感数据。系统不会自动清理这些文件已删除的录制将无限期保留在磁盘上对公众不可访问直到手动移除。虽然 API 响应中仍能看到相关元数据但录制文件本身只有手动清理后才会真正消失。解决方案要彻底释放磁盘空间管理员必须手动删除这些文件最直接的方式是执行rm -rf /var/bigbluebutton/deleted/*该命令将永久清除已删除录制目录中的全部内容。由于此操作不可逆强烈建议在操作前确认已有可用备份。缓存文件的保留期Retention of cache filesBigBlueButton 会保留多种缓存与日志文件其通用保留周期可在/etc/cron.daily/bigbluebutton中配置相关参数含义如下history演示文稿、red5 缓存、kurento 缓存和 freeswitch 缓存的保留天数unrecorded_days没有录制标记的会议用户预期未被录制其录制的保留天数published_days已发布录制的原始数据的保留天数要禁用该清理需注释掉remove_raw_of_published_recordings这一行。仓库中的 cron.daily/bigbluebutton 脚本给出了这些参数的默认值history5、unrecorded_days14、published_days14、log_history28并允许通过/etc/default/bigbluebutton-cron-config覆盖。从脚本实现可以看到两个关键机制remove_raw_of_recordings_without_marks会扫描/var/bigbluebutton/recording/status下*.norecord状态文件正是上文 archive.rb 在无录制标记时写入的标记文件对超过unrecorded_days的会议执行bbb-record --deleteremove_raw_of_published_recordings会检查/var/bigbluebutton/recording/status/published/$meeting-$type.done文件仅删除已正确发布对应全部处理类型均有.done标记且超过published_days的原始目录。如需立即删除这些缓存请参照上文后处理脚本删除无录制标记的录制一节。日志Logs通用日志轮转如果运营者选择保留录制文件和日志应当了解并修改以下设置/etc/cron.daily/bigbluebutton中的log_history设置决定录制文件与日志的保留时长仓库默认log_history28天对应/var/log/bigbluebutton、/var/log/bbb-webrtc-sfu、/opt/freeswitch/var/log/freeswitch下超期文件的清理/etc/logrotate.d/下的bbb-record-core.logrotate与bbb-webrtc-sfu.logrotate配置前者每8 天轮转/var/log/bigbluebutton/下的bbb-rap-worker.log与sanity.log后者每7 天轮转/var/log/bbb-webrtc-sfu/下的日志/usr/share/bbb-web/WEB-INF/classes/logback.xml每天轮转/var/log/bigbluebutton/bbb-web.log并保留14 天。BigBlueButton 日志内容BigBlueButton 会记录与房间的所有交互——何时创建、谁在何时加入、何时离开——这些记录在/var/log/bigbluebutton/bbb-web.log中。可以通过以下方式降低核心应用的日志详细程度在/etc/bigbluebutton/bbb-web.properties中设置appLogLevelError调整/usr/share/bbb-web/WEB-INF/classes/logback.xml中的各项设置。为避免 bbb-webrtc-sfu 记录 IP 地址可在/usr/local/bigbluebutton/bbb-webrtc-sfu/config/default.yml中设置level: error。此外/etc/bbb-apps-akka/application.conf与/etc/bbb-apps-akka/logback.xml中包含与聊天使用情况及聊天消息相关的日志级别配置。nginx默认情况下BigBlueButton 为 nginx 启用了完整访问日志full access logs其中包含用户 IP 地址、用户名、加入的会议等信息。可以在/etc/nginx/sites-available/bigbluebutton与/etc/nginx/nginx.conf中把日志级别改为仅记录 ERROR 来禁用error_log /var/log/nginx/bigbluebutton.error.log; access_log /dev/null;FreeSWITCHFreeSWITCH 的默认安装默认以 DEBUG 级别记录日志可通过/etc/bbb-fsesl-akka/application.conf与/etc/bbb-fsesl-akka/logback.xml调整。默认配置会存储用户名、加入的会话及时间戳。集成组件IntegrationsTURN 服务器BigBlueButton 使用 TURN 服务器进行 NAT 穿透。默认情况下BigBlueButton 配置了 freeswitch.org 的 STUN 服务器。你可以自行搭建 TURN/STUN 服务器参见 TURN 服务器配置指南并在/usr/share/bbb-web/WEB-INF/classes/spring/turn-stun-servers.xml中完成配置。sip.js在/usr/share/bigbluebutton/html5-client/compatibility/sip.js中硬编码了一个 Google STUN 服务器。不过通常无需担心由于向 BBB-web 请求 TURN/STUN 设置失败时应返回空数组并覆盖该设置硬编码的 STUN 服务器并不会被使用。尽管如此谨慎的服务器管理员仍可选择替换这个默认值。Greenlight 前端相关的隐私要点Greenlight 是常与 BigBlueButton 配合的会议室前端其行为同样影响整体隐私态势。Greenlight 默认以 recordtrue 开启新房间默认情况下Greenlight 创建会议时向 BigBlueButton 传递recordtrue这意味着即使没有按下录制按钮这些会议也会被录制参见上文 BigBlueButton 的录制语义。解决方案可以在 Greenlight 房间设置中为所有人全局禁用录制或由各用户在各自房间内可选关闭参见上游 pull request 1296。如有必要也可直接在 BigBlueButton 服务器配置中彻底禁用录制功能。Greenlight 默认不要求访客同意隐私政策/录制BigBlueButton 本身没有强制参与者加入房间前同意隐私政策或被录制的能力。Greenlight 提供一个可选功能需在基础设置中开启Requires the consent of the room initiator and the participants for recording要求房间发起者与参与者同意录制开启后所有参与者进入会议前会看到本房间将被录制的警告文本。解决方案上游 issue 1163 讨论了如何进一步落地所需改动——可在现有免责声明代码app/views/rooms/components/_room_event.html.erb第 21 行基础上扩展增加隐私政策链接以及一个用户必须勾选以确认知晓会议将被录制并同意的复选框且仅当勾选后才能启用加入按钮。更实质性的改造方向是选择性录制即排除未同意录制用户的视频、音频、聊天与绘图输入。Greenlight 在房间 URL 中包含用户名Greenlight 的房间 URL 中包含房间所有者的用户名这可能因当地法律而被视为私人数据。该问题的解决依赖上游 issue 1057。服务条款Terms of ServiceGreenlight 支持在注册时或为已注册用户展示条款与条件terms and conditions。录制的访问控制如前文所述BigBlueButton 录制默认公开且 URL 可枚举issue 8505、1466、9443。Greenlight 默认提供两种录制可见性设置public录制列在房间页面上与unlisted录制仅能通过可枚举的直接链接访问。解决方案Greenlight 可通过补丁获得更细粒度的录制可见性控制。使用社区分支 rec_restrictions 可在录制可见性下拉菜单中增加第三个值public/unlisted/private并在 Scalelite 或 BigBlueButton 主机上设置对应录制元数据gl-listedtrue/unlisted/false。随后可用 bbb-rec-perm 依据该元数据校验录制请求当录制被设为 private 时返回 403设为 unlisted 或 public 时正常返回录制。日志Rails 日志默认情况下Greenlight 记录到$GREENLIGHTDIR/logs/production.log。从.env中删除对应行可以保留日志但不向 Docker 宿主暴露它们。最简单的方案是将$GREENLIGHTDIR/logs/production.log链接到/dev/null。nginx 日志默认情况下 Greenlight 为 nginx 启用完整访问日志包含用户 IP 地址、用户名、加入的会议等信息。可通过在/etc/nginx/sites-available/bigbluebutton与/etc/nginx/nginx.conf中将日志级别切换为仅 ERROR 来禁用error_log /var/log/nginx/bigbluebutton.error.log; access_log /dev/null;coturn 的日志处理默认情况下coturn 记录到/var/log/coturn.log并带有常规日志轮转。该日志文件包含使用 TURN 服务器的用户的 IP 地址及其使用的端口——结合其他 BigBlueButton 日志可以识别这些用户加入的会话。coturn没有限制日志记录的选项因此这里的最佳方案是将/var/log/coturn.log链接到/dev/null。Scalelite 的日志处理Scalelite 使用一个运行 nginx 的容器作为前端会积累标准的访问日志。默认情况下 Scalelite 为 nginx 启用完整访问日志包含用户 IP 地址、用户名、加入/观看的会议等信息。最简单的处理方式是将 nginx 迁移到宿主机上从而去掉 Docker然后在/etc/nginx/sites-available/bigbluebutton与/etc/nginx/nginx.conf中将日志级别切换为 ERRORerror_log /var/log/nginx/bigbluebutton.error.log; access_log /dev/null;此外scalelite-API 镜像blindsidenetwks/scalelite:v1-api的容器也会记录用户活动例如谁加入了哪个会议{log:I, [timestamp] INFO -- : [some_identifier] Redirected to https://URL/bigbluebutton/api/join?meetingIDmeeting_ID\u0026fullNamename\u0026passwordhashed_pw... }自 Scalelite 1.0.9 起实现了日志轮转这些日志会在一天后自动删除。GDPR 通用考量GDPR 列出了几项重要的原则与权利尤其是请求机器可读的全部已存私人数据聚合副本的权利擦除全部个人数据的权利目的限制Purpose limitation数据最小化Data minimisation存储限制Storage limitation。这些要求在 BigBlueButton 场景下具有特殊性——尤其是房间可以匿名加入运营者可能无法轻易识别与某个用户关联的所有已存私人信息尽管这些信息例如以化名作为访客加入房间时的摄像头录制按法律仍属于个人/私人数据。对许多用例而言最简单的解决方案是不存储用户的任何私人数据。具体措施包括降低日志级别或禁用日志将日志指向/dev/null仅将临时数据保存在内存中tmpfs而非磁盘禁用会话录制功能。需要明确的是即便上述措施全部完成BigBlueButton 服务器仍然会处理所有这些数据。因此通常仍需要与服务器托管公司签订数据处理协议Data Processing Agreement并向服务用户提供关于私人数据处理的告知信息。总结BigBlueButton 的隐私治理可以归纳为三条主线弄清数据在哪录制原始数据、缓存文件、各类日志的落盘位置、减少留存全局禁用录制、调整保留期、tmpfs 内存化、软删除目录手动清理、控制访问与告知nginx 录制鉴权、Greenlight 同意弹窗与服务条款、日志降噪。结合本文给出的源码级配置佐证如 bigbluebutton.properties 的录制开关、cron.daily/bigbluebutton 的保留期机制、archive.rb 的无标记检测逻辑运营者可以据此制定符合本地法律要求且可落地的数据保护方案并为数据处理协议与用户告知提供事实依据。赞分享教育音视频后端前端【免费下载链接】bigbluebuttonA complete web conferencing system for virtual classes and more!项目地址https://gitcode.com/gh_mirrors/bi/bigbluebutton点击查看免费下载相关推荐Valkey合规性GDPR与数据隐私保护实践指南Valkey合规性GDPR与数据隐私保护实践指南 引言数据合规时代的存储挑战 在欧盟《通用数据保护条例》General Data Protection RKV存储缓存数据库IMSI-catcher终极指南轻松嗅探周围手机身份信息IMSI catcher终极指南轻松嗅探周围手机身份信息 IMSI catcher是一款功能强大的工具能够帮助用户捕获周围手机的IMSI号码。本指南将为你详上一篇PortalVueVue3组件跨域渲染的完整指南下一篇5个步骤玩转GodotOS在Godot引擎中打造你的虚拟操作系统创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

网站添加百度统计:为 ChatGPT 微服务应用构建 PV/UV 数据观测能力
网站添加百度统计:为 ChatGPT 微服务应用构建 PV/UV 数据观测能力

文档教程后端 【免费下载链接】CodeGuide :books: 本代码库是作者小傅哥多年从事一线互联网 Java 开发的学习历程技术汇总,旨在为大家提供一个清晰详细的学习教程,侧重点更倾向编写Java核心内容。如果本仓库能为您提供帮助,请给予支持(关注、… · 2026/9/25 3:55:12

Kata Containers Agent Policy 实战:用 Rego 策略对 Guest 内 ttRPC 请求实施细粒度访问控制
Kata Containers Agent Policy 实战:用 Rego 策略对 Guest 内 ttRPC 请求实施细粒度访问控制

云原生容器运行时 【免费下载链接】kata-containers Kata Containers is an open source project and community working to build a standard implementation of lightweight Virtual Machines (VMs) that feel and perform like containers, but provide the workload isolat… · 2026/9/25 3:55:12

Hugo Blox 的 steps 短代码:用 Markdown 三级标题快速编排教程步骤
Hugo Blox 的 steps 短代码:用 Markdown 三级标题快速编排教程步骤

静态站点前端开发工具 【免费下载链接】kit 🧱 Describe your site, AI builds it, you own it as Markdown. Snap together Tailwind blocks like Lego — landing pages, blogs, portfolios, docs & more. No AI slop. Free to deploy anywhere 👇… · 2026/9/25 3:55:12

MATLAB贝叶斯分类实战:从先验设置到可部署模型
MATLAB贝叶斯分类实战:从先验设置到可部署模型

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

AI图生视频实战:用ComfyUI让唐代仕女图跳舞
AI图生视频实战:用ComfyUI让唐代仕女图跳舞

从一张静态仕女图,到一段能跟随音乐舞动的小视频,中间只差一套“AI 图生视频”工作流。这篇文章不聊玄乎的概念,直接拆解市面上常用的实现路线,带你从环境搭建、模型选择、ComfyUI 工作流设计,到批量合成视频&#xff… · 2026/9/25 4:23:22

香橙派5 Plus/Max Ubuntu 24.04中文环境配置与LED控制实战
香橙派5 Plus/Max Ubuntu 24.04中文环境配置与LED控制实战

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

Keil5 MDK/C51/C251并行安装核心原理与避坑指南
Keil5 MDK/C51/C251并行安装核心原理与避坑指南

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

四种聚类算法源代码及示例代码:K-Means、DBSCAN、层次聚类、GMM 统一实现与调参指南
四种聚类算法源代码及示例代码:K-Means、DBSCAN、层次聚类、GMM 统一实现与调参指南

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

Python四种内置数据结构详解:列表、元组、字典与集合实战选型
Python四种内置数据结构详解:列表、元组、字典与集合实战选型

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

数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)
数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)

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

创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战

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

MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX

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

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码