Vue+ECharts实现中国地图三级下钻与3D飞线可视化
简介这是一套基于 Vue 与 ECharts 的前端地图可视化实战源码面向需要实现中国地图交互展示的前端开发者与数据可视化学习者。资源覆盖中国地图、3D 地图、省—市—县三级下钻与回钻、南海诸岛小窗化显示、点位飞线图以及点位名称弹窗轮播等常见业务场景并附带开发中易遇问题的处理思路适合具备一定 Vue 基础、希望快速落地地图大屏或数据看板项目的读者。压缩包共 28 个文件约 494KB以 9 个 vue 组件、7 个 js 逻辑文件、3 个 json 配置为主另含 png、jpg 图片素材、ttf 字体、css 样式与 html 入口目录按 components、charts、router、views 等模块划分结构清晰。目前已有 5554 人学习下载。解压即可运行读者可直接复用地图下钻、飞线动画与弹窗轮播等核心实现对照组件拆分方式理解 ECharts 与 Vue 的集成思路并借助常见问题说明减少踩坑快速搭建自己的地图可视化页面。1. 从一张会“下钻”的中国地图说起很多做大屏可视化的团队都遇到过这个需求首页一张中国地图点击某个省就钻到该省再点市钻到区县还要能一层层退回来同时地图上要有飞线动画、点位弹窗轮播南海诸岛还得用小窗单独显示。听起来像是某个商业地图 SDK 的活儿但真到落地时你会发现用 vue echarts 这套组合完全能自己撸出来而且可控性更高、不依赖外部服务、打包体积也可控。这篇文章讲的就是这套方案的完整落地路径从中国地图的 GeoJSON 数据准备到 3D 地图的 series 配置到省、市、县三级下钻与回钻的状态管理再到南海诸岛小窗化、飞线图和弹窗轮播。适合正在做大屏、数据看板、区域监控类项目的前端同学也适合想搞清楚 echarts 地图机制、不想被第三方地图组件绑死的开发者。下面按“数据怎么来 → 地图怎么画 → 下钻怎么做 → 坑在哪”的顺序推。2. 地图数据与 3D 底图从 GeoJSON 到可交互地图2.1 为什么不用 echarts 内置地图而自己管 GeoJSONecharts 从 5.x 开始就不再内置中国地图的 JSON 数据了官方建议自行引入 GeoJSON。常见做法是去公开的行政区划数据源拿china.json、各省的xxx省.json、各市的xxx市.json按层级放到public/map/或src/assets/map/下。自己管数据的好处是可以按需加载不用一次性把全国 3000 多个区县全打进包里也方便做缓存和版本管理。数据文件命名建议统一成adcode.json比如100000.json是中国440000.json是广东440300.json是深圳。这样下钻时只要拿到 adcode 就能拼出请求路径不用维护一张巨大的映射表。// mapLoader.js —— 按 adcode 动态加载 GeoJSON const cache new Map(); export async function loadMap(adcode) { if (cache.has(adcode)) return cache.get(adcode); // 约定所有地图数据放在 public/map 下文件名就是 adcode const res await fetch(/map/${adcode}.json); if (!res.ok) throw new Error(地图数据加载失败: ${adcode}); const geoJson await res.json(); cache.set(adcode, geoJson); return geoJson; }这里用Map做内存缓存避免用户反复下钻回钻时重复请求。fetch路径用绝对路径/map/是因为打包后public目录下的文件会原样拷贝到根目录。如果你的项目部署在子路径下记得把 base 拼进去否则会出现 404 但控制台不报错的玄学问题。2.2 注册地图与 3D 效果的实现方式echarts 本身没有真正的 3D 地图所谓“3D 地图”通常有两种做法一是用geo3Dbar3D的echarts-gl扩展二是用geo配合多层mapseries 做伪 3D 挤出效果。前者视觉更立体但依赖echarts-gl后者更轻量、兼容性好。大屏项目里我一般推荐后者因为echarts-gl在低端设备上帧率掉得厉害。伪 3D 的核心思路是底层放一个geo组件做阴影偏移上层放mapseries 做主体再叠加一层高亮边框。下面是最小可运行配置。import * as echarts from echarts; import { loadMap } from ./mapLoader; export async function initMap(dom, adcode 100000) { const chart echarts.init(dom); const geoJson await loadMap(adcode); echarts.registerMap(adcode, geoJson); chart.setOption({ geo: { map: adcode, roam: true, // 允许缩放拖拽 zoom: 1.1, layoutCenter: [50%, 52%], // 稍微下移给阴影留空间 layoutSize: 95%, itemStyle: { areaColor: #0b1c3a, borderColor: #2a6fd6, borderWidth: 1.2, shadowColor: rgba(42,111,214,0.6), shadowBlur: 20, shadowOffsetY: 8 // 关键Y 轴偏移制造立体感 } }, series: [{ type: map, map: adcode, geoIndex: 0, // 复用 geo 的坐标系 emphasis: { itemStyle: { areaColor: #1e4fa3 } } }] }); return chart; }shadowOffsetY是伪 3D 的灵魂参数设成 6 到 12 之间效果比较自然太大就像贴纸飘起来了。layoutCenter和layoutSize控制地图在容器里的位置和占比大屏上一般让地图占 90% 以上宽度。roam: true允许用户缩放但下钻场景里建议配合zoom限制否则用户滚轮一滑就找不到北了。2.3 南海诸岛小窗化显示的处理南海诸岛如果直接画在主图里会让整个中国地图的比例失衡——主图为了容纳南海会缩得很小。常见做法是单独放一个小div里面再初始化一个 echarts 实例只渲染南海诸岛的 GeoJSON或者用一张静态底图加边框。小窗一般放在右下角尺寸 120×160 左右。// 南海小窗独立实例独立数据 export async function initNanhai(dom) { const chart echarts.init(dom); const geoJson await loadMap(460000); // 海南 adcode含南海诸岛 echarts.registerMap(nanhai, geoJson); chart.setOption({ geo: { map: nanhai, roam: false, zoom: 1.2, layoutCenter: [50%, 50%], layoutSize: 100%, itemStyle: { areaColor: #0b1c3a, borderColor: #2a6fd6, borderWidth: 1 } }, series: [{ type: map, map: nanhai, geoIndex: 0 }] }); return chart; }小窗不需要交互roam: false关掉缩放拖拽避免用户误操作。边框可以用 CSS 加一个border: 1px solid #2a6fd6和圆角视觉上更像一个独立的“窗口”。注意小窗的容器宽高必须显式设置echarts 初始化时如果容器高度为 0图表不会渲染这是新手最常踩的坑之一。3. 三级下钻与回钻状态管理与事件链路3.1 下钻的核心adcode 栈与地图重注册下钻的本质是点击某个区域 → 拿到该区域的 adcode → 加载对应 GeoJSON → 重新注册地图 → 更新 series 的 map 字段。回钻则是从栈里弹出上一个 adcode反向操作。用一个数组当栈来管理层级是最简单也最不容易出错的方式。// drillStack.js —— 下钻层级管理 export class DrillStack { constructor(rootAdcode 100000) { this.stack [rootAdcode]; } get current() { return this.stack[this.stack.length - 1]; } push(adcode) { this.stack.push(adcode); } pop() { // 根层级不允许再回钻 if (this.stack.length 1) return null; this.stack.pop(); return this.current; } get canBack() { return this.stack.length 1; } }push和pop只操作 adcode不碰图表实例。图表更新逻辑单独抽一个函数接收 adcode 后完成“加载数据 → 注册地图 → setOption”。这样职责分离回钻时只要调pop拿到 adcode 再走同一个更新函数就行不用写两套逻辑。3.2 点击事件里怎么拿到 adcodeecharts 的mapseries 点击事件回调里params.name是区域名称但params.data里不一定有 adcode。稳妥做法是在 GeoJSON 的features里给每个 feature 的properties补上 adcode 字段然后在registerMap之前处理一遍。// 给 GeoJSON 的 properties 注入 adcode function injectAdcode(geoJson, adcode) { geoJson.features.forEach(f { // 常见字段名有 adcode、code、id做兼容 f.properties.adcode f.properties.adcode || f.properties.code || f.properties.id || adcode; }); return geoJson; } // 点击事件绑定 chart.on(click, async (params) { if (params.componentType ! series) return; const adcode params.data?.adcode; if (!adcode) return; // 已经是当前层级就不重复下钻 if (adcode drillStack.current) return; drillStack.push(adcode); await updateMap(chart, adcode); });params.componentType判断很重要因为地图上可能同时有geo和series不判断会触发两次。adcode做兼容是因为不同数据源的字段名不统一有的用adcode有的用code有的干脆用id。注入一次之后后续点击都能稳定拿到。3.3 回钻按钮与面包屑的联动回钻一般配一个“返回上一级”按钮再加一个面包屑显示当前路径。面包屑的数据直接来自drillStack.stack点击面包屑某一级时把栈截断到那一级即可。// 面包屑点击截断到指定层级 function onBreadcrumbClick(index) { if (index drillStack.stack.length - 1) return; drillStack.stack drillStack.stack.slice(0, index 1); updateMap(chart, drillStack.current); } // 返回上一级 async function onBack() { const prev drillStack.pop(); if (!prev) return; // 已在根层级 await updateMap(chart, prev); }updateMap里要做三件事加载新 GeoJSON、registerMap、setOption更新geo.map和series[0].map。注意registerMap的 key 用 adcode不要用中文名中文名在不同数据源里可能有差异adcode 是稳定的。回钻时如果地图数据已缓存加载会很快视觉上几乎无感。4. 飞线图与弹窗轮播动效与交互的细节4.1 飞线图的 lines series 配置要点飞线用linesseries配合effect做流动动画。起点终点坐标用coord数组坐标系选geo。数据格式是{ coords: [[lng1,lat1],[lng2,lat2]] }。series.push({ type: lines, coordinateSystem: geo, zlevel: 2, // 高于地图避免被遮挡 effect: { show: true, period: 4, // 动画周期秒 trailLength: 0.3, // 拖尾长度0-1 symbol: arrow, symbolSize: 6 }, lineStyle: { color: #4fc3f7, width: 1.2, opacity: 0.6, curveness: 0.2 // 弯曲度0 是直线 }, data: flyLines });zlevel必须设成比地图高的值否则飞线会被地图盖住这是血泪经验。trailLength控制拖尾0.3 左右比较自然太大像一条毛毛虫。curveness给 0.2 到 0.3 让线有弧度视觉上更舒服。period是动画周期飞线多的时候可以适当调大避免太密集。4.2 点位弹窗轮播的实现点位弹窗轮播有两种做法一是用 echarts 的tooltip配合dispatchAction定时触发二是用自定义 HTML 弹窗。前者简单但样式受限后者灵活但要自己算坐标。大屏项目里我一般用后者因为弹窗内容往往有图片、多行文字tooltip 的样式很难调。// 轮播定时切换高亮点位并显示自定义弹窗 let timer null; function startCarousel(chart, points, interval 3000) { let idx 0; clearInterval(timer); timer setInterval(() { const point points[idx]; // 高亮当前点位 chart.dispatchAction({ type: showTip, seriesIndex: 1, dataIndex: idx }); // 自定义弹窗定位 const pixel chart.convertToPixel({ geoIndex: 0 }, [point.lng, point.lat]); showPopup(pixel, point); idx (idx 1) % points.length; }, interval); }convertToPixel把经纬度转成容器内的像素坐标弹窗用绝对定位放上去。注意地图缩放拖拽后像素坐标会变所以要么在georoam事件里重新计算要么轮播时先重置视图。showTip是 echarts 内置的高亮动作配合emphasis样式能让当前点位更醒目。4.3 动效性能与帧率控制飞线 轮播 地图缩放同时跑低端设备很容易掉帧。几个实用手段飞线数量控制在 20 条以内effect.period不要小于 2 秒轮播间隔不低于 2.5 秒地图roam如果不需要就关掉。另外zlevel分层不要太多每多一层就多一次合成开销。// 性能兜底根据设备像素比降级 const dpr window.devicePixelRatio || 1; const chart echarts.init(dom, null, { devicePixelRatio: Math.min(dpr, 2) // 超过 2 没必要反而吃性能 });devicePixelRatio限制在 2 以内高分屏上肉眼几乎看不出差别但渲染压力小很多。这个参数在初始化时就要定后期改不了所以一开始就要想好。5. 避坑与排查下钻地图最常见的 5 个翻车点5.1 点击区域没反应控制台也不报错现象地图渲染正常但点击省份没有任何反应。原因通常是series的geoIndex没设或者mapseries 被geo组件盖住了。解决确认series[0].geoIndex指向正确的geo索引并且series的zlevel不低于geo。另外检查silent是否为true有些模板会默认静默。5.2 下钻后地图空白但数据请求成功现象网络面板显示 GeoJSON 已返回但地图区域一片空白。原因多半是registerMap的 key 和setOption里的map字段不一致。解决统一用 adcode 作为 key注册和引用都走同一个变量。另一个可能是 GeoJSON 的坐标系不是WGS84echarts 默认按经纬度解析坐标系不对会画到屏幕外。5.3 回钻后面包屑和地图不同步现象点返回按钮地图回到了上一级但面包屑还停在当前级。原因面包屑没有监听drillStack的变化是手动维护的。解决把面包屑渲染抽成一个函数每次push/pop后都调一次数据源只认drillStack.stack不要另存一份状态。5.4 南海小窗和主图抢事件现象点击南海小窗时主图也跟着响应了。原因两个 echarts 实例的容器有重叠或者事件冒泡没阻止。解决小窗容器加pointer-events: auto主图容器和小窗不要有重叠区域如果必须重叠在小窗的点击回调里event.stopPropagation()。5.5 飞线在缩放后错位现象地图缩放或拖拽后飞线起点终点和点位对不上。原因lines的coordinateSystem: geo理论上会跟随但如果用了convertToPixel算弹窗位置缩放后没重算就会错位。解决监听georoam事件在回调里重新计算弹窗位置或者干脆在缩放时隐藏弹窗停止操作后再显示。6. 进阶把下钻地图做成可复用的地图组件到这一步地图能画、能钻、能回、有飞线和弹窗但代码散在各个文件里。真正要投入项目得把它收成一个 Vue 组件对外只暴露adcode、points、lines三个 prop内部自己管图表实例、下钻栈和轮播定时器。下面是一个精简版的组件骨架。template div classmap-wrap div refmapRef classmap-main/div div refnanhaiRef classmap-nanhai/div div classmap-breadcrumb span v-for(item, i) in breadcrumb :keyitem.adcode clickonBreadcrumbClick(i) {{ item.name }}/span /div button v-ifcanBack clickonBack返回上一级/button /div /template script import * as echarts from echarts; import { loadMap } from ./mapLoader; import { DrillStack } from ./drillStack; export default { name: DrillMap, props: { rootAdcode: { type: String, default: 100000 }, points: { type: Array, default: () [] }, lines: { type: Array, default: () [] } }, data() { return { chart: null, nanhaiChart: null, stack: null, breadcrumb: [], canBack: false }; }, async mounted() { this.stack new DrillStack(this.rootAdcode); this.chart echarts.init(this.$refs.mapRef, null, { devicePixelRatio: Math.min(window.devicePixelRatio || 1, 2) }); this.nanhaiChart echarts.init(this.$refs.nanhaiRef); await this.renderMap(this.rootAdcode); await this.renderNanhai(); this.bindEvents(); this.startCarousel(); }, beforeDestroy() { clearInterval(this.timer); this.chart?.dispose(); this.nanhaiChart?.dispose(); }, methods: { async renderMap(adcode) { const geoJson await loadMap(adcode); echarts.registerMap(adcode, geoJson); this.chart.setOption(this.buildOption(adcode), true); this.syncBreadcrumb(); }, buildOption(adcode) { return { geo: { map: adcode, roam: true, /* 省略样式 */ }, series: [ { type: map, map: adcode, geoIndex: 0 }, { type: lines, coordinateSystem: geo, data: this.lines, /* 省略 */ }, { type: scatter, coordinateSystem: geo, data: this.points, /* 省略 */ } ] }; }, syncBreadcrumb() { this.breadcrumb this.stack.stack.map(code ({ adcode: code, name: code })); this.canBack this.stack.canBack; }, async onBack() { const prev this.stack.pop(); if (prev) await this.renderMap(prev); }, onBreadcrumbClick(i) { if (i this.stack.stack.length - 1) return; this.stack.stack this.stack.stack.slice(0, i 1); this.renderMap(this.stack.current); }, bindEvents() { this.chart.on(click, async (params) { if (params.componentType ! series) return; const adcode params.data?.adcode; if (!adcode || adcode this.stack.current) return; this.stack.push(adcode); await this.renderMap(adcode); }); }, startCarousel() { /* 轮播逻辑见 4.2 */ }, async renderNanhai() { /* 南海小窗见 2.3 */ } } }; /script这个组件里几个关键设计buildOption把配置集中在一处下钻时只换map字段其他 series 不用重建syncBreadcrumb每次渲染后同步面包屑保证状态一致beforeDestroy里dispose两个实例并清定时器否则页面切走再回来会内存泄漏这是大屏项目跑久了卡顿的常见原因。组件对外只暴露三个 prop内部细节全部封装。如果项目里多个页面都要用地图这个组件可以直接复用只需要传不同的rootAdcode和点位数据。真正投入前建议先在一个页面跑通确认下钻层级、回钻、飞线、弹窗都正常再往其他页面铺。我自己做这类地图的习惯是先把数据加载和registerMap单独跑通确认地图能出来再加下钻再加动效最后收组件。顺序反了的话出问题很难定位是数据、配置还是状态管理的问题。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

