Ajax动态获取数据ECharts图表:从数据契约到性能优化
简介面向Web开发者的Ajax与ECharts整合实战示例聚焦异步数据加载与可视化渲染场景提供一套可直接运行的ASP.NET项目解决服务器数据动态展示在图表中的需求。压缩包共29个文件包含C#后端代码8个cs、aspx页面与代码隐藏文件3个aspx、前端JavaScript脚本3个js以及dll、config等运行配置整体仅446KB结构紧凑便于快速部署和扩展。已有1209人学习下载适合初中级开发者对照学习Ajax与ECharts的协作流程。项目内含点击按钮加载与页面初始化图表两种经典模式覆盖通过XMLHttpRequest或fetch发送异步请求、解析服务器返回的JSON数据、调用ECharts的setOption方法刷新折线图、柱状图等完整链路并演示了定时器自动轮询、异常捕获、动画过渡等实战细节。读者可将这套方案迁移至实时监控、数据大屏或仪表盘等需要动态展示数据的业务场景快速提升Web应用的数据可视化能力。1. 为什么Ajax动态获取数据 ECHARTS图表这条链路会卡在“有数据却画不出来”这里后端接口明明返回了JSONNetwork面板里也是200页面上的ECharts图表却一动不动。大多数把Ajax动态获取数据 ECHARTS图表当成两段示例代码拼在一起的人都要在这里消耗半天Ajax是异步推进的ECharts初始化是同步完成的数据和option之间没有约定时序和形状渲染就会落空。下面这套拆解先讲清数据格式怎么约定再给一套本地能跑起来的最小代码最后把轮询、性能、跨域这些反复消耗时间的边界问题说透。适合要做大屏、监控后台、运维面板的前端也适合后端同事理解为什么“接口没问题但图不显示”。2. 链路拆解Ajax拿到手的数据到底从哪一步进ECharts2.1 前端和后端之间先定契约统一的JSON包裹格式先说一个常见分歧后端把业务数据裸放在返回体里比如直接返回数组前端拿到后并不知道这次请求是成功还是失败也不知道该不该展示错误页。动态获取数据的页面尤其是每几秒刷一次的监控面板请求失败的概率比静态页面高得多返回格式必须能区分“请求正常但数据为空”和“接口报错”。所以最常见的做法是统一用{ code, message, data }三层包裹code为0表示业务成功data里放真正的数据。这个约定不是ECharts要求的而是Ajax和ECharts之间需要的一层稳定契约。{ code: 0, message: ok, data: { time: 14:23:05, value: 76 } }data里面长什么样由你要画的图表决定。折线图需要时间和数值两个字段柱状图需要一个类目字段和一个数值字段饼图只需要name和value。写后端接口时先想清楚“用户最终看到的图表是什么”再决定返回结构不要先把数据塞给前端让前端自己猜。这里最容易被忽略的是数据类型JSON里的数字如果被序列化成76这种字符串前端拿去做数值轴会得到奇怪结果第5章会专门展开。2.2 发起请求的两种写法XMLHttpRequest与fetch怎么选标题里的Ajax是一个历史词早期指的是通过XMLHttpRequest对象异步拿数据。现在新代码里更常用fetch两者在“动态获取”场景下的差别主要体现在写法、错误处理和兼容性上。// XMLHttpRequest 写法 function loadByXHR() { const xhr new XMLHttpRequest(); xhr.open(GET, /api/trend, true); xhr.onreadystatechange function () { if (xhr.readyState 4 xhr.status 200) { const res JSON.parse(xhr.responseText); renderChart(res.data); } }; xhr.send(); }// fetch 写法 async function loadByFetch() { const response await fetch(/api/trend); if (!response.ok) { throw new Error(HTTP response.status); } const res await response.json(); renderChart(res.data); }XHR写法里需要同时判断readyState 4和status 200readyState为4表示请求已完成status才是HTTP状态码少了任何一个都会漏掉请求结束或成功分支。fetch这一侧网络层面错误会reject但HTTP 404、500并不会自动抛错必须检查response.ok再手动抛出。这是两个写法最常翻车的差异点。我一般建议新项目直接用fetch代码更短也更直观老项目里如果还在维护别人写的XHR代码注意看它是不是只判断了status而忘了readyState。2.3 ECharts的option在消费两份平行数组不是消费整个JSONAjax把数据取回来之后下一步是“怎么塞进图表”。ECharts的渲染逻辑是实例在指定容器上创建然后通过setOption(option)把配置交给实例。动态更新的关键在于setOption在同一个实例上是增量合并的第二次再传option时没有声明的配置会保留声明了的会替换。所以刷新曲线时通常只更新xAxis.data和series.data两个数组。const chartDom document.getElementById(main); const myChart echarts.init(chartDom); function renderChart(payload) { myChart.setOption({ xAxis: { type: category, data: payload.history.map(item item.time) }, series: [{ name: CPU, type: line, data: payload.history.map(item Number(item.value)) }] }); }series.data只接受一个与xAxis.data等长的数组两者下标一一对应。拿到后端JSON后需要先把嵌套结构映射成两个平行数组再交给option。这里最容易漏两件事一是用Number()把字符串数字转成真正的数字二是确认data已经按时间排好序。ECharts不会帮你排序后端如果乱序返回画出来的曲线就是乱跳的。3. 最小可复现本地起一个假接口把图表完整跑通3.1 用Node写一个返回JSON的本地接口不需要完整后端环境Node内置的http模块就够了。把下面内容保存为server.js运行node server.js服务监听3100端口。接口/api/trend每次被请求都会生成一条新的时间点和随机数值用来模拟持续产生的动态数据。const http require(http); let counter 0; http.createServer((req, res) { if (req.url.startsWith(/api/trend)) { counter 1; const payload { code: 0, message: ok, data: { time: new Date().toLocaleTimeString(), value: Math.round(30 Math.random() * 60) } }; res.writeHead(200, { Content-Type: application/json; charsetutf-8 }); res.end(JSON.stringify(payload)); } else { res.writeHead(404); res.end(not found); } }).listen(3100, () { console.log(mock server: http://localhost:3100/api/trend); });这段代码的意图很简单每次GET都返回当前时间字符串和30到90之间的随机数counter只是用来证明请求在持续发生实际项目里可以理解为数据库里新增了一条记录。响应头的Content-Type必须写成application/json; charsetutf-8很多浏览器把接口响应解析成乱码或文件下载就是因为这里被写成了text/plain。3.2 在页面中Ajax动态获取数据并渲染ECharts图表新建index.html内容如下。ECharts先按本地文件方式引入页面加载后先发一次请求再用setInterval每3秒拉一次并更新折线图。!DOCTYPE html html langzh-CN head meta charsetUTF-8 titleAjax动态获取数据 ECHARTS图表 - 最小示例/title script src./echarts.min.js/script style #chart { width: 100%; height: 400px; } /style /head body div idchart/div script const chartDom document.getElementById(chart); const myChart echarts.init(chartDom); const history []; async function loadData() { const url http://localhost:3100/api/trend; const response await fetch(url); const res await response.json(); if (res.code ! 0) { console.warn(业务异常, res.message); return; } history.push(res.data); if (history.length 30) { history.shift(); } myChart.setOption({ xAxis: { type: category, data: history.map(item item.time) }, yAxis: { type: value, min: 0, max: 100 }, series: [{ name: 动态值, type: line, data: history.map(item item.value), smooth: true }] }); } loadData(); setInterval(loadData, 3000); /script /body /html先解释每个重要参数。echarts.init只执行一次页面上创建的图表实例可以反复setOption千万不要在loadData里再init一次否则每次请求都会创建一个新实例页面越来越卡。history数组用来缓存最近30条数据超过长度就shift掉最老的曲线呈现滑动窗口效果。setInterval(loadData, 3000)是驱动动态更新的核心3000毫秒等于3秒监控页面一般取2到5秒太短会给后端造成不必要的压力。smooth: true只是让折线更平滑不改变数据含义。提示直接用file://协议打开本地HTML时浏览器通常不允许向localhost跨源发起fetch。常见做法是在项目目录下起一个静态文件服务再访问http://localhost:3000下的页面。这里翻车率很高跨域问题一度被当成玄学在群里讨论页面白屏、接口却正常返回其实就是浏览器安全策略拦住了跨源请求。3.3 空数据和接口异常也不能让图表白屏很多初版代码只在成功路径里setOption一旦接口异常或data字段不存在图表就停在初始化后的空白状态。“动态获取”意味着数据变化是常态空数据、慢响应、半截JSON都等概率出现。常见做法是把setOption包一层分支至少在空数据时渲染一个“暂无数据”的占位。if (!res.data || res.data.value undefined) { myChart.clear(); myChart.showLoading({ text: 暂无数据 }); return; } myChart.hideLoading();myChart.clear()清空画布showLoading显示加载占位下一次成功请求再调用hideLoading。这个分支应该统一放在render函数里最怕每个调接口的地方各写一套最后连判断逻辑都对不上。标题里的“动态”就体现在这里请求是持续发生的任何一次失败都不能把上一次正常渲染的数据破坏掉。4. 把刷新策略调顺轮询间隔、性能参数与多图表更新4.1 轮询不是实时推送定时器和请求的生命周期必须闭环动态获取数据有两种主流实现setInterval定时拉取和WebSocket推送。标题明确写了Ajax所以这里以轮询为主。轮询最经典的坑是定时器叠加切换页面或重复触发加载后没有清理旧定时器刷新频率会成倍增加页面越用越卡。let timerId null; function startPolling(intervalMs) { if (timerId) { clearInterval(timerId); } timerId setInterval(() { loadData(); }, intervalMs); } function stopPolling() { if (timerId) { clearInterval(timerId); timerId null; } } document.addEventListener(visibilitychange, () { if (document.hidden) { stopPolling(); } else { startPolling(3000); } });参数说明集中在三点。intervalMs不要低于接口平均响应耗时否则上一次请求还没返回下一次又发出去响应顺序一旦颠倒图表数据就会乱序。startPolling内部先clearInterval是为了给定时器上一个“保险”即使某个入口重复调用了startPolling也不会出现并行任务。visibilitychange监听可以在页面切到后台时暂停拉取、回到前台时恢复既省流量又省CPU。如果还想更严谨可以在loadData里加一个isLoading开关请求发出时置true结束时置false下一轮发现仍为true就直接跳过。4.2 动态折线图的三个关键性能参数animation、sampling、dataZoomECharts默认开启动画这在首次渲染时是加分项但数据每秒一刷时会明显拖累性能。通常可以直接关掉动画或只保留更新动画。下面是一份适合动态更新的option核心片段。const option { animation: false, grid: { top: 40, right: 20, bottom: 40, left: 60 }, xAxis: { type: category, boundaryGap: false, data: history.map(item item.time) }, yAxis: { type: value }, dataZoom: [{ type: inside, start: 0, end: 100 }], series: [{ type: line, data: history.map(item item.value), sampling: lttb, symbol: circle, symbolSize: 6 }] };animation设为false是因为每3秒一刷的曲线如果每次都播放过渡动画视觉上是拖影加排队CPU占用明显上升。如果必须保留过渡感可以改成animationDurationUpdate: 300只保留更新动画不要初始动画。sampling的lttb是ECharts内置的降采样算法适合数据点特别多的折线图它会在保留整体趋势的前提下减少绘制点数代价是局部极值可能被弱化。dataZoom提供拖拽缩放窗口的能力在数据攒到几百条之后非常实用。几个参数的选择逻辑可以按下面这张表来定参数推荐配置什么时候调整animationfalse点少于50且希望有过渡时设truesamplinglttb数据点超过200时必开symbolSize4到8点太多时设为0只保留线dataZoomtype: inside需要用户手动缩放时加少于50个点开不开动画感知差别不大超过200个点且持续增长不开采样和关闭动画切换Tab时就能感到明显延迟。4.3 多图表页面用一个render函数批量setOption大屏或监控后台最常见的形态是一个页面里十几张图表如果每张图都写一遍loadData代码重复度会高到难以维护。我习惯把所有图表实例收集到一个对象里后端返回的数据按chartId分发给对应实例。const charts { cpu: echarts.init(document.getElementById(cpuChart)), memory: echarts.init(document.getElementById(memoryChart)), disk: echarts.init(document.getElementById(diskChart)) }; function renderAll(dataMap) { Object.entries(dataMap).forEach(([key, payload]) { if (!charts[key]) return; charts[key].setOption({ series: [{ name: key.toUpperCase(), type: line, data: payload.values }] }); }); } window.addEventListener(resize, () { Object.values(charts).forEach(chart chart.resize()); });Object.entries把后端返回的{ cpu: {...}, memory: {...} }拆成[key, payload]对按图表id找到实例再更新。resize监听是动态图表很容易漏的一条浏览器窗口变化后ECharts不会自动重算尺寸必须手动调用每个实例的resize。如果页面里有隐藏的Tab当初init时容器宽度为0resize后的尺寸也不对建议在Tab切到可见时再调用一次resize这是多图页面在真实项目中最大的坑之一。5. 避坑排查Ajax动态获取数据 ECHARTS图表的高频问题现场5.1 接口有数据页面却一片空白现象Network面板能看到200和JSON代码没有报错chart区域却空白。原因最常见的是容器高度为0。ECharts初始化时如果#chart高度为0canvas会以0高度渲染看起来就是一片空白。另一种常见原因是页面DOM还没就绪就执行了echarts.init。还有一种情况是接口走到了res.code ! 0分支返回值里没有data字段图表自然不渲染。解决给图表容器一个确定高度比如height: 400px不要用百分比高度依赖父级把init放在DOM加载完成之后在render函数第一行console.log(payload)先确认数据真的到了前端。排查顺序固定为console、Network、Elements里canvas的尺寸三步能定位九成空白问题。5.2 曲线能画出来Y轴却出现NaN现象图有线的坐标全是NaNtooltip提示也显示非数字。原因后端把数值序列化成了字符串比如value: 76前端直接把76赋值给series.data计算时得到NaN。第3章的假接口不会出现这个问题因为Math.round返回的是number但真实后端环境里字符串数字非常常见。解决setOption前统一做一次类型归一history.map(item Number(item.value))。注意Number(null)是0Number(undefined)是NaN如果字段可能缺失要先判断item.value null不能无脑转换。5.3 定时器只生效了一次后续图表再也不更新现象页面打开后能画出第一条数据之后接口每3秒都被请求图却永远停在第一帧。原因这是最经典的“重复init覆盖实例”问题。代码把echarts.init写在了loadData内部每次请求都创建新实例旧实例被丢弃或错乱页面挂载的canvas和正在setOption的实例对不上显示永远停留在第一帧。解决echarts.init永远只调用一次实例对象放在全局作用域loadData里只做myChart.setOption。可以记一条检验标准代码里init出现的次数必须等于页面里图表的个数如果init出现在循环或请求回调里基本可以断定会翻车。5.4 切换Tab再回来刷新频率突然加倍现象离开监控页十几秒切回来发现Network里的请求数量成倍增加页面明显卡顿。原因setInterval没有被清理多个定时器同时在跑。定时器泄漏的根源通常是只有setInterval没有clearInterval或者清理时机没有挂在正确的生命周期钩子上。解决给定时器保存一个timerId页面隐藏时停可见时重启具体模板见第4.1节。另一个补充习惯是创建定时器前先clearInterval(timerId)给定时器上一道保险即使某个生命周期漏了也不会出现叠加。5.5 数据点过万后页面卡成幻灯片现象图表运行一段时间后积累上千个点拖动、缩放、切换都明显卡顿。原因ECharts默认渲染全部数据点动画和符号绘制都会消耗主线程。动态获取数据的场景里历史数据只增不减最终会拖垮性能。解决给series配sampling: lttb长期增长的页面直接animation: false必要时用dataZoom限制可视范围。如果业务允许前端只保留最近200条再配合后端按时间范围查询图表永远只处理固定窗口的数据。性能优化没有银弹三者组合使用比单一手段可靠。6. 手动造一份不可见的数据把验证闭环做扎实动态图表的验证比静态图表复杂得多。静态图刷新看一次就行动态图要反复验证接口断连、空数据、字符串数字、超大返回体四类异常。这里有一个我常用的技巧在浏览器开发者工具的Console里临时覆盖fetch让页面不依赖后端就能测试异常分支。const originalFetch window.fetch; window.fetch async function (url) { if (String(url).includes(/api/trend)) { return new Response(JSON.stringify({ code: 0, message: ok, data: { time: test, value: 123abc } }), { status: 200, headers: { Content-Type: application/json } }); } return originalFetch(url); };把这段代码贴进Console再手动调用loadData页面会把123abc当成真实数据此时如果图表出现NaN说明类型归一没做好把data换成value: null可以验证空值分支把Response里的status改成500能验证异常路径。这个技巧的价值在于不用改后端代码、不用重启服务几分钟内把异常分支全部覆盖一遍。我习惯在发布任何图表页面之前先用Mock跑一遍“接口宕机两分钟再恢复”的序列观察页面能否自愈。最后说一个从某监控大屏Demo上得到的血泪经验动态图表最怕的不是某一次请求失败而是长时间运行后数据越来越长、定时器越来越乱这两类问题在开发环境根本看不出只有让页面跑上一夜才会暴露。所以我每做完一版动态图表都会开着页面同时盯Network和Performance两个面板看请求间隔是否稳定、渲染耗时是否上涨。改完任何一处也都先手动把返回体换成上面说的四类数据各跑一遍。希望这篇笔记能帮你建立起这套验证习惯别等凌晨三点才发现曲线不动了。本文还有配套的精品资源点击获取

