SpringBoot全国降水数据分析与可视化系统实战:从数据清洗到ECharts联动

发布时间:2026/10/20 19:47:27

SpringBoot全国降水数据分析与可视化系统实战:从数据清洗到ECharts联动 上个月有个同学拿了个毕业设计题目来问题目大概是基于SpringBoot的全国降水数据分析与展示可视化系统。他当时第一反应是这不就是一个地图页面后端查数据返回前端把点和颜色画出来就行了吗等我让他把需求拆开——分析这两个字往细了说他才意识到从数据清洗、指标计算到前端联动展示工作量比他预想的大了一个量级。这篇内容就是围绕这个题目展开的我把它当作一个完整的毕设技术复盘来写。核心涉及SpringBoot后端架构、全国降水数据的获取与清洗、分析指标的后端聚合实现、ECharts地图与联动图表的实现以及部署和说明文档很多题目描述里会写LW指的就是论文和配套文字材料的经验。适合正在做同类数据分析可视化方向毕业设计的人参考也适合想从零搭一套前后端分离数据展示项目的读者。1. 拿到这个毕设题目后真正要解决的三个问题1.1 降水数据分析和展示分别指什么先说一个很多人理解偏差的地方。全国降水数据分析与展示不是一个查出来再画图的事它拆开来看至少包含三个层次时间维度全国每年的平均降水量是多少某省近十年的降水量是上升还是下降哪个月是降水高峰这些要落到按年份分组求平均值按月分组求累计值这类聚合逻辑上。空间维度不同省份之间降水量差异有多大年内降水集中在哪几个区域能不能按省级行政区做排名和地图着色指标维度除了平均值还要不要算极值、方差、降水集中度会不会涉及某日降水量超过阈值的极端降水统计展示也不只是画图。展示包含地图下钻、时间轴筛选、图表类型切换、前后端数据联动。做得好一点用户选一个年份全国地图颜色变化、排名榜刷新、右侧趋势图重绘这是一套完整的交互逻辑。1.2 设计和实现这两个词对应答辩老师考察的能力毕业设计题目里最容易被低估的是设计与实现这五个字。它不是一个页面的事它对应的是需求分析题目里每一个功能点对应什么用户场景架构设计前后端方案、数据库表结构、数据流向数据库设计表字段、索引、数据规模核心代码实现聚合统计、接口设计、图表数据组织系统测试与部署数据库初始化、项目打包、演示环境。很多同学把时间全花在写前端页面结果到了写论文的时候发现没有东西可写。实际上毕设的评分重点不只是跑得起来更重要的是你的设计思路清不清楚、工作量是否饱满、是否体现了完整的软件工程流程。1.3 这篇博文怎么帮你把这套东西做出来我按做这个项目的完整流程来讲先是技术选型和数据建模然后是数据获取与清洗这块是最耗时的再到后端接口和聚合统计的实现然后是可视化联调最后是部署和文档。每一段我都会结合自己做类似项目时遇到的问题比如数据缺失怎么处理、地图下钻用什么格式、跨域和时区在哪里翻车等。特别提醒一句本文说的不是某个现成源码的运行教程而是把如果你要从头把这个系统实现出来每一步应该怎么设计和落地讲清楚。你拿着这套思路去对比任何一套类似源码都能一眼看出它好在哪里、缺在哪里。2. 技术选型与数据建模为什么SpringBoot是这个题目的最优解2.1 SpringBoot到底解决了毕设开发里的什么痛点先说结论这个题目用SpringBoot作为后端框架是很合理的选择但不是因为它能做数据分析而是因为它能让你把时间花在业务逻辑而非环境配置上。很多学校的Java课程还在讲SSH或SSMXML配置写一大堆。SpringBoot最核心的价值是自动配置和起步依赖。举个例子你要整合Spring MVC和MyBatis传统SSM要写web.xml、spring-mvc.xml、mybatis-config.xml还要处理各类Bean扫描配置。SpringBoot里只要引入依赖然后在application.yml写数据源信息就行。内嵌Tomcat也让部署变简单IDEA里直接跑main方法就能启动。但你要知道SpringBoot本身不做数据分析它更多是承担接口服务的角色。层次技术选型作用后端框架SpringBoot管理请求、业务逻辑、连接数据库ORM层MyBatis / MyBatis-Plus写SQL和聚合查询数据库MySQL存储降水数据前端展示Vue / HTML ECharts图表与地图渲染数据处理Java / Python脚本数据清洗、入库选这套组合的优势在于每个环节都有大量现成资料遇到问题能在搜索引擎上快速找到方案。对毕设来说不容易卡住就是最大的效率优势。2.2 全国降水数据模型怎么设计才不会返工数据建模是最容易返工的地方我见过有人把表设计成全字段大宽表结果后面写聚合SQL时发现索引没法建查询慢到离谱。这个项目的核心表一般就是一张降水记录表字段可以这样设计字段名类型说明idbigint主键provincevarchar(32)省级行政区名称例如某省cityvarchar(32)市级名称可选根据粒度station_codevarchar(16)站点编码可选record_datedate降水记录日期precipitationdecimal(6,1)日降水量单位mmtemperaturedecimal(4,1)日均气温单位摄氏度可选data_sourcevarchar(64)数据来源create_timedatetime入库时间为什么推荐把province和city直接作为字段存进去而不是单独建一个区域维表再做关联因为毕设系统的数据量级别通常不会大到需要三范式来节省存储数据模型第一要务是好理解、好查询。你写聚合SQL的时候按province和record_date直接GROUP BY比join维表方便得多。这属于实际项目里常见的反范式设计也是答辩时可以讲的一个点。需要说明的是不要一上来就设计一张包含所有可能字段的宽表比如经纬度、海拔、风速、湿度等一股脑都加上。字段越多清洗压力越大后面写文档越难讲清楚。先把核心的降水记录做好其他字段作为可扩展项在论文里提一句就够了。2.3 数据库选型和索引设计数据库用MySQL InnoDB引擎就够了重点是把索引设计对。降水查询最典型的是按时间和区域过滤所以联合索引就这样建ALTER TABLE precipitation_data ADD INDEX idx_province_date (province, record_date);这个索引支撑某省某年降水量、某年各省降水量排名这类高频查询。查询条件里涉及日期的范围过滤会走索引的前缀匹配效率高很多。如果数据量达到几百万行以上还可以考虑按年份做分区表或分表但这对毕设来说一般不是必须的。在论文里把为什么设计这个索引写清楚比真的去优化千万级数据更有价值。数据来源如果是公开气象数据集导入脚本建议做分批插入避免一次性插入几十万条SQL把连接卡死。3. 数据获取与清洗不把数据搞定后面全是白搭3.1 降水数据从哪来真实数据与模拟数据的取舍做这个项目的同学最先问的问题就是数据在哪下载常规做法有两个方向你可以根据自己的情况取舍。第一使用公开的历史气象观测数据。这类数据通常是以站点为单位的日值数据集涵盖全国多个气象站点的降水量、气温等要素。拿到后需要做坐标到省市的匹配再把站点数据按省汇总。优点是真实、有说服力缺点是数据文件格式杂乱年份跨度大清洗工作量大。第二生成模拟数据。如果你拿不到完整的数据集或者时间来不及清洗可以用脚本按某省某市某日降水量的方式生成模拟数据。关键是让模拟数据符合真实的降水分布特征整体而言南方较多、北方较少夏季降水多、冬季降水少某些区域日降水会远大于均值。用正态分布加季节性偏移来生成展示效果是合理的。我在实际带项目时会让学生优先尝试真实数据因为真实数据自带缺失值、异常值处理流程能写进论文。如果数据实在拿不全再退一步用模拟数据但要在论文里明确说明数据来源属于演示数据。3.2 缺失值、异常值和重复数据的处理策略降水数据最常见的问题是缺失——某一天、某个站点没有观测值。处理方式有三种直接删除缺失比例小的时候可以删标记为NULL在统计时排除展示时注明数据缺失插值填充用前后天数值取平均填入适合连续缺失不超过两三天的场景。异常值更值得注意。比如降水量的负值这明显是数据异常应直接清洗掉比如某站某日降水量是几百毫米单个站点确实可能出现特大暴雨但在没有官方确认的情况下建议设置一个合理的阈值范围超过则标记为异常再人工确认。清洗脚本用Java或Python写都行我习惯用Python处理原始文件处理完导出CSV再写一个Java的批量导入逻辑入库。整个流程在论文里是很好的一个章节数据预处理这一点特别加分因为很多毕设根本不写数据清洗。3.3 数据入库与测试环境的数据规模设计数据入库建议走脚本而不是手写SQL插入。脚本有两种写法一种是用SpringBoot写一个DataImportRunner在项目启动时读取CSV并逐批插入数据库Component public class DataImportRunner implements CommandLineRunner { Autowired private PrecipitationMapper mapper; Override public void run(String... args) { // 读取csv并调用 mapper.batchInsert(list) } }另一种是直接用Python脚本连接MySQL执行批量插入# pip install pymysql import pymysql conn pymysql.connect(hostlocalhost, userroot, password123456, databaserain_db) cursor conn.cursor() sql insert into precipitation_data(province, city, record_date, precipitation) values(%s, %s, %s, %s) data [] for row in csv_reader: # 模板需要补充每行读取 as province, city, date, precipitation data.append((province, city, date, precipitation)) cursor.executemany(sql, data) conn.commit()关于数据规模建议至少覆盖近十年以上、全国各省的日值或月值数据。这样时间轴筛选有得选地图排名也有明显差异。数据太少的话图表一拉出来就露馅了答辩时被问你这个趋势分析能说明什么会很难回答。4. 核心分析接口的设计思路聚合统计放SQL还是放代码4.1 时间维度的统计分析后端接口是整套系统的核心。分析接口的通用设计模式是前端传过来年份、省份、指标类型后端根据参数生成聚合SQL查询后返回结构化JSON。先说时间维度的分析。比如某年各省年平均降水量// 接口/api/analysis/yearly // 参数year // 返回ListMapString, Object对应的SQL是SELECT province, ROUND(AVG(precipitation), 2) AS avg_precip FROM precipitation_data WHERE YEAR(record_date) #{year} GROUP BY province ORDER BY avg_precip DESC;注意一点如果数据粒度是日值YEAR(record_date)这个写法在数据量小的时候OK但在数据量大时会导致索引失效。可以在查询前先用日期范围缩小数据或者直接在表里冗余字段存储年份再对year字段建索引。毕设规模下用YEAR()函数没有问题但你能在论文里写一句考虑到索引优化可增加年份冗余字段会显得思考得比较细。季度分析则是把月份映射到季节3-5月为春、6-8月为夏、9-11月为秋、12-2月为冬。SQL可以写成SELECT province, CASE WHEN MONTH(record_date) BETWEEN 3 AND 5 THEN 春 WHEN MONTH(record_date) BETWEEN 6 AND 8 THEN 夏 WHEN MONTH(record_date) BETWEEN 9 AND 11 THEN 秋 ELSE 冬 END AS season, ROUND(AVG(precipitation), 2) AS avg_precip FROM precipitation_data WHERE YEAR(record_date) #{year} GROUP BY province, season;4.2 空间维度的区域对比空间维度的核心接口是各省降水排名和各省降水对比。排名接口SELECT province, SUM(precipitation) AS total_precip FROM precipitation_data WHERE YEAR(record_date) #{year} GROUP BY province ORDER BY total_precip DESC;如果你希望展示的是年降水量总量用SUM如果展示平均降水量用AVG。两者含义不同前端图表的标题也要写清楚。区域对比则可以把全国分为若干区域来做汇总比如按地理方位划分几大片分组求平均值后返回。这个指标适合在论文里写区域降水差异分析答辩时很好讲因为你能从数据结果明显看出差异。4.3 极端降水与趋势指标怎么实现如果只做平均和总和项目深度是不够的。我建议在系统里加两个更有思考的指标极端降水事件统计和降水趋势变化。极端降水事件可以定义日降水量大于等于50毫米视为暴雨日统计各省指定年份的暴雨日数量。SELECT province, COUNT(*) AS heavy_rain_days FROM precipitation_data WHERE YEAR(record_date) #{year} AND precipitation 50 GROUP BY province ORDER BY heavy_rain_days DESC;趋势变化可以用逐年全国平均降水量来体现接口返回连续多年的平均值前端画成折线图再叠加一个移动平均曲线。移动平均在代码里算就行// 计算三年滑动平均 for (int i 1; i values.length - 1; i) { avg[i] (values[i-1] values[i] values[i1]) / 3.0; }这种指标的价值在于它不是直接从数据库查出来的流水账而是经过业务处理和计算的分析结果。答辩时老师问你分析出了什么你能用趋势图的走向、暴雨日的省份分布给出有数据支撑的回答这比我做了个展示页面强很多。5. 可视化展示层的实现从地图到多维联动5.1 全国地图怎么做ECharts地图注册与数据格式可视化部分是同学最喜欢先动手的部分这里最容易踩的坑反而是第一行数据。ECharts做全国地图需要GeoJSON格式的地图数据。近几年的ECharts版本里地图数据需要通过registerMap注册import * as echarts from echarts; import chinaJson from ./china.json; echarts.registerMap(china, chinaJson); let chart echarts.init(document.getElementById(map)); chart.setOption({ series: [{ type: map, map: china, roam: true, label: { show: true }, data: [ { name: 某省, value: 1200 }, { name: 某省, value: 800 } ] }] });地图数据的name值必须与GeoJSON里每个省级区域的name属性完全一致否则会渲染不出来。实际开发中常见的问题是地图上某个省份空白十有八九是数据里的省名和地图文件里的省名不匹配比如内蒙古和内蒙古自治区的写法差异。如果要做市级下钻你需要的是市级GeoJSON。数据规模会从几十条变成几百条而且后端要按市级维度聚合。对毕设来说做到省级粒度已经足够完整下钻可以作为扩展功能写进论文系统扩展性部分不必真的实现。5.2 时间轴筛选与联动方案不少同学的第一版联调是前端选年份发起一次Ajax请求重新加载图表数据。这个逻辑没有错但性能差。特别是全国地图和多个图表同时要数据时一次年份切换就会触发四五次请求。更好的做法是页面初始化时一次性拉取全部年份的聚合数据前端根据选中年份在内存中取数并重绘图表。举个例子初始化请求/api/analysis/allYearly返回结构{ years: [2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024], yearlyAvg: { 2015: 640.2, 2016: 658.1 }, provinceByYear: { 2015: [{province: 某省, value: 1500}, ...] } }前端切换年份时只需要从provinceByYear里取对应年份的数据调用chart.setOption更新。这样本地操作几乎零延迟演示流程丝滑也不会被网络请求拖累。这套设计在文档里是很好的一个点因为它体现了前端性能优化意识虽然是简单优化但面试或答辩时一提减少接口调用次数老师基本都能给正向反馈。5.3 前端布局和图表组织推荐一个经典布局页面顶部放时间轴和指标切换器中间主体是全国地图左侧是降水排名TOP10柱状图下方是历年趋势折线图。整个页面一个纵向信息流填完整个屏幕演示起来很完整。ECharts组件之间的联动除了数据联动还可以做点击省份联动。比如用户点击地图中的某省右侧折线图切换为该省历年降水量变化。这个交互用ECharts的click事件实现chart.on(click, function (params) { let provinceName params.name; // 根据省份更新右侧图表数据 updateLineChart(provinceName); });这个功能不会增加太多工作量但对系统的交互完成度提升非常明显。答辩演示时老师点一下地图图表跟着变视觉效果和工程感都比静态页面好太多。6. 前后端联调与部署毕设答辩前最容易翻车的地方6.1 跨域、中文乱码和时区必踩三连跨域问题只在前后端分离部署时出现。SpringBoot后端处理方式很简单写一个配置类Configuration public class CorsConfig { Bean public CorsFilter corsFilter() { CorsConfiguration config new CorsConfiguration(); config.addAllowedOrigin(*); config.addAllowedMethod(*); config.addAllowedHeader(*); UrlBasedCorsConfigurationSource source new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration(/**, config); return new CorsFilter(source); } }中文乱码一般出现在两个地方。一是数据库连接URL没有指定UTF-8spring: datasource: url: jdbc:mysql://localhost:3306/rain_db?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai二是返回JSON时中文乱码SpringBoot 2.x以上一般默认是UTF-8但如果发现乱码检查一下是否手动改过HttpMessageConverter或者前端页面meta标签有没有声明charsetutf-8。时区问题典型表现是前端传一个2024-01-01后端用Date接收后却变成2023-12-31。所以数据库连接参数里serverTimezoneAsia/Shanghai一定要写Java时间类型建议直接用LocalDate而不是Date避免时区带来的偏移。6.2 Maven打包、部署与演示环境后端部署一个就够了本地演示场景下直接在IDEA里启动。如果你需要在服务器上跑用Maven打jar包mvn clean package -DskipTests java -jar target/rain-analysis.jar前端如果是静态页面可以放在dist目录里用Nginx做静态代理再把API请求反向代理到后端服务。配置模板server { listen 80; location / { root /home/project/dist; index index.html; } location /api/ { proxy_pass http://127.0.0.1:8080; } }演示前一定准备一套兜底方案。我见过不止一次现场演示时数据库连不上或者图表数据加载失败。建议演示前重启一次服务确认数据库脚本可以重复执行页面刷新不会只出现白屏。把数据库初始化脚本、启动步骤说明一起放进说明文档里这是调试定制和说明文档这两个描述落到实处的核心体现。6.3 数据库脚本和说明文档的完整清单一份合格的说明文档LW配套材料通常要包含这几部分项目概述和功能说明开发环境清单JDK版本、Maven版本、MySQL版本、Node版本数据库初始化建库SQL脚本、初始数据文件、导入步骤后端启动步骤修改application.yml数据源配置运行main方法前端启动步骤npm install / npm run dev或静态页面直接打开系统演示流程核心功能对应哪些页面路径常见问题端口被占用、数据库驱动版本冲突、跨域配置。这一步看起来简单但很多项目失败在别人拿到项目后跑不起来。文档的意义就是让你的毕设成果真正可复现。7. 论文与答辩环节的个人经验7.1 每个章节怎么写得又快又扎实论文写作顺序建议和开发顺序一致不要先写摘要。具体顺序先画架构图再写需求分析然后写数据库设计再写核心代码实现最后补测试。需求分析要做的第一步是用例分析。把系统功能拆成序列普通用户浏览全国降水地图、选择年份查看降水分布、点击省份查看趋势、系统管理员维护数据。一条用例对应一个功能模块论文结构自然就出来了。数据库设计章节要放ER图然后逐表说明字段含义。核心表就是降水记录表加上用户表如果有登录功能、统计结果缓存表如果有。每张表写清楚主键、索引、字段注释。核心代码实现不要贴大段源码。最佳方式是一段核心代码加一段解释。比如你贴聚合统计的Mapper接口配上这里使用GROUP BY和聚合函数将日值数据压缩为按省、按年统计结果就够了。论文不是代码仓库它考察的是你的理解和表述。7.2 答辩时怎么把这些工作量讲满答辩时间通常五分钟讲PPT十分钟提问。我建议按这条主线讲选题背景 → 技术选型 → 数据获取与清洗 → 系统设计 → 核心功能演示 → 总结与展望。老师大概率追问的点集中在这几类为什么选SpringBoot因为它的自动配置和起步依赖降低了开发难度生态完善适合快速搭建数据展示类系统。数据处理过程遇到了什么问题回答真实数据的缺失值、异常值处理以及批量入库时的性能问题这是你工作量最直观的体现。聚合统计的SQL原理是什么讲GROUP BY的执行思路以及索引如何优化查询。系统有哪些可扩展的地方市级地图下钻、实时数据接入、预测算法只要你想到就说明你思考过系统的边界。回答问题的核心原则是讲过程、讲取舍。开发中踩过坑、改过方案、做过对比都比我直接用了某框架有说服力。我个人的体会是这类题目真正拉开差距的不是谁地图画得好看而是谁把数据到信息再到结论的链条讲完整了。降水原始数据只是数字清洗和聚合后是统计指标放到地图和图表里才变成能被理解的信息。你的论文和答辩讲清楚的就是这条链。后面如果时间充裕可以往两个方向扩展一是接更细粒度的市级数据做下钻二是把移动平均换成更复杂的趋势拟合算法。但先把现有的省级版本做到稳定、美观、文档完整这个题目的核心分就拿到了。
延伸阅读

更多相关文章

2026/10/20 19:47:27

context-mode 工程实践:隔离、传递与清理的上下文设计

1. 从"context-mode"说起:一个被低估的工程概念第一次看到"context-mode"这个词,很多人会下意识地把它归类成某个框架里的配置项,或者某个库的开关参数。但如果你在一线写过几年代码、调过几个中大型项目,就会…

2026/10/20 19:47:27

Git泄露实战:从git log与git stash还原源码到CTF解题

1. 从一个被忽略的目录说起:Git泄露到底在泄露什么很多人第一次接触Git泄露,是在CTF比赛或者授权渗透测试的靶场里。题目往往只给一个URL,打开一看是个普普通通的网站首页,源码里没有注释、没有隐藏链接、没有备份文件。这时候有经…

2026/10/20 23:30:27

国产AI智能体破局:从模型能力到工程化落地的关键路径

1. 从一场行业大会的展台动线说起如果你最近去过任何一场稍微有点规模的科技行业展会,大概率会有一种强烈的割裂感。一边是铺天盖地的“智能体”概念演示,大屏幕上循环播放着数字人流畅对话、自动订票、自动写周报的炫酷视频;另一边&#xff…

2026/10/20 23:30:27

PyTorch Tensor四大底层构件:Storage、Data Pointer、Size/Stride与Autograd Meta

1. 这不是“张量”概念课,而是打开PyTorch内存世界的钥匙很多人学PyTorch,卡在tensor.shape、tensor.dtype、tensor.device这几个属性上就停住了——以为记住了API就是掌握了Tensor。但真正让你在调试时一头雾水、在模型训练中莫名其妙OOM、在跨设备迁移…

2026/10/20 23:30:27

AI Agent生成PPT全链路解析:从意图识别到多轮迭代

AI Agent生成PPT,表面上是一个办公功能,背后其实是一整套把意图转成产物的工程链路。很多产品都在做“一键生成”,但真正拉开体验差距的,是系统有没有理解用户没说出口的意图,以及有没有用Agent模式把任务拆解、执行、…

2026/10/20 23:30:27

XILINX FPGA DDR3读写测试工程:MIG IP核仿真与上板验证

简介:这份资源面向FPGA与嵌入式系统开发者,聚焦XILINX平台上DDR3内存条的读写测试与仿真验证,适合已具备Verilog基础、希望掌握高速存储接口设计的中高级学习者。内容围绕DDR3协议特性、MIG IP核配置、用户逻辑与内存控制器连接,以…

2026/10/20 23:30:27

tilelang昇腾组件实战:算子调优与矩阵乘kernel开发

1. 从一次算子调优的困境说起去年年底,我在做一个矩阵乘加融合算子的性能优化,目标平台是昇腾NPU。当时遇到一个很典型的问题:用常规的Triton风格写法描述计算逻辑,编译出来的kernel在特定shape下性能波动极大,有些cas…

2026/10/20 23:25:25

本体驱动开发:为AI原生应用构建领域语义骨架的实践指南

现在很多做AI应用开发的朋友都陷入了一个同样的困境:功能demo跑得飞快,可一旦业务复杂度上来,提示词堆到几千字,Agent乱跳,上下文管理全靠补丁,整个系统就像一栋没有图纸盖起来的高楼。我做过一段时间的垂直…

2026/10/19 18:06:35

金融AI落地指南:从调研报告到技术选型与工程实践

简介:这份PDF报告聚焦2025年金融服务业中国AI现状与趋势,面向金融科技从业者、AI战略规划人员及关注行业数字化转型的研究者,帮助读者把握生成式AI在银行、支付、交易等场景中的落地路径与投资方向。资源包内含1个PDF文件,大小约1…

2026/10/20 1:05:37

单片机C运行时从启动到多任务:中断安全与共享资源冲突

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

2026/10/20 1:05:37

GCC编译四步详解:预处理、编译、汇编、链接实战

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

2026/10/20 1:05:37

FIW线是什么?FEP注塑线与普通氟塑料线的区别及应用指南

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

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