电子科技大学机器学习大作业全流程指南:从选题、数据处理到模型实现与报告撰写
简介这份资源是电子科技大学机器学习课程的大作业完整资料包面向正在修读机器学习相关课程的高校学生以及需要完成课程项目或期末大作业的学习者可帮助解决选题方向不明确、实验流程不完整、代码实现缺乏参考等问题。压缩包为7z格式整体约11.55MB由于上游未提供具体文件清单包内文件类型与数量暂无法逐一说明但结合课程大作业的常见构成通常包含实验报告、源码脚本与数据集等模块便于按需查阅与复现。目前已有1263人学习下载说明该资料在同类课程作业中具有一定参考价值。读者可借助其中的方案思路梳理建模流程对照代码理解算法实现细节并参考报告结构完成自己的作业撰写与结果分析适合作为课程实践阶段的辅助材料使用。1. 拆开「电子科技大学机器学习大作业.7z」一份课程设计压缩包里到底该有什么如果你手上正躺着一个名为「电子科技大学机器学习大作业.7z」的压缩包或者你正被布置了同样量级的课程设计先别急着解压。这类大作业真正的难点从来不是「跑通一个模型」而是从选题、数据处理、算法实现到实验报告的一整条链路任何一环塌了都会让最终提交变成灾难。机器学习课程设计选题通常分两类一类是经典算法的复现与对比比如线性回归、逻辑回归、决策树、SVM、KMeans另一类是带应用场景的综合任务比如图像分类、文本情感分析、房价预测。电子科技大学这类工科院校的机器学习大作业普遍要求「算法原理 代码实现 实验对比 报告撰写」四件套齐全压缩包里往往就是这四样东西的集合。这篇文章不假装见过某个具体压缩包的内容而是按一线最常见的做法把这类大作业从零到提交的完整路径拆开讲清楚数据怎么处理、模型怎么选、参数怎么调、报告怎么写、哪些坑一定会踩。适合正在赶 due 的本科生也适合想拿一份课程设计当入门项目练手的转行者。2. 从选题到数据机器学习大作业的第一道分水岭2.1 选题怎么定先看评分表再挑数据集很多人一上来就想做「深度学习 计算机视觉大作业」觉得高大上。但课程设计的评分逻辑和科研不一样老师看的是你对机器学习基本流程的掌握程度不是模型有多新。我一般建议先翻评分细则如果「算法原理阐述」占 30% 以上那就老老实实选传统机器学习算法比如线性回归、逻辑回归、决策树、随机森林、SVM。这些算法数学推导清晰、可解释性强、调参空间适中报告也好写。选题的第二个约束是数据集。机器学习入门阶段最怕的就是数据拿不到或者太脏。常见做法是优先选 sklearn 自带数据集iris、wine、breast_cancer、digits或 UCI 上的经典数据集波士顿房价已下架可用加州房价替代。如果要做图像方向MNIST、CIFAR-10、Fashion-MNIST 是安全牌。文本方向可以用 IMDB 影评、20 Newsgroups 或中文的 THUCNews 子集。提示选题时把「数据量」和「特征维度」两个数字写进开题报告数据量低于 500 条的基本做不出有说服力的对比实验。2.2 数据预处理机器学习中的数据处理到底是什么热搜里频繁出现「机器学习中的数据处理是什么」这个问题在大作业里体现得最直接。原始数据几乎不可能直接喂给模型标准流程是缺失值处理 → 异常值检测 → 特征编码 → 特征缩放 → 训练测试划分。下面这段代码是一个可复用的预处理模板覆盖了大多数课程设计场景。import pandas as pd import numpy as np from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler, LabelEncoder from sklearn.impute import SimpleImputer # 1. 读取数据 df pd.read_csv(dataset.csv) # 2. 缺失值处理数值列用中位数类别列用众数 num_cols df.select_dtypes(include[np.number]).columns cat_cols df.select_dtypes(include[object]).columns num_imputer SimpleImputer(strategymedian) df[num_cols] num_imputer.fit_transform(df[num_cols]) cat_imputer SimpleImputer(strategymost_frequent) df[cat_cols] cat_imputer.fit_transform(df[cat_cols]) # 3. 类别特征编码 le LabelEncoder() for col in cat_cols: df[col] le.fit_transform(df[col]) # 4. 特征与标签分离 X df.drop(target, axis1) y df[target] # 5. 划分训练集测试集stratify 保证类别比例一致 X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, random_state42, stratifyy ) # 6. 标准化注意 scaler 只能在训练集上 fit scaler StandardScaler() X_train scaler.fit_transform(X_train) X_test scaler.transform(X_test) print(f训练集: {X_train.shape}, 测试集: {X_test.shape})这段代码的关键点有三个。第一缺失值填充策略要分类型数值列用中位数比均值更抗异常值。第二LabelEncoder只适合有序类别或树模型如果是线性模型加无序类别特征应该用OneHotEncoder否则模型会误以为类别之间有大小关系。第三也是血泪经验最多的一条StandardScaler必须先在训练集上fit再transform测试集。如果对全量数据一起 fit测试集的信息就泄漏到了训练过程实验指标会虚高答辩时被问到就翻车。2.3 训练测试划分与交叉验证别让一次划分决定命运train_test_split的random_state固定后结果可复现但单次划分的评估结果波动可能很大尤其是小数据集。课程设计里如果只报一次划分的准确率说服力不够。常见做法是加一层 K 折交叉验证用cross_val_score看均值和方差。from sklearn.model_selection import cross_val_score from sklearn.linear_model import LogisticRegression model LogisticRegression(max_iter1000) scores cross_val_score(model, X_train, y_train, cv5, scoringaccuracy) print(f5折交叉验证准确率: {scores.mean():.4f} ± {scores.std():.4f})cv5表示五折数据量小可以调到 10。scoring参数按任务选分类用accuracy、f1_macro回归用neg_mean_squared_error。注意回归任务的 scoring 是负值报告里要取反再写。交叉验证的均值用来选模型标准差用来判断模型稳不稳定标准差超过 0.05 就说明数据划分对结果影响太大需要考虑增加数据或换更稳定的模型。3. 模型实现从线性回归到集成学习的可复现代码3.1 线性回归实验最小可跑通版本与参数解读机器学习线性回归实验是热搜里的高频词也是课程设计最常见的选题。下面是一个从数据生成到模型评估的完整最小示例用加州房价数据集。from sklearn.datasets import fetch_california_housing from sklearn.linear_model import LinearRegression, Ridge from sklearn.metrics import mean_squared_error, r2_score from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split import numpy as np # 加载数据 data fetch_california_housing() X, y data.data, data.target # 划分 X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, random_state42 ) # 标准化 scaler StandardScaler() X_train scaler.fit_transform(X_train) X_test scaler.transform(X_test) # 普通线性回归 lr LinearRegression() lr.fit(X_train, y_train) y_pred lr.predict(X_test) print(LinearRegression:) print(f RMSE: {np.sqrt(mean_squared_error(y_test, y_pred)):.4f}) print(f R2: {r2_score(y_test, y_pred):.4f}) # 带 L2 正则的 Ridgealpha 控制正则强度 ridge Ridge(alpha1.0) ridge.fit(X_train, y_train) y_pred_r ridge.predict(X_test) print(Ridge (alpha1.0):) print(f RMSE: {np.sqrt(mean_squared_error(y_test, y_pred_r)):.4f}) print(f R2: {r2_score(y_test, y_pred_r):.4f})参数说明alpha是 Ridge 的正则化系数越大惩罚越强模型越保守。alpha0退化成普通线性回归。实际调参时用RidgeCV自动在候选 alpha 里选候选范围一般取[0.01, 0.1, 1, 10, 100]。评估指标里 RMSE 和原始标签同量纲R2 越接近 1 越好低于 0 说明模型还不如直接预测均值。3.2 分类任务逻辑回归、决策树、SVM 的横向对比课程设计通常要求至少对比两种以上算法。下面这段代码把三个分类器放在同一套数据上跑输出准确率和 F1方便直接填进报告表格。from sklearn.datasets import load_breast_cancer from sklearn.linear_model import LogisticRegression from sklearn.tree import DecisionTreeClassifier from sklearn.svm import SVC from sklearn.metrics import accuracy_score, f1_score from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split data load_breast_cancer() X, y data.data, data.target X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, random_state42, stratifyy ) scaler StandardScaler() X_train scaler.fit_transform(X_train) X_test scaler.transform(X_test) models { LogisticRegression: LogisticRegression(max_iter5000), DecisionTree: DecisionTreeClassifier(max_depth5, random_state42), SVM: SVC(kernelrbf, C1.0, gammascale) } for name, model in models.items(): model.fit(X_train, y_train) pred model.predict(X_test) print(f{name}: acc{accuracy_score(y_test, pred):.4f}, ff1{f1_score(y_test, pred):.4f})三个模型的参数含义要能说清楚。LogisticRegression的max_iter是迭代上限数据标准化后一般 1000 够用不收敛就往上加。DecisionTreeClassifier的max_depth控制树深太深会过拟合课程设计里 3 到 8 之间比较稳。SVC的C是惩罚系数越大越不容忍错分gamma控制 RBF 核的影响半径scale是默认自适应值。SVM 对特征缩放极其敏感不标准化的话结果会很难看这是新手最常踩的坑之一。3.3 无监督KMeans 聚类的评估与可视化如果选题涉及聚类KMeans 是最常见的选择。难点在于聚类没有标签评估要靠轮廓系数和肘部法。from sklearn.datasets import load_iris from sklearn.cluster import KMeans from sklearn.metrics import silhouette_score from sklearn.preprocessing import StandardScaler import matplotlib.pyplot as plt X load_iris().data X StandardScaler().fit_transform(X) inertias, silhouettes [], [] K_range range(2, 11) for k in K_range: km KMeans(n_clustersk, random_state42, n_init10) labels km.fit_predict(X) inertias.append(km.inertia_) silhouettes.append(silhouette_score(X, labels)) # 肘部法找 inertia 下降变缓的拐点 plt.plot(K_range, inertias, markero) plt.xlabel(K); plt.ylabel(Inertia) plt.title(Elbow Method) plt.savefig(elbow.png, dpi150) # 轮廓系数越接近 1 越好 for k, s in zip(K_range, silhouettes): print(fK{k}, silhouette{s:.4f})n_init10表示用 10 组不同初始中心跑取最优避免陷入局部最优。inertia_是簇内平方和肘部法看它下降速度突然变缓的位置。轮廓系数综合了簇内紧密度和簇间分离度但计算量随样本数增长数据超过一万条要慎用。两个指标结论不一致时以轮廓系数为准因为它对簇形状的假设更少。4. 避坑与排查机器学习大作业里最容易翻车的五个地方4.1 数据泄漏指标好看但答辩一问就露馅现象测试集准确率 0.99老师让你解释特征重要性时说不清楚。原因在划分训练测试集之前就做了标准化、缺失值填充或特征选择测试集统计量混进了训练过程。解决所有 fit 操作只对训练集做测试集只 transform。用 sklearn 的 Pipeline 可以强制这个顺序。from sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LogisticRegression pipe Pipeline([ (scaler, StandardScaler()), (clf, LogisticRegression(max_iter1000)) ]) pipe.fit(X_train, y_train) # 内部只在训练集 fit scaler print(pipe.score(X_test, y_test))4.2 类别不平衡准确率骗人F1 才是真相现象二分类任务里 95% 样本是负类模型全预测负类也有 95% 准确率。原因只看 accuracy忽略了类别分布。解决先value_counts()看分布不平衡就换f1_score(averagemacro)或classification_report必要时加class_weightbalanced。4.3 过拟合训练集满分测试集崩盘现象决策树在训练集上准确率 1.0测试集只有 0.7。原因树太深、特征太多、样本太少。解决限制max_depth、min_samples_leaf或换随机森林。画学习曲线看训练和验证分数的差距差距大于 0.1 就要警惕。4.4 随机种子没固定结果无法复现现象每次跑代码结果都不一样报告里的数字对不上。原因train_test_split、模型初始化、KMeans 初始中心都带随机性。解决所有涉及随机的函数都传random_state42包括n_init相关的设置。报告里注明随机种子。4.5 环境与依赖版本冲突代码在别人机器上跑不起来现象本地跑通换台机器ImportError或结果差异大。原因sklearn、numpy 版本不一致某些默认参数在不同版本间变了。解决用pip freeze requirements.txt导出依赖报告附录里写清 Python 和主要库版本。课程设计提交前在一台干净环境里完整跑一遍。5. 报告撰写与答辩让评分老师一眼看到你的工作量5.1 实验报告的结构模板课程设计报告不是论文不需要长篇文献综述但结构要完整。我一般按这个骨架写问题定义与数据集描述300 字→ 数据预处理步骤与理由500 字→ 算法原理简述带关键公式800 字→ 实验设置包括参数表和评估指标400 字→ 结果对比表格与图表600 字→ 结果分析与局限性讨论500 字。总共 3000 字左右配 3 到 5 张图。结果对比表建议用这种格式把每个模型的多个指标放一起模型准确率F1(macro)训练耗时(s)主要参数逻辑回归0.96490.96310.12max_iter5000决策树0.92980.92560.03max_depth5SVM0.97370.97220.45C1.0, kernelrbf表格下面要有一段分析不能只放数字。比如「SVM 在该数据集上表现最好但训练耗时是逻辑回归的 3 倍多数据量增大后差距会更明显实际部署需要权衡」。5.2 答辩时老师最常追问的三个问题第一个问题通常是「你为什么选这个模型」。回答要落到数据特征上比如「数据特征维度高且线性可分性较好所以优先试了线性模型再用 SVM 验证非线性边界是否有提升」。第二个问题是「你的评估指标为什么用这个」。分类任务别只说准确率要提 F1 和混淆矩阵。第三个问题是「如果数据量扩大十倍你的方案还成立吗」。这时候要能说出计算复杂度比如 KMeans 是 O(nkt)SVM 在超大规模数据上会慢逻辑回归和随机森林扩展性更好。5.3 一个让报告加分的技巧把失败实验也写进去很多人只写成功的实验其实把调参过程中失败的尝试写进报告反而显得工作量扎实。比如「初始使用未标准化的数据训练 SVM准确率仅 0.63标准化后提升到 0.97说明该模型对特征尺度高度敏感」。这种对比既展示了排查过程又体现了对算法特性的理解。我自己的习惯是每做完一组实验就在笔记里记一行改了什么参数、指标怎么变、可能的原因是什么。写报告时直接翻笔记比事后回忆靠谱得多。最后说一个我踩过的坑别等到最后一天才跑实验。机器学习大作业的玄学之处在于同一个脚本今天跑 0.95明天换台机器可能就 0.93留出至少两天时间处理环境问题和结果波动。把random_state固定、把依赖版本记下来、把每次实验的命令和输出存好这些习惯比多调一个参数值钱得多。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