相关新闻

AI建站部署实战:2小时上线合规出海工具站

AI建站部署实战:2小时上线合规出海工具站

1. 项目概述:这不是“一键建站”,而是把AI建站当真实产品来打磨“AI建站部署全流程:2小时从零上线一个出海工具站”——这个标题里藏着三个关键信号:AI不是噱头,是核心生产力;部署不是演示,是真…

2026/10/14 5:53:18 阅读更多 →
NVIDIA Agent Skills实战:让Claude Code成为GPU运维专家

NVIDIA Agent Skills实战:让Claude Code成为GPU运维专家

第一次看到“2.4k Star”这个数字的时候,我脑子里闪过的其实是“又一个提示词合集”——毕竟这两年开源社区里各种 Skill、Prompt 库、Agent 模板实在太多了,打开一看基本就是一堆 Markdown 文件。直到我把 NVIDIA 这套 Agent Skills 里几个技能真正接进…

2026/10/14 5:53:18 阅读更多 →
基于Vue+Node.js的评教系统设计与实现:从表结构到权限控制

基于Vue+Node.js的评教系统设计与实现:从表结构到权限控制

每次到学期末尾,教务那边最头疼的事就是组织评教。以前是发纸质问卷,一份一份收,再用读卡机扫答题卡,光统计一道题的得分率就得折腾两三天。后来某高校的计算机基础课程教研组决定换一套在线方案,我接手做了全部前后端…

