ArcGIS Online托管要素图层实战:从发布到查询编辑的完整指南
做GIS项目这几年和ArcGIS Online打交道最多的就是FeatureLayer。最初我以为它不过是“上传数据后生成的那张在线地图”直到有一次把巡检数据发布上线被同事追问“你这个图层能不能按字段动态筛选”“能不能让外勤人员也改属性”我才意识到自己根本没弄懂托管要素图层的定位。或者换一种更直白的说法FeatureLayer不是一张画好的图它是一个能被反复查询、编辑、过滤、联动的在线数据服务地图只是它的可视化外壳。这篇文章我想把ArcGIS Online里从创建FeatureLayer、配置样式、查改数据到踩坑排错的经验完整整理一遍。适合刚接触ArcGIS Online、想把手头业务台账变成团队可查可编辑地图的团队参考也适合已经发布过图层但一直没搞懂内部工作机制的开发者。文中用到的示例数据均为虚构项目我是按真实项目里的常见情况来讲的所有代码片段都来自实际调试过的写法。1. 托管要素图层与普通地图服务的本质区别1.1 不要把它当成一张“图”很多人第一次接触FeatureLayer会按字面理解成“地图上那些点线面”。这个理解不准确。ArcGIS Online里的托管要素图层Hosted Feature Layer本质是一个运行在云端的关系型数据存储外加一套开放的查询、编辑、渲染接口。它不是静态图片也不是切片地图而是数据本身。打个比方动态地图服务或切片地图服务像是印好的纸质地图拿到手只能看最多量一量距离不能修改上面的任何一笔。而托管要素图层像是一个挂在网上的“活台账”背后的每一行属性、每一个几何对象都能被单独访问和修改地图只是它对外的一种展示形式。关键在于别人看到的永远是最新状态你改了数据地图跟着变。1.2 服务、图层、要素三者的关系在ArcGIS Online门户里一个托管要素图层通常会对应一个“项目”Item。这个Item背后有一整套结构服务层一般在REST地址里表现为FeatureServer图层层一个FeatureServer可以包含多个图层LayerURL形如FeatureServer/0、FeatureServer/1要素层每个图层下有若干要素Feature每个要素就是一条带几何和属性的记录很多人混淆“服务”和“图层”一个服务可以挂多个图层每个图层有独立的字段结构和几何类型。比如我维护一份综合巡检数据按业务拆成“设施点位”和“巡检轨迹线”两个图层它们可以在同一个服务下面URL后半段不同。这个从REST地址上一眼就能看清。1.3 “托管”两个字意味着什么“托管”意味着ArcGIS Online替你完成存储、空间索引、属性索引、备份和并发访问控制。你要做的是管理数据结构、样式和权限不用担心数据库崩了怎么办、空间索引怎么建。但代价是平台对字段数量、字段名规则、单图层要素规模、查询复杂度都有限制这些限制后面专门说。如果不把数据放到托管服务上还有一种用法是把外部数据源比如企业内部的GIS服务器注册到Portal里再供图层引用。这种情况下数据安全与维护职责仍在自己这边ArcGIS Online只是聚合了访问地址。托管和外部引用最大的差别在于托管服务能直接用ArcGIS Online自带的编辑、附件、分析工具外部引用往往只能读取编辑能力受限甚至需要另配身份验证。2. 创建FeatureLayer的完整流程从文件发布到在线可查2.1 数据预处理的标准流程先把本地数据准备好这一步做不好后面改起来非常痛苦。我习惯按以下顺序检查确定几何类型一个图层里只能有一种几何类型。点、线、面如果混在一个表里最好拆成多个图层。比如一个Excel表里既有点位又有范围多边形就不要指望一次性发布成单一要素图层。清理字段名字段名只用ASCII字符不要空格、中文、特殊符号。ArcGIS Online虽然支持设置中文别名但REST API的outFields参数引用英文原名更稳妥在很多低代码配置界面里写过滤表达式也不会踩坑。检查字段类型文本、整数、小数、日期、大文本要提前分清楚。手机号、设备编号这类“看起来像数字”的字段如果不参与数值计算尽量设置为文本否则前导0丢失、长尾编号变科学计数法都是常见事故。统一坐标系尽量归一为WGS84经纬度WKID 4326或Web Mercator3857。如果原始数据是地方坐标系先转好再发布。多个图层叠加时坐标不一致会出现明显的错位而这类问题往往不在图层本身而在坐标系设置。2.2 发布Shapefile的实操步骤以最常见的Shapefile为例完整流程是本地确认该文件夹里只有一个要素数据集对应的配套文件.shp、.dbf、.shx、.prj等多余的说明文件先移到别处。将整个文件夹压缩成zip注意zip内不要多包一层同名文件夹。登录ArcGIS Online进入“内容”Content页面将zip拖入上传区域。上传完成后进入该项目的详情页点击“发布”Publish选择发布为托管要素图层。配置标题、标签、类别和权限范围私有/组织/公开。等待发布完成系统会自动生成对应的要素图层Item并附带一个能引用该图层的REST端点。这个流程里最容易翻车的是zip内包含多个shp文件发布后会生成一个含多个图层的FeatureServer服务而不是单个要素图层。如果你只想要一个图层尽量一个zip只包含一个shp。2.3 CSV上传的特殊细节CSV上传和Shapefile不太一样CSV本身不带几何ArcGIS Online会尝试通过地址匹配或经纬度字段自动生成几何。有几个细节容易忽略如果CSV里有中文列名系统不一定能自动识别经纬度字段需要在“字段设置”里手动指定经度、纬度列。手动指定完成后地图预览里点位坐标才正确。地址匹配方式需要额外的定位服务如果只是经纬度数据不要走地址匹配直接指定XY字段更快更准确。上传的CSV默认把每一行文本都当作UTF-8处理如果源文件是GBK编码中文会显示乱码上传前先用编辑器转成UTF-8。2.4 发布过程中容易被忽略的服务设置“仅更新”与“每次覆盖”仅更新适用于定期追加数据覆盖会先删除旧数据再加入新数据。启用编辑团队需要在线增删改时必须在服务属性里勾选“允许编辑”否则其他人只能查看。启用附件需要在要素上挂照片、扫描件时要单独开启附件功能。开启后REST端点上会出现附件相关接口。启用时间能力数据有日期字段且想做时间轴动态展示时需要把某个日期字段指定为图层的时间字段。发布后我去看一眼REST端点确认图层ID、字段名、几何类型都符合预期再进入下一步样式配置。这一步花不了几分钟但能避免后续开发时频繁对照文档。3. 符号化与可视化把原始数据调成一张能读的地图3.1 渲染器类型的选择逻辑数据发布成功只是第一步地图好不好看、能不能传达信息取决于你给图层配的渲染器。ArcGIS Online Map Viewer和ArcGIS API for JavaScript里的渲染器常见的就这么几类简单渲染器Simple Renderer所有要素一个样式适合底图、轮廓、参考数据。不突出任何属性只回答“在哪儿”。唯一值渲染器Unique Value Renderer按分类字段区分颜色适合“设备类型”“状态”“科室”这类离散属性。分级色彩渲染器Class Breaks Renderer按数量字段分档设色适合“用户数”“巡检次数”“面积”这类连续数量。比例符号渲染器Proportional Symbols点大小随属性变化适合“人口规模”“功率”“产量”。热力图渲染器Heat Map只看点的空间密度不关心属性适合数量极大的散点。选型的原则很简单你最终想回答什么问题。如果答案是“哪里多、哪里少”用分级或热力图如果答案是“哪些类型不同”用唯一值如果只是“在哪”简单渲染器足够。3.2 过滤表达式和图层效果的使用符号化不一定非改原始数据。Map Viewer里可以用“过滤”Filter写表达式临时筛出部分要素显示。过滤在后台会转成查询不影响源数据。与之相对的“定义查询”Definition Query是图层级配置会直接影响后续所有请求适合“这个图层默认只显示本月数据”这类固定规则。样式细节上几个我实测有效的习惯面图层的轮廓线建议比填充色深一个色级相邻区域才分得清点图层建议关闭“随比例尺放大”功能否则缩放大比例尺时点会膨胀成气泡透明度不要低于30%否则地图背景透出来颜色变得脏兮兮也影响识别。3.3 实操案例巡检台账的“超期未检”展示模拟项目里我有一个公共设施巡检图层字段包括facility_type设施类型、status状态、last_check_date最后巡检日期、check_count巡检次数。巡检负责人最关心的是“哪些设施很久没人管了”。我做的是在Map Viewer中打开图层选择“样式”Style。选择“计数和数量”Counts and Amounts再选“颜色渐变”Color。字段选last_check_date系统会把日期差值作为数量处理。分级方式选“自然间断点”Jenks颜色序列从绿到黄再到红。图例里把“必填显示”勾上方便看图的人理解颜色含义。这样近7天巡检过的点位呈绿色近30天呈黄色超过30天未检呈红色一眼就能让外勤人员看到重点。自然间断点分级对非正态分布数据非常友好比等间距分段更能保留真实分布特征。4. 查询与编辑通过REST API操作FeatureLayer的实战要点4.1 属性查询与空间查询的关键参数Web端集成FeatureLayer实际用的都是REST API。核心就是向要素服务的查询端点发送HTTP请求GET https://service-url/FeatureServer/0/query?wherecheck_count%20%3E%2010outFieldsfacility_type,last_check_datereturnGeometrytruefjson几个关键参数要特别注意whereSQL风格的条件支持等于、大于、LIKE、IN、IS NULL。字段名大小写通常不敏感但字符串值要用单引号括起来。returnGeometry默认true。如果只是做统计、拉属性设为false能省大量网络流量。outFields默认只返回OBJECTID和FID需要其他字段必须显式列出别偷懒写*。resultOffset/resultRecordCount分页参数和数据库里的limit/offset一致。orderByFields排序字段可以逗号分隔多个字段。空间查询则是通过geometry参数配合spatialRel完成esriSpatialRelIntersects相交esriSpatialRelWithin完全在范围内esriSpatialRelContains包含esriSpatialRelTouches相邻最常见的场景就是前端画一个范围框把多边形传进去筛出范围内的设施。ArcGIS API for JavaScript里的标准写法是const layer new FeatureLayer({ url: https://service-url/FeatureServer/0 }); const query layer.createQuery(); query.geometry polygon; query.spatialRelationship intersects; query.outFields [facility_type, status, last_check_date]; const result await layer.queryFeatures(query);注意query.geometry只支持单个几何对象需要多区域查询就得多查几次再合并结果前端做“跨区域全选”时容易漏掉这一点。4.2 增删改操作与附件上传托管要素图层支持在线编辑核心接口是applyEdits可以同时处理新增、更新、删除const edits { addFeatures: [{ attributes: { facility_type: 井盖, status: 待检, check_count: 0 }, geometry: { x: 120.123, y: 30.456, spatialReference: { wkid: 4326 } } }], updateFeatures: [{ attributes: { OBJECTID: 1024, status: 已检 } }], deleteFeatures: [{ objectId: 2048 }] }; const result await layer.applyEdits(edits);几个实战要点新增时几何坐标系必须明确不带spatialReference容易出现坐标被当成默认坐标系而偏到海里。更新只需要传OBJECTID和要修改的字段不必把整条记录都传回来减少数据和冲突面。applyEdits返回结果里每个操作都有独立的success和error要逐个检查不能只看HTTP状态码。删除基于OBJECTID一次可以传多个id但如果要素参与关系联动要先把关联数据处理好。附件上传走独立端点通常叫addAttachment可以给指定OBJECTID挂照片、PDF、现场单据。图片压缩后再上传会快很多我在传现场照片时一般先压到1MB以内服务端响应速度提升明显。4.3 权限模型谁能读、谁能改无论API怎么调用最后都要过服务的权限这关。ArcGIS Online上图层权限主要分两层可见性所有人、组织内成员、仅指定群组编辑性任何人都可编辑、组织内成员可编辑、仅部分群组可编辑、仅管理员可编辑内部巡检数据建议用“组织内成员可编辑”别图省事开“任何人可编辑”。地图链接一旦泄露外部人员可以通过REST端点改数据这种事在项目里不是没遇到过。权限设置直接在图层Item页面的“共享与权限”里调整改完即刻生效不需要重新发布。5. 我在项目中踩过的坑字段类型、性能、时区与并发编辑5.1 字段类型设计发布前想清楚发布后很痛苦这是我反复交学费的地方值得单独拿出来说。某个模拟项目里设备编号字段看起来是数字我设成了Double后来发现编号里有前导0全被丢了超过15位的ID末位直接变成0。要把Double改成字符串在ArcGIS Online里没有一键修改只能新增字段、写自动化、计算值再把原字段删掉重做样式和查询配置。用下面这张表管住字段类型基本不会出错场景字段类型原因名称、编号、分类标签、URL文本保留前导0、避免科学计数法查询稳定计数、序号、状态码整数无需小数占用空间小测量值、坐标、面积小数保持精度时间记录、用于时序分析日期时间轴和时间过滤需要日期类型长文本备注大文本内容不受255字符限制但排序和模糊查询性能弱5.2 大数据量场景的性能边界托管要素图层不是没有上限。实测在几十万到百万级要素的图层里做查询明显开始变慢尤其在前端把全部要素拉下来再过滤的场景卡顿非常突出。两个常用方向数据分层按年份或行政区拆成多个图层查询时按需求命中对应图层避免一次全表扫描。客户端聚合点数据量大时用聚类功能前端只绘制聚合后的簇缩放时再细分。查询优化的习惯也很重要outFields只选需要的字段空间查询先用一个粗略的bbox缩小范围再精确相交能用SQL过滤的就不下载全量再筛。很多性能问题其实不是平台慢是客户端把数据下载全了才想过滤。5.3 时区问题日期字段的显示与统计巡检月报经常出现“数据在数据库里是对的导出来却差8小时”的情况。原因是托管要素图层的时间字段默认按UTC存储前端显示时按浏览器本地时区转。中国区是UTC8所以写入时间建议直接用ISO8601带Z后缀的UTC时间避免歧义。做时间轴展示时Map Viewer一般按本地时区显示但REST API返回的是原始UTC。写统计脚本圈定“自然日”时必须先把本地时间边界转成UTC后再写where条件否则当天零点之后的数据会被算到前一天。我现在的做法是业务写入统一存UTC报表展示时在查询端再按本地时区转换。数据层不做“北京时间格式化存储”否则一旦跨时区协作时间全是歪的。这个坑排查起来很隐蔽因为单机看数据都是对的。5.4 并发编辑与版本冲突在线编辑方便但多人同时改同一个要素时可能发生后写覆盖前改的情况。托管要素图层不提供企业级地理数据库那种复杂版本管理它更多依赖乐观并发更新请求会带要素版本信息服务端发现明显冲突会返回错误但不保证拦下所有覆盖。现实里的处理思路给图层增加“编辑人”“编辑时间”字段通过自动化规则自动填充至少留痕。更新请求返回编辑结果后前端检查是否有其他用户同时改过该要素提示用户刷新后再改。关键字段经费、坐标、状态建议由专人维护其他成员提交变更申请而不是全员直接改。并发要求高的场景考虑用云端脚本做队列化更新避免同时写库。6. 重新做一遍FeatureLayer项目时我的自检清单如果让我再从头做一个FeatureLayer项目我会按下面的顺序检查每一步都对应前面讲过的坑发布前字段名用英文、编号类字段设文本、坐标系统一为4326或3857、混合几何拆图层。发布后先看REST端点确认图层ID和字段类型再配置样式和过滤最后才开放权限。集成前写一个最小查询脚本确认outFields字段名、时区偏移、分页返回都正常再用applyEdits跑一遍增删改。上线后定期用ArcGIS Online的“复制”功能做备份比导出下载轻量在图层Item里加一个说明字段写明字段含义和数据更新频率免得三个月后自己都忘了字段是干什么用的。最后分享一个每天都能用到的小技巧在查询where条件里文本字段加引号、数字字段不加引号日期字段用date 2025-01-01这种写法REST API对日期值的兼容性最好。我见过太多人把日期写成字符串结果边界条件永远差一天。先把这些细节打牢FeatureLayer才能真正成为团队可依赖的数据底座。

