国家地名数据库代码编制规则落地实践:从PDF到数据库的完整指南
简介《国家地名数据库代码编制规则》PDF文档面向民政地名管理、地理信息系统开发及数据标准化相关从业者用于解决地名编码不统一、数据难以互通的问题。文档系统梳理了20位地名数据库代码的四段结构前6位县级以上行政区划代码遵循GB2260三层六位层次码中间3位按GB/T10114-2003标识街道、镇、乡及政企合一单位第3段5位依据GB/T18521-2001划分地名属性类别末段6位附加码用于区分同类同区地名。同时说明了代码管理职责、更新维护机制及《地名分类与类别代码编制规则》的分类原则与引用规范。资源包为1个PDF文件约229KB轻量便携适合随时查阅对照。已有73人学习可作为地名信息化建设、数据采集与公共服务中的编码参考手册。1. 地名代码编制一份 PDF 背后藏着多少落地细节如果你手头拿到一份《国家地名数据库代码编制规则.pdf》第一反应大概率是这不就是个编码规范吗照着填不就完了。真到动手把几万条地名数据往库里灌的时候你才会发现事情没那么简单——同一个地名在不同层级出现代码到底取哪一段行政区划调整之后旧代码怎么处理跨省同名乡镇怎么保证唯一性。这些问题在 PDF 里都有答案但答案散落在不同章节不系统梳理一遍翻车是迟早的事。这份规则本质上解决的是地名数据的唯一标识问题。它定义了一套分层分段、定长编码的体系让每一条地名记录在全国范围内有一个稳定、可解析、可校验的代码。适合谁看做政务数据治理的、做地理信息系统的、做地址标准化服务的以及任何需要把地名当成结构化字段来处理的开发者。下面我按实际落库的顺序把这份规则拆成能直接抄作业的步骤。2. 代码结构拆解从行政区划到地名实体的分段逻辑2.1 为什么是分段定长而不是流水号很多团队第一版方案喜欢用自增 ID 或者 UUID 来标识地名简单省事。但地名数据有几个特殊之处它天然有层级关系省-市-县-乡镇-村需要支持前缀匹配查询它需要跨系统交换对方系统不一定能查你的自增表它还需要人眼可读运维排查时看一眼代码就知道大概位置。分段定长编码正好满足这三点。规则里把代码分成若干段每段对应一个层级或一类属性段长固定。这样前缀就是上级区划后缀就是本级序号解析逻辑可以写成纯字符串操作不需要查表。常见做法是前 6 位给行政区划中间若干位给地名类别和顺序号最后留校验位。2.2 各段位的含义与取值边界规则里最核心的一张表是段位定义。我把它整理成下面这个结构方便你对照 PDF 原文核对段位长度含义取值说明第 1 段6 位县级及以上行政区划代码参照 GB/T 2260左对齐补零第 2 段3 位地名类别码规则附录中定义如自然村、街道、河流等第 3 段6 位同一类别下的顺序号按录入顺序或空间顺序分配不可重复第 4 段1 位校验位按规则给定的加权算法生成这里最容易出错的是第 1 段。GB/T 2260 的代码是 6 位但有些历史数据里存的是 4 位或 5 位直接拼接会导致整个代码错位。我一般会在入库前加一个规范化步骤统一补零到 6 位。2.3 用 Python 实现一个代码解析器下面这段代码把一条完整的地名代码拆成各段并做基本校验。你可以直接拿去改# 地名代码解析器输入完整代码输出各段含义 # 假设代码总长 16 位6 位区划 3 位类别 6 位顺序 1 位校验 def parse_place_code(code: str) - dict: # 第一步长度校验不符合直接抛异常 if len(code) ! 16: raise ValueError(f代码长度应为 16 位实际为 {len(code)} 位) # 第二步分段截取注意 Python 切片左闭右开 admin_code code[0:6] # 行政区划段 category_code code[6:9] # 地名类别段 seq_code code[9:15] # 顺序号段 check_code code[15:16] # 校验位 # 第三步校验位验证规则里给的是加权模 11 算法 weights [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16] total sum(int(code[i]) * weights[i] for i in range(15)) expected total % 11 # 校验位为 10 时用 X 表示这是常见约定 expected_char X if expected 10 else str(expected) if check_code ! expected_char: raise ValueError(f校验位不匹配期望 {expected_char}实际 {check_code}) return { admin_code: admin_code, category_code: category_code, seq_code: seq_code, check_code: check_code, valid: True } # 调用示例 result parse_place_code(110101001000001X) print(result)逻辑说明先做长度校验因为定长编码一旦长度不对后面所有切片都是错的。然后按段位定义依次截取。校验位算法用的是加权模 11权重从 2 开始递增这是规则里明确给出的。注意校验位为 10 时用 X 表示这个细节在 PDF 的附录里有写但很容易被忽略。参数说明code是字符串类型不要传整数否则前导零会丢失。weights数组的长度必须等于代码总长减一即参与校验的位数。如果你拿到的规则版本权重起始值不同以 PDF 为准调整。2.4 批量生成代码时的顺序号分配策略顺序号段是 6 位意味着同一区划同一类别下最多 999999 条。对于大多数乡镇级单位够用但如果你在做全国自然村级别的数据个别大县可能会逼近上限。我一般会预留分段前 3 位按空间网格分配后 3 位按录入顺序这样既保证唯一性又方便后续按区域查询。具体做法是先把该区划该类别下的所有地名按经纬度排序每 1000 条一个网格网格号占前 3 位网格内顺序占后 3 位。这样即使后续新增地名也只需要在对应网格内追加不会打乱已有代码。3. 落库实操从 PDF 规则到数据库表结构的映射3.1 表结构设计把代码段拆成独立字段还是存一列这是一个经典取舍。存一列的好处是查询简单WHERE code LIKE 110101%就能查下级坏处是每次解析都要写字符串函数而且没法对单独段位建索引。拆成多列的好处是索引灵活坏处是拼接逻辑散落在应用层。我的建议是主表存完整代码一列同时冗余存储行政区划段和类别段两列并对这两列建索引。顺序号和校验位不单独存需要时从完整代码里截取。这样兼顾查询性能和存储简洁。-- 地名主表结构兼顾完整代码与常用段位索引 CREATE TABLE place_name ( id BIGINT PRIMARY KEY AUTO_INCREMENT, full_code CHAR(16) NOT NULL COMMENT 完整地名代码, admin_code CHAR(6) NOT NULL COMMENT 行政区划段冗余存储, category_code CHAR(3) NOT NULL COMMENT 地名类别段冗余存储, place_name VARCHAR(200) NOT NULL COMMENT 标准地名, status TINYINT DEFAULT 1 COMMENT 1 有效 0 已废止, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, UNIQUE KEY uk_full_code (full_code), KEY idx_admin_code (admin_code), KEY idx_category_code (category_code) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;逻辑说明full_code加唯一索引防止重复录入。admin_code和category_code冗余存储是为了避免每次查询都写SUBSTRING在数据量上百万后这个差异很明显。status字段用于处理行政区划调整后的旧代码废止场景不要直接删除历史数据。参数说明CHAR(16)比VARCHAR(16)更适合定长代码InnoDB 下 CHAR 的检索效率略优。字符集用utf8mb4是因为地名里可能有生僻字。如果你的规则版本代码长度不是 16 位按实际调整。3.2 批量导入时的校验流水线从 Excel 或 CSV 往数据库灌数据时最怕的是脏数据混进去。我一般会写一个三阶段的校验流水线格式校验、逻辑校验、冲突校验。格式校验检查长度、字符集、校验位。逻辑校验检查行政区划段是否在有效区划表中存在、类别码是否在规则附录中定义。冲突校验检查完整代码是否已存在、同一地名是否已有有效代码。# 批量导入前的校验流水线 import csv from collections import defaultdict def validate_batch(csv_path: str, valid_admin_codes: set, valid_category_codes: set): errors [] seen_codes set() name_to_codes defaultdict(list) with open(csv_path, r, encodingutf-8) as f: reader csv.DictReader(f) for line_no, row in enumerate(reader, start2): code row.get(full_code, ).strip() name row.get(place_name, ).strip() # 格式校验 if len(code) ! 16: errors.append((line_no, 长度错误, code)) continue # 逻辑校验区划段和类别段是否合法 admin code[0:6] category code[6:9] if admin not in valid_admin_codes: errors.append((line_no, 区划段无效, admin)) if category not in valid_category_codes: errors.append((line_no, 类别段无效, category)) # 冲突校验代码重复 if code in seen_codes: errors.append((line_no, 代码重复, code)) seen_codes.add(code) # 记录地名与代码的映射用于后续同名检测 name_to_codes[name].append(code) # 同名不同码的情况单独输出供人工确认 for name, codes in name_to_codes.items(): if len(codes) 1: errors.append((0, f同名多地{name}, ,.join(codes))) return errors逻辑说明valid_admin_codes和valid_category_codes需要你从规则附录和最新的区划表中提前加载。同名多地不一定是错误但必须人工确认因为跨省同名乡镇是正常现象只是代码不同。line_no从 2 开始是因为 CSV 第一行是表头。参数说明csv_path是输入文件路径要求 UTF-8 编码。valid_admin_codes建议用set而不是list因为查找复杂度是 O(1) 对 O(n)。如果你的数据量超过 10 万行考虑分批处理避免内存溢出。3.3 行政区划调整后的代码维护区划调整是地名代码维护里最头疼的事。某县撤县设区代码变了下面所有乡镇村的代码前缀都要跟着变。但历史数据不能直接改否则和旧系统对接时会出问题。常见做法是旧代码标记为废止新代码重新生成并在表里加一个replaced_by字段指向新代码。查询时默认只查有效代码需要历史追溯时再关联查废止记录。-- 增加代码替换关系字段 ALTER TABLE place_name ADD COLUMN replaced_by CHAR(16) DEFAULT NULL COMMENT 被替换为的新代码; -- 区划调整时批量废止旧代码并建立替换关系 UPDATE place_name SET status 0, replaced_by CONCAT(新区划段, SUBSTRING(full_code, 7)) WHERE admin_code 旧区划段 AND status 1;逻辑说明CONCAT里的SUBSTRING(full_code, 7)保留原代码的第 7 位之后的内容只替换前 6 位区划段。这样类别段和顺序号不变最大限度保持稳定性。replaced_by字段让你可以顺着链条找到最新代码。参数说明SUBSTRING的起始位置是 7因为前 6 位是区划段。如果你的代码结构不同按实际调整。批量更新前先在测试库跑一遍确认影响行数符合预期。4. 避坑指南地名代码编制中最容易翻车的五个场景4.1 前导零丢失导致代码错位现象从 Excel 导入数据后部分代码长度变成 15 位或更短校验全部失败。原因Excel 默认把纯数字字符串当数值处理前导零被吃掉。比如001101变成1101。解决导入前把代码列格式设为文本或者在 CSV 里用引号包裹。代码里做长度校验时发现长度不足先尝试左补零补零后仍不匹配再报错。4.2 校验位算法版本不一致现象同一批数据用 A 系统生成的代码在 B 系统校验不通过。原因不同时期或不同地区的规则版本可能用了不同的加权算法或模数。有的用模 11有的用模 10权重起始值也可能不同。解决以你手头 PDF 的附录为准不要凭记忆写算法。如果对接外部系统先拿几条已知正确的代码做交叉验证确认双方算法一致后再批量处理。4.3 同名地名被误判为重复现象批量导入时系统提示大量同名地名冲突但人工核对发现它们确实是不同地方。原因校验逻辑只按地名文本去重没有结合行政区划段。跨省同名乡镇、同县同名自然村都是正常现象。解决唯一性约束应该建在完整代码上而不是地名文本上。地名文本的重复只做提示不做拦截。如果需要按地名查询用admin_code place_name联合索引。4.4 顺序号分配冲突现象两个录入员同时给同一区划同一类别新增地名生成的顺序号相同入库时唯一索引冲突。原因顺序号是应用层生成的没有做并发控制。两人同时查当前最大顺序号拿到同一个值。解决顺序号生成放在数据库层用SELECT MAX(seq_code) FOR UPDATE加行锁或者用独立的序列表加乐观锁。更简单的做法是让数据库自增列生成顺序号应用层只负责拼接。4.5 区划调整后历史数据查询断裂现象某县改区后按旧代码查不到任何数据按新代码查又只有调整后的数据。原因旧代码被直接更新成了新代码历史记录丢失了旧代码的关联。解决永远不要直接更新代码字段。用status标记废止用replaced_by建立替换链。查询时如果需要包含历史用递归 CTE 顺着替换链往下找。-- 递归查询某代码及其所有历史替换代码 WITH RECURSIVE code_chain AS ( SELECT full_code, replaced_by FROM place_name WHERE full_code 目标代码 UNION ALL SELECT p.full_code, p.replaced_by FROM place_name p INNER JOIN code_chain c ON p.full_code c.replaced_by ) SELECT * FROM code_chain;逻辑说明递归 CTE 从目标代码出发沿着replaced_by链一直往下找直到没有替换记录为止。这样即使经过多次区划调整也能追溯到所有相关代码。参数说明目标代码替换成你要查的起始代码。递归深度默认有限制如果替换链很长可能需要调整cte_max_recursion_depth参数。5. 进阶技巧用校验位反推录入错误与代码质量监控校验位不只是用来验证代码对不对它还能帮你定位录入错误的具体位置。加权模 11 算法有一个特性如果只错了一位校验位的变化是有规律的。你可以通过对比期望校验位和实际校验位反推出哪一位可能错了。具体做法是对一条校验失败的代码逐位尝试替换成 0-9看替换后校验位是否匹配。如果只有某一位替换后能匹配那这一位大概率就是录入错误的位置。这个方法我在处理批量导入的脏数据时用过能把人工核对的工作量减少一大半。# 用校验位反推可能的错误位置 def locate_error(code: str) - list: if len(code) ! 16: return [] weights [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16] candidates [] # 逐位尝试替换 for pos in range(15): # 只替换前 15 位校验位不参与 original_char code[pos] for digit in 0123456789: if digit original_char: continue # 构造替换后的代码 test_code code[:pos] digit code[pos1:] # 重新计算校验位 total sum(int(test_code[i]) * weights[i] for i in range(15)) expected total % 11 expected_char X if expected 10 else str(expected) if expected_char code[15]: candidates.append((pos, original_char, digit)) return candidates逻辑说明外层循环遍历前 15 位的每一位内层循环尝试 0-9 的每个数字。如果替换后校验位能匹配说明这个位置和这个替换值是一个可能的修正方案。返回的candidates列表里如果只有一个元素那基本可以确定错误位置如果有多个需要结合业务规则进一步判断。参数说明code是校验失败的 16 位代码。返回的pos是位置索引从 0 开始。original_char是原字符digit是建议替换的字符。注意这个方法只适用于单字符错误如果多位同时出错候选会很多需要人工介入。除了纠错校验位还可以用来做数据质量监控。我一般会定期跑一个统计全库校验通过率、各区划的代码重复率、顺序号使用率。如果某个区划的顺序号使用率超过 80%就要预警了说明快接近上限需要提前规划扩容或调整分段策略。最后一个习惯每次从 PDF 规则里读到新的段位定义或算法细节不要只记在脑子里立刻写一个单元测试固化下来。规则文档可能会更新但你的测试用例是活的下次换版本时跑一遍测试就知道哪些地方需要调整。这个习惯帮我省过很多次后悔药。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

