新闻详情

新闻详情

首页 / 资讯中心 / 详情

Chrome扩展实战:自动抓取Managebac成绩并计算IB总分

发布时间:2026/9/25 6:15:54来源:尧图网络
Chrome扩展实战:自动抓取Managebac成绩并计算IB总分
简介这是一款面向国际学校Managebac用户的轻量级Chrome扩展程序利用JavaScript与jQuery实时读取并计算opengate.managebac.com页面上的成绩数据帮助师生快速查看当前成绩或平均分也可作为Chrome扩展开发者的入门参考。资源包共14个文件以7个JavaScript脚本为核心另含3个PNG图标、2个JSON配置、1个HTML弹窗页面和1个Markdown说明文档整体仅56KB轻量易部署。除核心成绩计算逻辑外还内置jQuery库、多语言配置以及弹出面板下载后按开发者模式加载即可直接使用无需额外依赖。压缩包内目录结构清晰JavaScript按内容脚本、弹窗逻辑、成绩采集等模块分离开发者可对照源码修改界面样式或扩展计算规则。对于没有接触过浏览器扩展的初学者该案例的代码组织也提供了一条清晰可循的实现路径。已有1451人学习/浏览适合需要快速估算Managebac成绩的师生以及想了解Chrome扩展工程结构和交互写法的前端开发者。1. 把 Managebac 成绩计算做成 Chrome 扩展从手动对分到一键汇总把 Managebac 成绩计算做成一个 Chrome 扩展是我试过的最不打扰人的方案。用过 Managebac 的人都清楚一学期成绩不是一张总表而是散落在各门课程的 assessment 里考试、论文、口头报告各占权重页面只给你原始分数和百分比不给你加权后的 IB 7 分制结果。手动拿计算器对分期中有七个学科要过一遍非常容易算错或漏项。这个项目就是一个纯前端实现的 Chrome 扩展程序——通过 content script 注入 Managebac 页面用 jQuery 抓成绩单元格按配置好的权重和评分映射计算总分再显示在页面顶部。适合每个学期都要对分的 IB 学生、课程协调员以及想知道成绩边界在哪的老师。先理解它怎么把页面 DOM 变成可计算的数据再来看代码和安装步骤后面的坑基本都能提前避开。2. 扩展原理Manifest V3、content script 与 jQuery 选择器如何协同2.1 Manifest V3 是底线版本号错了直接加载失败写 Chrome 扩展第一件事不是写功能代码而是写 manifest.json。这个文件决定 Chrome 用哪套 API 体系加载扩展也决定加载时是顺利出卡片还是直接弹错误。ManagebacGradeCalculator 用的是 Manifest V3对应 Chrome 从 2022 年开始主推、2023 年之后逐步排除 V2 的那套规则。manifest_version这个字段最容易翻车写成 2新版 Chrome 加载时提示“不受支持的清单版本”写成 3 却用了 MV2 的 background page 写法同样加载失败。对这个项目来说逻辑其实很简单——计算成绩只需要 content script 和页面 DOM不需要后台常驻页面MV3 反而是最省事的方案。下面这个 manifest 是能通过加载的最小配置{ manifest_version: 3, name: Managebac Grade Calculator, version: 1.0.0, description: 抓取 Managebac 成绩单元格并按权重计算 IB 分数, content_scripts: [ { matches: [https://*.managebac.com/*], js: [jquery.min.js, content.js], css: [content.css], run_at: document_end } ], permissions: [] }这里matches只放行 managebac.com 域名相当于给扩展画了一个活动范围。有人图省事写成all_urls也能跑但等于在每个网站都注入脚本既不安全也会在别的网站控制台里不停打日志。run_at我建议固定document_end成绩表格不在首屏最前面当页面 DOM 解析完、图片尚未加载完成时执行表格已经在了。如果你设成document_startjQuery 还没就位content.js 第一行$就会抛ReferenceError这是新手最常见的白屏原因之一。提示manifest.json 是严格 JSON不能带注释、不能有尾逗号。上文里我加了注释是为了便于阅读直接复制会报“清单文件缺失或不可读”。2.2 content script 的边界拿到 DOM不等于拿到页面变量很多第一次写 content script 的人以为能直接读 Managebac 页面里的全局变量比如某个window.assessmentData。实际上 Chrome 把 content script 放进一个隔离世界它和页面共享 DOM但不共享 JavaScript 全局环境。页面自己用const定义的数据你在 content script 里读不到反过来你在 content script 里定义的变量页面也看不到。唯一可靠的通道是 DOM 属性、文本和事件。这个项目的全部逻辑本质上就是“把 DOM 里的成绩文字解析成数字再算回来”所以先接受这个边界后面调试会省很多时间。既然只能读 DOM第一步就是确认成绩到底在哪个节点里。我写过太多次“自以为知道选择器”然后翻车的事现在的做法是先跑一段探测代码把所有候选选择器的命中数量打出来。// content.js 一开始就把候选选择器全部打印确认当前页面的真实结构 const candidates [ .score, .assessment-score, td.grade-value, [data-score], table.grades td ]; candidates.forEach(function (sel) { const nodes document.querySelectorAll(sel); console.log([MBGC] sel : nodes.length nodes); if (nodes.length 0) { console.log([MBGC] 第一个节点:, nodes[0].outerHTML.slice(0, 300)); } });把这段放进 content.js打开一个 Managebac 课程页按 F12 切到 Console你会看到类似.score: 0 nodes、td.grade-value: 23 nodes的输出。命中最多的那个节点就是要抓的成绩单元格。关键点在于不要盲目照抄仓库里的选择器因为学校版本、老师开的 assessment 类型都会影响 DOM。仓库给的选择器是作者在自己账号下测出来的它帮你缩小范围最终确认还得靠这段日志。2.3 jQuery 隔离老库在扩展里的正确姿势这个仓库用 jQuery 不是炫技而是在 content script 场景下jQuery 的选择器语法确实省事:contains可以按文本找成绩.closest(.assessment-row)可以从分数单元格反查整行。仓库自带 jquery.min.js不引 CDN这很关键——MV3 禁止执行远程脚本把 jQuery 直接打包进目录是合规做法扩展商店审查时也不会有远程代码问题。但如果 Managebac 页面自己也用了 jQuery你会看到$ is not a function或者两个$互相覆盖。正确姿势是把扩展的 jQuery 包进 IIFE(function ($) { use strict; // 这个作用域里的 $ 是扩展自带 jQuery 的别名与页面 jQuery 互不干扰 $(document).ready(function () { console.log([MBGC] 内容脚本已就绪); }); })(jQuery.noConflict(true));jQuery.noConflict(true)会把全局$还给页面脚本同时返回扩展 jQuery 的引用再用 IIFE 把它锁在局部作用域里。如果你的 content script 只有一个入口也可以不加 noConflict但加上不会有坏处——尤其当页面本身用了老旧的前端框架、你不确定它的 jQuery 版本时这种隔离能让两边互不干扰。写代码的思路一句话概括content script 只当自己是“外挂的 DOM 工具”别试图和页面脚本亲密接触。2.4 成绩计算逻辑先加权再换算还是先换算再加权成绩计算看起来是小学数学实际是 IB 学生和老师争议最多的地方。Managebac 页面里每个 assessment 有原始分数、满分和一个百分比它只展示单项表现不给你课程总评。这个扩展把总评算出来需要两个约定权重从哪来以及用百分比映射 IB 分还是用原始分总和映射。默认逻辑是标准加权平均对每个 assessment先算rate score / max再用权重加权最后一次性算出finalPercent sum(rate * weight) / sum(weight)。IB 7 分制再用一个阈值表把百分比映射成 1-7 分整数。为什么不在单项上先转成 IB 分再平均因为很多老师先看百分比再给总评单项 IB 分是期末才出现的结论你在中间过程 round 一次最终结果可能会产生 0.1-0.5 的偏差这就是第 5 章要讲的对不上成绩单的问题。阈值表长这样百分比下限IB 分数85770655540430320201这张表只是常见做法不是 IB 官方规定更不是所有学校的统一标准。有些学校按原始分总和totalScore / totalMax * 7再四舍五入这跟百分比映射在 50-70 分段可能差出 1 分。所以阈值表必须做成可配置对象放在文件顶部第 6 章我会给出具体配置方法和反推验证流程。3. 安装与加载开发者模式、crx 与清单报错的处理3.1 从源码包走到 chrome://extensions/下载源码包后先别急着双击文件先解压。解压后你要看到 manifest.json 直接放在这一层而不是又套了一个文件夹。常见错误是选中整个下载目录Chrome 找不到 manifest.json立刻报“无法加载清单”。然后打开 chrome://extensions/这一步建议在地址栏手输不要用网上复制的一串带通道号的地址。页面右上角有“开发者模式”开关打开后按钮区出现“加载已解压的扩展程序”点它选择解压后的目录扩展卡片应该立刻出现卡片上有名称、版本号和扩展 ID。这里有个细节容易被忽略每次改完 manifest.json 或 content.js都需要回到 chrome://extensions/ 点一下扩展卡片右下角的刷新按钮圆形箭头再去 Managebac 页面按 F5 刷新页面。只刷新页面不刷新扩展跑的还是旧代码你会怀疑自己改了个寂寞。这是我在这个项目上踩得最频繁的坑几乎每轮迭代都会来一次。3.2 三种典型的加载失败与处理我列一张表把最常见的报错和原因讲清楚按表排查比挨个查教程快得多。报错原文Chrome 提示片段原因解决动作清单文件缺失或不可读 / 无法加载清单选中目录内没有 manifest.json或文件不在该层检查目录层级确认 manifest.json 在选中目录的直接子级无法加载清单因为它使用了不受支持的清单版本manifest_version 字段不是 3或 JSON 语法损坏改成manifest_version: 3并检查尾逗号和注释此扩展程序不再受支持 / 不是受支持的文件类型拖进来的 crx 是 MV2 打包或 crx 版本太旧不要拖 crx改用开发者模式加载已解压目录先将 crx 解压关于 crx 多说一句。很多资源包直接给 crx因为以前双击或拖进 chrome://extensions/ 就能装。但新版 Chrome 对拖入式安装 crx 限制得很严格商店外签名的 crx 拖进去要么被禁用要么提示“此扩展程序不再受支持”。现在的通用做法是把 crx 当压缩包解压后缀改成 zip 或直接用解压工具得到源码目录再走“加载已解压的扩展程序”。解压后如果目录里又套了一层带版本号的文件夹记得继续切到包含 manifest.json 的那一层。如果你在 chrome://extensions/ 里看到“该扩展程序未列在 Chrome 应用商店中并可能是在您不知情的情况下添加的”先确认这个扩展是不是你自己加载的源码目录。如果是下载来的 crx 解压产物展开代码检查一下有没有可疑的远程请求content script 里只要是https://*.managebac.com/*的 matches 范围相对安全如果 matches 是all_urls还带一堆网络请求就不要在常用浏览器配置里启用。某些老机器上还会遇到 Chrome 109 与 Win7 的组合问题。Chrome 109 是 Win7 能用的最后一个大版本如果你必须在这种环境跑这个项目要同时确认扩展没用到 Chrome 110 之后才有的 API。这个项目因为只用 content script 和 jQuery在 Chrome 109 上基本能跑通但如果以后改了版本、引用了太新的 API老版本浏览器会静默跳过功能而不是报错调试时会觉得很玄学。3.3 确认注入成功两个 Console 别搞混扩展加载成功不代表脚本真的在跑。进入 Managebac 课程页后按 F12 打开 DevToolsConsole 如果能看得到扩展的启动日志说明 content script 注入正常。这里最容易误会的是为什么我在页面 Console 看不到扩展日志因为 content script 的 console 日志默认输出到“页面上下文”的 Console但如果你切换了 DevTools 的 context 过滤器或者跑到扩展专用控制台去看位置就变了。更可靠的方式是到 chrome://extensions/ 找到扩展卡片点“检查视图”里对应的 content script 入口会打开一个独立的 DevTools 窗口扩展打的所有日志都在这里。我通常两个都看先看“检查视图”确认脚本本身没崩再切回页面 Console 确认选择器命中。还有第三个验证方法打开 Element 面板CtrlF 搜索扩展渲染结果面板的 id比如mbgc-result。搜得到说明注入和渲染都成功了什么都没有再去“检查视图”看报错多半是选择器没命中或权重配置读出来是空数组。4. 核心代码拆解抓成绩、算权重、写回页面4.1 解析 DOM把成绩表格变成可计算的数据结构安装通了接下来就是把 content.js 的核心逻辑拆开看。整个扩展本质是一个三步管道解析DOM → 数组、计算数组 → 分数、渲染分数 → DOM。第一步最脆弱因为页面结构一变后面全崩。先看解析函数它的输入是页面 DOM 中所有成绩行输出是一个没有歧义的成绩数组。仓库里大致是这个结构function parseAssessments(rows) { const items []; rows.forEach(function (row) { const titleEl row.querySelector(.assessment-title); const title titleEl ? titleEl.textContent.trim() : unnamed; const scoreText row.querySelector(.score).textContent.trim(); const maxText row.querySelector(.max).textContent.trim(); // 成绩可能显示成 12/15而不是两个独立单元格 let score, max; if (scoreText.indexOf(/) -1) { const parts scoreText.split(/); score parseFloat(parts[0]); max parseFloat(parts[1]); } else { score parseFloat(scoreText); max parseFloat(maxText); } if (isNaN(score) || isNaN(max) || max 0) { console.warn([MBGC] 跳过无效成绩:, title, scoreText); return; } items.push({ title: title, score: score, max: max, weight: parseFloat(row.querySelector(.weight).textContent) || 1 }); }); return items; }parseFloat有个隐藏陷阱如果 scoreText 是带斜杠的“12/15”parseFloat(12/15)只返回 12max 就成了 NaN所以代码里先判断斜杠再 split。这是实际运行中一定会遇到的脏数据不处理就全盘算错。weight那行用了|| 1意思是页面没有权重字段时默认相等权重保证计算不中断但你要清楚“默认 1”和“实际权重 1”不是一回事。如果老师实际用的是 40%/30%/20% 权重默认值会让总评完全对不上后面 4.2 会讲怎么把权重做成配置。4.2 加权计算与 IB 映射参数分明的纯函数解析完得到原始数组计算部分建议写成纯函数不碰 DOM这样可以直接在 Console 里喂假数据验证。这也是这个仓库最值得抄走的一段function calculateGrade(items, thresholds) { let weightedSum 0; let totalWeight 0; items.forEach(function (item) { const rate item.score / item.max; weightedSum rate * item.weight; totalWeight item.weight; }); const percent totalWeight 0 ? 0 : (weightedSum / totalWeight) * 100; const ib percentToIb(percent, thresholds); return { percent: percent, ib: ib }; } function percentToIb(percent, thresholds) { for (let i 7; i 2; i--) { if (percent thresholds[i]) return i; } return 1; }thresholds 的结构是{7:85, 6:70, 5:55, 4:40, 3:30, 2:20}循环从 7 往下找percent 大于等于 85 给 7大于等于 70 给 6以此类推。这样写比堆 if/else 清晰以后调阈值只改对象。totalWeight 0的防护不是摆设如果解析阶段所有行都被跳过totalWeight 就是 0不做防护会得到 NaN页面渲染出 NaN 后很难排查所以我在 result 里先给了 0 的兜底。顺便把两种模式的差别说透。假设一个 assessment 得了 58%另一个得了 82%权重各一半。先算百分比再转最终 70%映射 6。先转单项58% 映射 582% 映射 6平均 5.5 再四舍五入还是 6。看起来差不多但边界场景会差出 1 分。两种都有学校在用所以仓库里应该保留一个配置开关不要写死一种第 6 章会给出rounding这个控制项。4.3 渲染与重算在 SPA 页面里稳住结果面板最后一步是把结果写回页面。直接 append 一个面板到 body 最简单但有个坑Managebac 是单页应用切换班级、切换学期时不会整页刷新DOM 被重绘你插入的面板会被清掉事件也不会重新触发。这时候 MutationObserver 是标准答案。let lastUrl location.href; function scanAndRender() { if (location.href ! lastUrl) { lastUrl location.href; setTimeout(function () { const rows document.querySelectorAll([data-assessment-row]); const items parseAssessments(rows); const result calculateGrade(items, config.thresholds); renderPanel(result); }, 300); } } const observer new MutationObserver(function () { scanAndRender(); }); observer.observe(document.body, { childList: true, subtree: true });300ms 的延迟是经验值SPA 先改 URL再异步拉数据渲染表格立即扫描很可能拿到旧 DOM200ms 有时太快500ms 又显得迟钝我习惯 300ms。MutationObserver 监听整个 body 的任何子节点变化频率可能很高所以scanAndRender用 URL 变化做闸门URL 没变怎么触发都不重算URL 变了才等 300ms 再扫描。renderPanel做的事是创建一个带固定 id 的 div固定在页面右上角或顶部显示当前课程的 percent 和 IB 分如果已经存在同 id 节点先 remove 再重建。注意不要无脑把结果拼到表格的 tbody 里那会在每次重算时不停叠加行页面越来越长看起来就跟 bug 一样。5. 避坑与排查五个真实翻车现场5.1 加载扩展报“无法加载清单”卡片根本不出现现象在 chrome://extensions/ 点“加载已解压的扩展程序”后Chrome 直接弹“无法加载清单”或“清单文件缺失或不可读”扩展列表里什么都没有。原因90% 是目录层级错了manifest.json 不在你选中的那一层8% 是 manifest 里有注释或尾逗号JSON 解析失败2% 是文件名写成manifest.JSON而不是manifest.jsonWindows 的文件名大小写导致 Chrome 找不到。解决先在解压目录里确认manifest.json和content.js在同一层再用编辑器打开 manifest.json如果编辑器报 JSON 语法错误把注释全删掉、最后一个键值对后面别留逗号如果有多个同名文件夹选最内层那个。我在这个坑上栽过一次之后每次解压都会先看一眼目录结构再选路径。5.2 拖 crx 安装被禁用“此扩展程序不再受支持”现象网上找的 crx 直接拖进 chrome://extensions/Chrome 提示“此扩展程序不再受支持”或“不受支持的清单版本”安装按钮是灰的甚至提示扩展未列在 Chrome 应用商店中。原因新版 Chrome 只接受商店官方渠道的 crx对开发者自己打包、没有正规签名的 crx 一律拒绝如果这个 crx 还是 MV2 打包的拒绝得更干脆。这是浏览器策略不是扩展代码的问题。解决把 crx 当压缩包解压后缀改成 .zip 再解压得到源码目录后走开发者模式加载已解压的扩展程序。解压后如果又套了一个带版本号的文件夹继续内层切到 manifest.json 那一层。以后只要是商店外拿到的 crx我都默认先解压再加载省得在灰色按钮上浪费时间。5.3 扩展看起来在跑成绩读出来全是 0现象Console 能看到扩展启动日志页面上也有结果面板但 percent 恒为 0或者面板根本不显示成绩。原因启动日志只能证明 content script 灌进去了不能证明选择器选中了节点。选择器没有命中实际成绩 DOM可能是 Managebac 改版、老师设置的非标准 assessment 类型或者你的账号没有某些成绩列。另一个常见原因是权重字段取不到全部按默认 1 处理结果被稀释成看起来不正常的值。解决用 2.2 那段探测代码把所有候选选择器的命中数打出来找出当前页面真实结构然后单独打印哪些行没有权重把weight解析改成parseFloat(row.querySelector(.weight)?.textContent) || 1并输出日志。我还遇到过一种隐蔽情况成绩存在 iframe 里content script 默认不注入 iframe需要在 manifest 的 content_scripts 里加all_frames: true才能触达。排查这类问题最快的就是先确认“容器在哪”再确认“脚本进没进去”。5.4 计算值跟学校官方成绩单差 0.2怎么都对不上现象扩展算出来总评 5老师给的是 6或者百分比 87.4 对着阈值表应该 7老师期末给 6。原因几乎全是四舍五入时机和权重口径的差异。比如每个 assessment 先 round 到整数再平均和按原始小数平均到最后再 round 一次边界上能差出 1 分或者老师用的权重不是页面里显示的那组数字它在教学大纲的 PDF 里页面只有单项百分比再或者 IB 阈值表每个学校并不一样默认 85 分给 7 只是常见值。解决把 thresholds 和 weights 全部参数化拿上一学期的真实数据反推。录入 8-10 个已经知道总评的 assessment调整参数直到输出和老师成绩单一致再固化下来。具体流程我第 6 章写成了两条固定检查步骤每次都走一遍就不会再出现“玄学差 0.2”。5.5 切换班级后扩展失灵按一下 F5 又好了现象在同一个浏览器标签页里从 A 班切到 B 班扩展面板消失或还显示 A 班数据刷新整个页面后正常。原因这是 SPA 路由更新的问题。浏览器没有刷新扩展只在上一次进入时扫描过页面Managebac 用异步渲染替换了 tbody面板没有被重新生成数据还是上一门课的。扩展不是被禁用了而是没有重新触发计算。解决用 4.3 的 MutationObserver 监听 body 变化以 URL 变化作为重算闸门。同时在扫描函数里加一层“当前页是否有成绩表格”的校验没有就在面板显示“当前页面没有可计算的 assessment”不要残留上一个班的数据。从那以后我每次切换页面都会顺手瞄一眼面板确认它跟着 URL 变了而不是等数据错了才发现。6. 进阶把计算规则改成自己的——参数表与两个调试习惯先给一套集中配置对象的写法把阈值、权重、舍入策略收在一起避免在多个函数里找散落的魔法数字const config { thresholds: { 7: 85, 6: 70, 5: 55, 4: 40, 3: 30, 2: 20 }, weights: null, // null 表示使用页面自身权重 rounding: last // last 表示最后统一四舍五入each 表示每项先四舍五入 };thresholds按学校实际给分标准填weights为 null 时走 4.1 的页面权重解析你也可以填{final:0.4, midterm:0.3, quiz:0.2, homework:0.1}覆盖它rounding决定舍入时机学校成绩单对不上时优先查这个字段。两个调试习惯我用久了之后基本不会再被成绩单打脸。第一个是 Console 断言每次改完算法或阈值用已知输入跑一遍比如console.assert(calculateGrade([{score:19, max:20, weight:1}], config.thresholds).ib 7, 95 分应映射 7)断言不通过说明参数被改坏了。第二个是反推快照每次期末把扩展输出和老师成绩单同时存成一个 JSON 快照拿到官方总评后与快照比对哪里偏了就去调 thresholds 和 rounding。从那以后我每次改完版本参数都强制用上一学期老师给的成绩单反向验证一遍阈值确认没有悄悄改坏默认值才敢把扩展重新加载到日常使用的 Chrome 配置里。这个参数化思路帮了我很多计算器代码只是起点配置和数据检查才决定它好不好用希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

vscode-leetcode 插件实战指南:在 VS Code 中完成 LeetCode 登录、选题、测试与提交的全流程配置 2026/9/25 7:21:54

vscode-leetcode 插件实战指南:在 VS Code 中完成 LeetCode 登录、选题、测试与提交的全流程配置

开发工具 【免费下载链接】vscode-leetcode Solve LeetCode problems in VS Code 项目地址: https://gitcode.com/gh_mirrors/vs/vscode-leetcode 点击查看 免费下载 vscode-leetcode 是一款将 LeetCode 题库完整搬进 VS Code 的扩展,让你无需离开编辑器…

阅读更多 →
电力建设文档翻译难点解析:Typora全文档翻译工作流实操指南 2026/9/25 7:21:54

电力建设文档翻译难点解析:Typora全文档翻译工作流实操指南

1. 电力建设场景里的翻译需求从哪来干电力建设这行的人,大多觉得翻译是"文职"的事,跟现场施工、设备调试八竿子打不着。结果真到了国际项目上或者接了进口设备的活,才发现文档翻译不只是翻语言,翻错了轻则返工&#xff…

阅读更多 →
计算机专业12类高含金量竞赛全解析与备赛指南 2026/9/25 7:21:54

计算机专业12类高含金量竞赛全解析与备赛指南

1. 计算机专业学生必知的竞赛全景图刚踏入计算机专业的新生们,常常会问同一个问题:"除了上课写作业,我们还能做些什么真正提升竞争力?"作为带过五届ACM校队的教练,我见过太多学生直到大四才恍然大悟——原来…

阅读更多 →
Vivado 2018.3到2025.1编译链路代际升级实战指南 2026/9/25 7:21:53

Vivado 2018.3到2025.1编译链路代际升级实战指南

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

阅读更多 →
OFDM定时同步算法仿真:SC、Minn与Park三类MATLAB实现对比 2026/9/25 7:21:53

OFDM定时同步算法仿真:SC、Minn与Park三类MATLAB实现对比

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

阅读更多 →
Hippy AI 编程实战指南:Cursor / CodeBuddy / Knot 智能体配置与 Prompt 最佳实践 2026/9/25 7:21:47

Hippy AI 编程实战指南:Cursor / CodeBuddy / Knot 智能体配置与 Prompt 最佳实践

跨平台移动开发前端 【免费下载链接】Hippy Hippy is designed to easily build cross-platform dynamic apps. 👏 项目地址: https://gitcode.com/gh_mirrors/hi/Hippy 点击查看 免费下载 本篇指南面向 Hippy 开发者,系统讲解如何借助 AI 编…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