AI辅助编程实战:用Claude Code从零搭建宠物生命周期管理App

AI辅助编程实战:用Claude Code从零搭建宠物生命周期管理App

最近我用 Claude Code 从零搭了一个宠物生命周期管理 App,从工程初始化、数据库设计、后端接口,到前端页面和部署,几乎全程通过对话式编程完成。整个过程跑下来最大的感受是:AI 编程真正改变的已经不是“能不能写代码”&#xff0…

2026/10/13 4:38:09 阅读更多 →
Dinic最大流算法详解:分层图、多路增广与当前弧优化

Dinic最大流算法详解:分层图、多路增广与当前弧优化

/* 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 4:37:09 阅读更多 →
ReactDOMRoot源码解析:从createRoot到render的完整链路

ReactDOMRoot源码解析:从createRoot到render的完整链路

做React源码分析&#xff0c;很多人一上来就啃scheduler调度器或者fiber架构&#xff0c;结果被lane、workLoop这些概念劝退。我自己的经验是&#xff0c;不如先从ReactDOMRoot入手——这是每个React应用真正的起点&#xff0c;你天天写的createRoot(...).render(<App/>)…

2026/10/13 4:37:09 阅读更多 →

最新新闻

密码破解原理与防御:从暴力枚举到多因素认证的完整指南

密码破解原理与防御:从暴力枚举到多因素认证的完整指南

做安全这一行&#xff0c;最常被朋友问的一句话就是&#xff1a;"你能不能帮我破解某个密码&#xff1f;"还有另一个版本&#xff1a;"网上那些破解密码的工具到底有没有用&#xff1f;"每次我都得先泼一盆冷水&#xff1a;真正搞安全的&#xff0c;研究破…

2026/10/13 5:15:27 阅读更多 →
高性能异步日志库的C++实现:架构设计与工程实践

高性能异步日志库的C++实现:架构设计与工程实践

做服务端开发这些年&#xff0c;我见过不少服务最后不是死在业务逻辑上&#xff0c;而是死在一些日常根本不会注意的角落。日志就是最典型的例子。表面上它无非是把一段字符串写进文件&#xff0c;但在高并发场景下&#xff0c;一笔请求往往伴随两三条甚至更多日志输出&#xf…

2026/10/13 5:15:27 阅读更多 →
素数筛法深度对比:埃氏筛与线性筛的性能实测与选择指南

素数筛法深度对比:埃氏筛与线性筛的性能实测与选择指南

1. 为什么值得重新审视素数筛法很多人第一次接触素数筛法&#xff0c;都是在算法课上听老师讲“埃拉托斯特尼筛法”&#xff0c;然后写一个双重循环交作业了事。但如果你真正在工程里用过素数——比如做哈希表容量选择、密码学参数生成、竞赛题预处理——就会发现&#xff0c;朴…

2026/10/13 5:15:27 阅读更多 →
Windows CMake Release模式下启用调试的正确配置方法

Windows CMake Release模式下启用调试的正确配置方法

1. 为什么Release模式下还要调试&#xff1f;这不是自相矛盾吗&#xff1f;“Windows下Cmake工程Release调试的Cmake写法和工程设置方法”——这个标题乍看有点反直觉&#xff1a;Release不是用来发布的、优化过的、不带调试信息的最终版本吗&#xff1f;为什么要给它加调试能力…

2026/10/13 5:15:27 阅读更多 →
论文与代码对照阅读实战:从fishnet看论文复现与代码理解方法论

论文与代码对照阅读实战:从fishnet看论文复现与代码理解方法论

1. 从标题拆解&#xff1a;这个项目到底在解决什么问题“fishnet&#xff1a;论文阅读与代码理解”这个标题&#xff0c;第一次看到的时候&#xff0c;我脑子里蹦出来的第一个念头是——这大概率是一个把学术论文和配套代码打通来读的实践项目。为什么这么说&#xff1f;因为“…

2026/10/13 5:15:27 阅读更多 →
Open Code Review:一种透明、结构化、低摩擦的代码评审实践体系

Open Code Review:一种透明、结构化、低摩擦的代码评审实践体系

1. “Open Code Review”不是开源项目&#xff0c;而是一套可落地的代码评审实践体系“Open Code Review”这个词最近在技术社区里频繁出现&#xff0c;但很多人第一反应是——这又是个新出的开源工具&#xff1f;或者某个大厂刚开源的代码审查平台&#xff1f;其实都不是。它既…

2026/10/13 5:14:27 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目&#xff0c;我最大的感受是&#xff0c;大部分坑不是出在技术前沿&#xff0c;而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节&#xff0c;最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了&#xff0c;很难不碰到舵机控制这道坎。做智能小车要转方向&#xff0c;做机械臂要抬关节&#xff0c;做云台要偏航俯仰&#xff0c;背后都是同一个东西在干活&#xff1a;舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”&#xff1f;——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台&#xff1f;或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜&#xff1f;又或者&#xff0c;在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介&#xff1a;基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码&#xff0c;面向计算机相关专业课程设计与期末大作业学生&#xff0c;以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程&#xff0c;…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程&#xff1a;键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化&#xff0c;十个新手有八个栽在"往输入框里填东西"这件事上&#xff1a;要么填不进去&#xff0c;要么填了一半&#xff0c;要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程&#xff1a;阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀&#xff1a;什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面&#xff0c;跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 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/12 21:05:09 阅读更多 →
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/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练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 阅读更多 →