信创适配实战:国产数据库与Web容器迁移避坑指南

信创适配实战:国产数据库与Web容器迁移避坑指南

简介:这份PPT资料面向正在推进应用系统国产化改造的架构师、开发与运维人员,聚焦信创环境下的适配落地难题。内容围绕国产数据库与国产Web应用容器两条主线展开:数据库侧覆盖达梦、瀚高、神通、人大金仓等产品的选型对比与迁移映射&#xff0…

2026/10/10 16:33:46 阅读更多 →
SonarQube 7.9部署升级避坑指南:从JDK环境到插件兼容

SonarQube 7.9部署升级避坑指南:从JDK环境到插件兼容

简介:SonarQube 7.9是一款开源代码质量管理平台,面向开发、测试与运维人员,在持续集成流程中检测代码漏洞、坏味道及规范偏差,帮助企业尽早控制技术债。压缩包为zip格式,大小约196.67MB,内部结构清晰&#…

2026/10/10 20:36:35 阅读更多 →
Nexus 3.30 Windows免安装包部署指南:从解压到Maven私服搭建与避坑

Nexus 3.30 Windows免安装包部署指南:从解压到Maven私服搭建与避坑

简介:Nexus 3.30.0-01 是 Sonatype 官方推出的 Maven 仓库管理器 Windows 64 位安装包,面向 Java 开发者、DevOps 工程师及需要搭建企业级私有仓库的团队,用于代理中央仓库、聚合多类型存储库并统一管理组件发布。压缩包为 zip 格式&#xff…