2026/10/14 5:52:18 阅读更多 →

最新新闻

深度学习损失函数选型实战:从MSE到Focal Loss的原理与踩坑

深度学习损失函数选型实战:从MSE到Focal Loss的原理与踩坑

损失函数这玩意儿,说起来是深度学习里最基础的组件之一,但恰恰是很多同学在实战里翻车最频繁的地方。我带项目的时候经常看到有人模型结构抄得挺像样,学习率调度也配了一堆,可训练出来的结果就是不对,Loss 曲线跟心电图…

2026/10/14 6:38:29 阅读更多 →
微信小程序聊天室:WebSocket实时通信与图片消息实现

微信小程序聊天室:WebSocket实时通信与图片消息实现

上个月接了个需求,要做微信小程序聊天室,支持文字消息和图片消息,图片要能直接发到聊天流里。团队里一位同事提议先上HTTP轮询,2秒拉一次,省事。我说这个方案在简单场景下能跑,但聊天室里撑不住多少用户。后…

2026/10/14 6:38:29 阅读更多 →
SQLite FTS5+BM25实现上下文感知搜索(context-mode)

SQLite FTS5+BM25实现上下文感知搜索(context-mode)

1. “context-mode”到底是什么?别被术语唬住,它本质是让工具真正“听懂你话”的底层机制 “context-mode”这个词最近在开发者社区、低代码平台和本地AI工具链里高频出现,但翻遍官方文档,几乎找不到一句清晰定义。我最初看到它时…