相关新闻

从应用到驱动:Linux文件读写与字符设备驱动全解析

从应用到驱动:Linux文件读写与字符设备驱动全解析

1. 从应用层到驱动层:一次read调用背后到底发生了什么我们平时写文件读写,往往一句fread或者read就完事了。但如果你把这句话放到面试官面前,或者放到一次线上性能问题排查现场,事情就没那么简单了——因为从你敲下这行代码&#…

2026/10/14 17:56:18 阅读更多 →
多分类logistic回归:可解释分类建模的基石方法

多分类logistic回归:可解释分类建模的基石方法

1. 这不是“升级版线性回归”,而是分类任务的基石型工具你可能在某次建模中被要求“给用户打标签”——比如判断一个电商用户是“价格敏感型”“品牌忠诚型”还是“新品尝鲜型”;也可能在医疗场景里看到模型输出“低风险/中风险/高风险”三类预警&#x…

2026/10/14 17:56:18 阅读更多 →
算法背后的数学直觉:五个公式让复杂问题迎刃而解

算法背后的数学直觉:五个公式让复杂问题迎刃而解

上周有个朋友发来一道题让我帮忙看:给一个 n,最大 10^7,求 1 到 n 所有数的约数个数之和。他说自己写了一个 O(n√n) 的版本,n 到 10^5 就卡死了,问我是不是该上个什么高级数据结构。我看了眼他的代码,第一…