2026/10/9 15:11:46 阅读更多 →

最新新闻

基于SSM+Flask的学籍管理系统设计与实战全解析

基于SSM+Flask的学籍管理系统设计与实战全解析

学了几年计算机,估计有七成同学都躲不过“学生信息管理系统”这道坎。你要是去问学长学姐,十个人里八个会告诉你当初熬夜改了多少Bug。不过说句公道话,这个题目是真练人,麻雀虽小五脏俱全,从数据库设计到前后端联调&am…

2026/10/10 20:36:21 阅读更多 →
从 Codex 搬家 WorkBuddy 一周:插件生态到底差在哪?

从 Codex 搬家 WorkBuddy 一周:插件生态到底差在哪?

从 Codex 搬家 WorkBuddy 一周:插件生态到底差在哪? 【免费下载链接】plugins OpenAI Plugins 项目地址: https://gitcode.com/GitHub_Trending/plugins123/plugins 把 Codex 当主力 Agent 用了大半年之后,我在 9 月中旬做了一个有点&…

2026/10/10 20:36:21 阅读更多 →
软考论文总挂科?先搭框架再填内容,系统架构师高分方法论

软考论文总挂科?先搭框架再填内容,系统架构师高分方法论

说实话,软考高级的论文这一科目,卡掉的考生远比上午题和案例题多。很多人上午题能拿五十多分,案例题也勉强过关,偏偏就挂在论文上——不是没项目经验,也不是完全不会写,而是根本没搞明白论文这科到底在考什…