2026/10/14 6:38:29 阅读更多 →
QGIS 加载天地图 403 权限类型错误(301013):User-Agent 分流与三种解法

QGIS 加载天地图 403 权限类型错误(301013):User-Agent 分流与三种解法

场景QGIS 里挂天地图底图,画面全空。F12 或者 QGIS 的网络日志里刷一片 403,响应体是:{"code":301013,"msg":"权限类型错误"}天地图控制台里 key 明明状态正常、配额也没用完,换一个浏览器端 key 试…

2026/10/14 6:38:29 阅读更多 →
极地环境计算设备可靠性测试:低温启动与温循实战指南

极地环境计算设备可靠性测试:低温启动与温循实战指南

把服务器从20℃的调试间一路运到零下四十多度的极地站点,开机那一刻,谁都不敢保证屏幕上是正常的登录界面还是黑屏。我在嵌入式测试这一行摸爬滚打了十几年,实验室里跑高低温箱和真正面对“跨越温差的可靠性挑战”,是完全两种体验…

2026/10/14 6:38:29 阅读更多 →
Simulink Bode图频域分析:线性化与稳定裕度实战

Simulink Bode图频域分析:线性化与稳定裕度实战

简介:这份资源面向学习自动控制原理、从事控制系统频域分析的初学者与工程人员,针对传统用MATLAB M语言绘制Bode图耗时费力、不便直观理解频域指标的问题,讲解如何借助Simulink可视化工具完成开环与闭环Bode图的绘制。资源包内含1个PDF文档&a…

2026/10/14 6:37:29 阅读更多 →

日新闻

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/12 18:11:17 阅读更多 →