Spire.Doc水印清除实战:绕过API失效的文档级干预方案

Spire.Doc水印清除实战:绕过API失效的文档级干预方案

简介:本资源是面向C#开发者与.NET文档处理工程师的Spire.Doc水印清除实战方案,聚焦Word文档中内置及自定义水印(如‘草稿’‘机密’文字水印、半透明背景图)的精准识别与自动化移除。资源包共31个文件,含15个核心DLL&a…

2026/10/17 10:30:05 阅读更多 →
NVIDIA PAIR中文部署完全指南:把家里电脑串成AI算力集群

NVIDIA PAIR中文部署完全指南:把家里电脑串成AI算力集群

NVIDIA PAIR中文部署完全指南:把家里电脑串成AI算力集群 2026年9月3日,英伟达开源了Personal AI Router(PAIR)——一款能在局域网内自动调度AI推理请求的"个人AI路由器"。它不是模型,不生成内容&#xff0c…

2026/10/17 10:30:05 阅读更多 →
电子学会科学技术奖申报答辩PPT定制|突出项目硬核实力

电子学会科学技术奖申报答辩PPT定制|突出项目硬核实力

中国电子学会科学技术奖是经国家科技奖励工作办公室批准,由中国电子学会于2003年设立的奖项,主要奖励在电子信息领域科学研究、技术创新与开发、科技成果推广应用和实现产业化方面取得卓著成绩或者做出突出贡献的集体和个人。该奖项共设立‌5 个奖种‌&a…