2026/10/10 20:36:21 阅读更多 →
Unity 2021第三人称漫游:场景搭建、控制器与避坑指南

Unity 2021第三人称漫游:场景搭建、控制器与避坑指南

简介:这份资源是面向Unity初学者与在校学生的期末大作业级项目,基于Unity2021版本构建第三人称漫游场景,帮助读者掌握角色控制、场景搭建与UI交互等核心开发流程。包内共约2000个文件,以cs脚本、png贴图、fbx模型、prefab预制体、…

2026/10/10 20:36:21 阅读更多 →
Flash 对 Mimo、GLM:中文代码 Agent 场景的“性价比之王“实测横评

Flash 对 Mimo、GLM:中文代码 Agent 场景的“性价比之王“实测横评

Flash 对 Mimo、GLM:中文代码 Agent 场景的"性价比之王"实测横评 【免费下载链接】DeepSeek-V4-Flash-0731 项目地址: https://ai.gitcode.com/hf_mirrors/deepseek-ai/DeepSeek-V4-Flash-0731 2026 年 7 月 31 日,DeepSeek-V4-Flash …

2026/10/10 20:36:20 阅读更多 →
selective_search原理与参数调优:目标检测候选框生成实战

selective_search原理与参数调优:目标检测候选框生成实战

简介:选择性搜索(Selective Search)是目标检测中常用的候选区域生成算法,这套Python入门示例面向计算机视觉初学者、图像处理学习者以及准备接触RCNN系列检测模型的开发者。示例以超像素分割、区域合并、候选区域排序为技术主线&a…

2026/10/10 20:35:20 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

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

2026/10/10 11:14:25 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

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

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

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

2026/10/10 11:14: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/10 5:23:50 阅读更多 →
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/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练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/10 10:38:42 阅读更多 →