2026/10/14 17:55:17 阅读更多 →

最新新闻

Semantic Router 与 vLLM AIBrix 集成部署实战:在 Kubernetes 上搭建可扩展的语义路由推理网关

Semantic Router 与 vLLM AIBrix 集成部署实战:在 Kubernetes 上搭建可扩展的语义路由推理网关

后端API网关模型推理服务AI Agent 【免费下载链接】semantic-router An open, programmable decision layer for models and compute. 项目地址: https://gitcode.com/gh_mirrors/sem/semantic-router 点击查看 免费下载 本指南以 Semantic Router 官方文档中「使用…

2026/10/14 18:48:03 阅读更多 →
Activiti HistoryService实战:历史数据查询、清理与归档指南

Activiti HistoryService实战:历史数据查询、清理与归档指南

1. 为什么流程明明跑完了,还得单独维护一套历史数据学习Activiti的时候,大多数人会把精力放在流程定义部署、RuntimeService启动流程、TaskService处理任务这些"正在发生"的事情上。我一开始也是这样,直到某个项目上线大半年后&…

2026/10/14 18:48:03 阅读更多 →
JavaSE初学者课堂作业

JavaSE初学者课堂作业

摘要:本文是计算机大一新生对 JavaSE 学习内容的课堂总结。文章首先介绍了数据类型与程序逻辑控制两大基础知识点,随后规划了后续学习路线,包括面向对象、集合框架、异常处理、IO 流四个核心模块,并逐一说明它们与 AI 应用开发岗位…