2026/10/17 10:30:05 阅读更多 →

最新新闻

端侧智能推理优化指南:从量化到NPU的工程实践

端侧智能推理优化指南:从量化到NPU的工程实践

手里有几个端侧智能项目的推理优化落地之后,我终于有底气把这块硬骨头拆开讲讲。所谓“端侧智能推理优化与加速技术”,说白了就是让模型在手机、平板、车载盒子、边缘工控机这些资源有限的设备上,跑得又快又稳又省电。模型压缩、量化、算子替…

2026/10/17 11:04:15 阅读更多 →
端侧智能推理优化与加速:从模型压缩到运行时调度实战

端侧智能推理优化与加速:从模型压缩到运行时调度实战

端侧智能推理优化与加速这件事,我做了几年,最大的感受是:很多模型在服务器上跑得飞快,一挪到手机、开发板上就“翻车”——要么首帧延迟高得离谱,要么功耗撑不过半小时,要么精度掉到没法用。所谓“端侧高效…

2026/10/17 11:04:15 阅读更多 →
书匠策AI辅助毕业论文写作全流程实战指南

书匠策AI辅助毕业论文写作全流程实战指南

又是一年毕业季,我的私信列表里陆陆续续躺着几十条求助消息,内容几乎一个模子刻出来的:导师催着交开题报告、文献综述憋了一个月还是干巴巴、论文改了第七稿仍然被批逻辑断裂、查重报告飘红一片不知从何下手。毕业论文这四个字,确…