2026/10/14 18:48:03 阅读更多 →
AntDesignPro of Vue权限管理实战:路由与按钮级权限设计

AntDesignPro of Vue权限管理实战:路由与按钮级权限设计

1. 权限管理在后台系统里到底管什么后台管理系统做久了,你会发现一个规律:功能越堆越多,最先扛不住的往往不是性能,而是权限。谁能看到哪个菜单、谁只能看不能改、谁连按钮都不该看见,这些问题如果一开始没设计好&…

2026/10/14 18:48:03 阅读更多 →
ponytail:当代职场的情绪标点与轻量协作语言

ponytail:当代职场的情绪标点与轻量协作语言

1. 项目概述:从“ponytail”这个词开始,我们到底在聊什么?“ponytail”这个词最近频繁出现在社交平台的评论区、弹幕和短视频标题里,但它早已不是字典里那个“马尾辫”的简单释义。我做内容运营和用户行为分析十多年,见…

2026/10/14 18:48:03 阅读更多 →
React Native应用难以破解?morphe-patches的Hermes字节码十六进制补丁与哈希修复技巧

React Native应用难以破解?morphe-patches的Hermes字节码十六进制补丁与哈希修复技巧

【免费下载链接】morphe-patches 🍃 Human-made patches for Morphe 项目地址: https://gitcode.com/gh_mirrors/mor/morphe-patches 点击查看 免费下载 morphe-patches 是一个为 Android 补丁工具 Morphe 提供社区补丁的开源仓库,其中最硬核…

2026/10/14 18:47:02 阅读更多 →

日新闻

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/14 16:30:29 阅读更多 →
影刀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 阅读更多 →