2026/10/17 11:04:15 阅读更多 →
Arduino摩尔斯电码库:零基础5分钟实现LED嘀嗒通信

Arduino摩尔斯电码库:零基础5分钟实现LED嘀嗒通信

简介:这是一份专为Arduino初学者与电子爱好者设计的摩尔斯电码功能扩展库,解决在嵌入式项目中快速实现字符→摩尔斯电码转换及LED信号输出的实际需求,适用于教学实验、创意交互装置开发与通信原理入门实践。资源包共4个文件,含核心…

2026/10/17 11:04:15 阅读更多 →
C++ 手写 AI 编程 Agent(3):工具注册表与文件操作工具集

C++ 手写 AI 编程 Agent(3):工具注册表与文件操作工具集

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

2026/10/17 11:04:15 阅读更多 →
uniapp中scroll-view与swiper联动tab切换的实战避坑指南

uniapp中scroll-view与swiper联动tab切换的实战避坑指南

1. 项目概述:为什么这个组合在实际开发中总让人“手抖”做uniapp项目时,只要页面里有带tab栏的滑动切换需求,几乎没人能绕开scroll-view和swiper这两个组件。但凡你试过用它们搭一个“左右滑动切页顶部tab高亮联动”的功能,大概率…

2026/10/17 11:03:15 阅读更多 →

日新闻

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 阅读更多 →