Browse Source

临时提交

main
pd 23 hours ago
parent
commit
58949ab04b
  1. 44
      deepsearcher/templates/html/index.html
  2. 219
      deepsearcher/templates/static/data/test.txt
  3. 2
      deepsearcher/templates/static/js/app.js
  4. 145
      deepsearcher/templates/static/themes/latex.css

44
deepsearcher/templates/html/index.html

@ -174,7 +174,7 @@
</div>
</div>
<!-- <div class="card">
<div class="card">
<div
class="query-result markdown-body"
id="test"
@ -226,7 +226,7 @@
下载
</button>
</div>
</div> -->
</div>
</main>
<footer>
@ -236,29 +236,29 @@
<script src="../static/js/app.js"></script>
<script>
// fetch('../static/data/test.txt').then((res) => {
// res.text().then((text) => {
// document.getElementById('test').innerHTML = md.render(text);
// });
// });
fetch('../static/data/test.txt').then((res) => {
res.text().then((text) => {
document.getElementById('test').innerHTML = md.render(text);
});
});
// function downloadPdf1() {
// const element = document.getElementById('test');
function downloadPdf1() {
const element = document.getElementById('test');
// const opt = {
// margin: 12,
// filename: '内容.pdf',
// image: { type: 'jpeg', quality: 0.98 },
// enableLinks: true,
// html2canvas: { scale: 2, logging: true, useCORS: true }, // 提高清晰度
// jsPDF: { unit: 'mm', format: 'a4', orientation: 'portrait' },
// pagebreak: {
// mode: ['avoid-all', 'css', 'legacy']
// }
// };
const opt = {
margin: 12,
filename: '内容.pdf',
image: { type: 'jpeg', quality: 0.98 },
enableLinks: true,
html2canvas: { scale: 2, logging: true, useCORS: true }, // 提高清晰度
jsPDF: { unit: 'mm', format: 'a4', orientation: 'portrait' },
pagebreak: {
mode: ['avoid-all', 'css', 'legacy']
}
};
// html2pdf().set(opt).from(element).save();
// }
html2pdf().set(opt).from(element).save();
}
function changeTheme(url) {
document.getElementById('md-theme').setAttribute('href', url);

219
deepsearcher/templates/static/data/test.txt

@ -1,172 +1,115 @@
Milvus是一个专为处理大规模向量数据设计的开源向量数据库系统,其名称源自于鹰科猛禽Milvus(以飞行速度快、适应性强著称)的象征意义[^1]。该数据库由Zilliz开发并捐赠至Linux基金会下的LF AI & Data项目,采用Apache 2.0协议开放源代码,已成为全球领先的向量数据库解决方案之一。以下是围绕Milvus的全面分析:
# Milvus向量数据库研究报告
## 一、核心功能与特性
Milvus是一款开源高性能向量数据库,专为处理大规模高维向量数据设计,支持非结构化数据(如文本、图像、音频)的高效相似性搜索。其核心功能包括:
### 一、定义与核心用途
1. **多模态数据建模**:通过Embedding技术将非结构化数据转换为向量后存储,支持稀疏向量、二进制向量、JSON数组等多种数据类型[^1]。
2. **灵活部署模式**:提供三种部署方案以适应不同场景需求:
- **Milvus Lite**:轻量级Python库,适用于本地原型开发或边缘设备[^1]。
- **Milvus Standalone**:单机版,适合中小规模应用[^1]。
- **Milvus Distributed**:云原生分布式架构,支持十亿级甚至万亿级向量数据存储与查询[^1]。
3. **高性能优化**:
- **硬件感知设计**:针对AVX512、SIMD、GPU和NVMe SSD进行底层代码优化,结合C++搜索引擎实现低延迟、高吞吐量[^1]。
- **面向列存储**:仅读取查询涉及的字段,减少I/O开销,并支持向量化操作提升效率[^1]。
4. **高级搜索能力**:支持IVF、HNSW、DiskANN等主流索引算法,并集成元数据过滤、范围搜索及混合搜索(向量+关键词)[^1][^2]。
## 二、技术架构设计原理
Milvus采用**计算与存储分离的分布式架构**,通过模块化设计实现高可扩展性[^1][^4]:
Milvus的核心定位是通过高效存储和检索向量化表示的非结构化数据(如文本、图像、音频)来解决语义搜索难题。它利用Embedding技术将原始数据转化为数字向量,支持多种数据建模方式,可构建包含浮点向量、二进制向量、稀疏向量及JSON字段的复合型Collections[^1]。其应用领域涵盖推荐系统、内容检索、版权保护和专利匹配等场景,典型客户包括Salesforce、PayPal、Airbnb等300余家大型企业。
### 1. 架构层级
- **访问层**:通过无状态Proxy接收请求,实现负载均衡和结果聚合[^4]。
- **协调服务**:由RootCoord、DataCoord、QueryCoord等组件管理集群拓扑、分片分配和全局一致性[^4]。
- **工作节点**:
- **QueryNode**:执行近似最近邻(ANN)搜索,支持增量段(Growing Segments)和历史段(Sealed Segments)并行处理[^4]。
- **IndexNode**:构建和维护索引,支持SIMD和GPU加速[^4]。
- **存储层**:
- **日志代理**:通过Kafka/Pulsar持久化增量数据[^1]。
- **对象存储**:使用S3/MinIO存储索引和元数据快照,支持热/冷数据分层[^4]。
### 2. 关键技术
### 二、技术架构与组件
- **动态段管理**:数据分为实时更新的增量段和批量索引的历史段,优化写入与查询性能[^4]。
- **硬件加速**:支持NVIDIA CAGRA GPU索引和SIMD指令集优化,显著降低计算时延[^1][^7]。
- **弹性扩展**:通过Kubernetes实现横向扩展,支持自动分片和负载均衡[^1]。
## 三、行业典型应用场景
Milvus已被广泛应用于以下领域:
Milvus采用高度解耦的云原生架构,主要由三大核心组件构成:
### 1. **智能搜索引擎与推荐系统**
- **案例**:电商场景中,用户输入“适合夏天的轻薄西装”时,系统通过语义向量匹配商品特征,返回风格相近的商品[^3]。
- **优势**:结合元数据过滤(如价格、类别),在数十亿级商品库中实现毫秒级召回[^5]。
### 2. **多媒体内容检索**
1. **C++引擎层**:负责向量相似度计算、索引构建和数据持久化,通过底层优化实现80%以上的性能瓶颈突破[^1]。
2. **Python服务层**:提供RESTful API和SDK接口,支持快速原型开发与上层应用集成。Milvus Lite作为轻量级Python库,适用于边缘设备或Jupyter Notebook环境[^1]。
3. **分布式协调系统**:基于Kubernetes无状态微服务架构,通过独立的查询节点(QueryNode)、数据节点(DataNode)和索引节点(IndexNode)实现横向扩展,支持十亿级到数百亿级向量的集群部署[^2]。
- **图像/视频搜索**:公安系统利用人脸比对技术,通过向量检索快速定位嫌疑人;版权公司检测视频侵权内容[^3]。
- **音频识别**:音乐平台通过指纹匹配技术实现歌曲推荐[^3]。
### 3. **知识密集型AI应用**
- **RAG(检索增强生成)**:在医疗问答系统中,用户提问被编码为向量,通过Milvus检索医学文献片段,辅助大模型生成答案[^3]。
- **金融风控**:基于交易行为向量分析,识别异常模式并预警欺诈风险[^3]。
### 三、索引机制与搜索能力
### 4. **物联网与知识图谱**
- **实体链接**:某金融科技公司通过Milvus将客户查询中的实体(如人名、地点)转化为向量,实现跨系统数据关联,匹配时间缩短30%[^3]。
## 四、性能指标与基准测试
Milvus支持多样化的索引类型以适应不同场景需求
Milvus在性能测试中表现优异,尤其在大规模数据集上具备显著优势
1. **基准测试结果**:
- 在VectorDBBench测试中,Milvus的QPS(每秒查询数)和Recall(召回率)均优于FAISS、HNSWLib等竞品,延迟中位数达2.4ms[^5]。
- 支持百亿级向量数据存储,且扩展性随节点增加线性提升[^1]。
2. **性能优化策略**:
- **索引选择**:HNSW适合高精度场景(如生物识别),IVF适用于中等规模数据,DiskANN则降低内存占用但需权衡延迟[^5]。
- **参数调优**:调整nprobe(IVF索引搜索簇数)、efConstruction(HNSW索引构建参数)等参数可平衡精度与速度[^5]。
- **硬件适配**:启用GPU加速可提升大规模搜索效率,例如在128维向量场景下QPS可达数百万次[^7]。
## 五、差异化优势与竞品对比
- **内存索引**:包括IVF_FLAT(精确近似最近邻)、HNSW(分层导航小世界图)、SCANN(随机近似近邻)等,适用于实时性要求高的场景[^2]。
- **磁盘索引**:DiskANN(Approximate Nearest Neighbor in Disks)通过分层存储策略,将热数据存于内存冷数据存于磁盘,在保证高召回率的同时显著降低存储成本,相比IVF-Flat在磁盘场景下减少约40%存储开销[^3]。
- **硬件加速**:集成NVIDIA CAGRA GPU索引和AVX512指令集优化,使GPU加速场景下的搜索速度提升可达3个数量级[^1]。
| 特性 | Milvus | Pinecone | Weaviate | Qdrant |
| -------------- | --------------------------------- | ---------------------------- | ---------------------- | -------------------------- |
| **开源性** | Apache 2.0许可,社区活跃 | 闭源,仅云服务 | 开源 | 开源 |
| **索引多样性** | 11种索引(如HNSW、IVF、DiskANN) | 专有算法,不公开 | 主要依赖HNSW | HNSW为主,逐步支持混合搜索 |
| **部署灵活性** | 本地、单机、分布式、云服务 | 仅云服务 | 本地/云服务 | 单机/云服务 |
| **生态兼容性** | 集成LangChain、LlamaIndex等AI框架 | 封闭生态 | 支持GraphQL接口 | 支持REST/gRPC |
| **企业级功能** | 支持多租户、热/冷存储、高可用 | 提供托管服务但缺乏自定义能力 | 无中心化架构,易用性强 | 轻量级,适合中小规模应用 |
### 核心竞争力分析
1. **多索引支持**:Milvus是少数实现DiskANN的向量数据库,覆盖从高精度到低成本的多样需求[^2]。
2. **云原生设计**:通过计算存储分离架构,允许独立扩展计算和存储资源,满足企业级大规模部署需求[^1]。
3. **硬件深度优化**:针对CPU/GPU/NVMe SSD进行定制化代码优化,性能领先开源竞品[^1]。
4. **全生命周期管理**:提供从数据导入、索引构建到查询优化的全流程API,且支持自动化调参(如动态调整索引参数)[^7]。
其搜索功能体系包含:
## 六、挑战与优化方向
尽管Milvus优势显著,但仍需注意以下挑战:
1. **复杂部署**:分布式架构对运维要求较高,需配置etcd、Kafka等组件[^1]。
2. **冷启动成本**:索引构建(如HNSW)耗时较长,可能影响新数据的即时查询性能[^8]。
**优化建议**:
- **基础搜索**:ANN(近似最近邻)和范围搜索(Radius Search)[^4]
- **混合搜索**:支持动态权重分配的多向量字段联合搜索,通过Reranker模块实现结果排序优化[^5]
- **全文搜索**:集成BM25算法,支持将文本直接转换为稀疏向量进行索引[^5]
- **分层存储**:将高频数据存于内存/SSD,冷数据迁移至磁盘,降低成本[^1]。
- **混合索引**:结合HNSW(高精度)与IVF-PQ(低存储)提升性价比[^4]。
- **监控体系**:通过Prometheus+Grafana实时跟踪CPU、IOPS等指标,及时发现瓶颈(如QueryNode过载)[^8]。
## 七、总结与选型建议
Milvus凭借其**开源透明性、多索引灵活性**及**企业级扩展能力**,成为处理大规模向量数据的首选。对于需快速迭代的初创团队,可选择Milvus Lite或Zilliz Cloud托管服务;而企业级用户则可通过分布式架构应对PB级数据挑战。相比之下,Pinecone虽提供开箱即用体验,但闭源特性限制了定制化需求[^5]。未来,Milvus的多模态融合(如文本+图像联合检索)和更高效的磁盘索引算法将进一步巩固其市场地位[^9]。
### 四、性能与扩展优势
根据VectorDBBench基准测试,Milvus在多数场景下性能优于其他向量数据库2-5倍[^2]。其扩展能力体现在:
- **存储扩展**:支持热/冷存储分层,通过对象存储(如AWS S3)管理PB级冷数据,内存热数据缓存命中率可达95%[^5]
- **计算扩展**:查询节点与数据节点分离设计,可独立扩展处理读写压力。分布式集群部署时,通过mmap技术实现内存映射文件的高效管理[^2]
- **成本控制**:Zilliz Cloud托管版相较Pinecone在中型数据集查询成本降低27.5%,大型数据集成本优化达48.5%[^2]
### 五、部署模式与运维特性
Milvus提供三种部署方案:
1. **Lite模式**:单机Python库形式,资源占用约500MB,适合原型开发与边缘部署[^1]
2. **Standalone模式**:单节点Docker部署,支持最多10万并发连接,但不支持水平扩展[^1]
3. **Distributed模式**:Kubernetes集群部署,支持自动故障转移(通过Coordinator HA机制)和滚动升级,能够实现每秒数百万次查询的吞吐能力[^2]
运维层面通过以下机制保障可靠性:
- **多副本架构**:默认启用数据复制,结合Raft协议确保数据一致性[^2]
- **备份恢复**:Milvus Backup工具支持增量备份和版本管理,RPO(恢复点目标)可达秒级[^5]
- **监控体系**:集成Prometheus和Grafana,提供毫秒级延迟监控和资源利用率分析[^4]
### 六、混合搜索与高级功能
混合搜索功能通过三个维度实现多字段权重调整:
1. **向量字段组合**:支持任意数量的密集/稀疏向量字段参与计算
2. **动态评分函数**:允许自定义权重矩阵,使用加权余弦相似度等公式
3. **元数据过滤**:结合标量字段(Scalar Fields)进行布尔过滤和范围筛选[^5]
面向列的存储优化体现在:
- 列式存储使查询时仅加载相关字段数据,减少I/O负载约60%
- 支持列式批量操作(如向量化计算),提升CPU利用率至95%以上[^3]
### 七、行业案例与技术演进
- **Sohu新闻推荐系统**:通过Milvus实现每日数千万级新闻的实时向量化匹配,Embedding模型每周更新一次,结合增量导入和索引刷新维持数据新鲜度[^5]
- **Bigo视频去重**:采用特征降维(如PCA)处理视频的512维特征向量,存储空间压缩比达3:1,同时通过稀疏向量索引提升相似度计算效率[^5]
路线图显示,Milvus 3.0将重点引入文本类型原生支持,预计通过分块编码(Chunk Encoding)和TF-IDF优化技术,使文本数据的索引构建速度提升40%[^4]。当前已实现稀疏向量(Sparse Vector)的GA版本,支持SPLADE和BGE-M3等先进模型。
### 八、技术挑战与解决方案
面临的主要挑战及应对措施包括:
- **高维数据存储**:采用列式存储结合量化压缩(如SQ8/PQ),在1024维向量场景下存储密度提升3倍[^2]
- **多租户隔离**:通过RBAC(基于角色的访问控制)和资源配额管理系统(ResourceQuota)实现租户级资源分配,最小单位为100个并发连接[^5]
- **数据持久化**:在Kubernetes环境中使用StatefulSet管理持久化卷,结合WAL(Write-Ahead Log)机制保障故障恢复时数据零丢失[^5]
JSON字段处理特别采用列式反序列化技术,通过Schema解析将嵌套结构扁平化处理,在保持完整查询能力的同时,索引构建速度较传统方法提升25%[^5]。硬件感知优化方面,对Intel CPU实施AVX512指令集优化,对NVIDIA GPU则利用CUDA并行计算框架,使DiskANN在混合架构下的查询延迟能缩短至15ms以内[^2]。
### 九、社区与生态系统
Milvus的开发者社区包含来自ARM、英伟达等科技公司的专家,核心贡献者覆盖HPC领域资深工程师。其生态系统已形成:
- **工具链**:Attu可视化界面、Birdwatcher监控工具、CDC数据同步插件
- **集成支持**:Spark/Kafka连接器、30+种编程语言SDK(含微软官方C# SDK)
- **AI模型集成**:通过pymilvus_models库提供超过200种预训练Embedding模型[^2]
Zilliz Cloud作为托管服务,在开源版基础上增加了智能扩缩容、自动备份、细粒度审计日志等功能,但牺牲了部分自定义配置选项(如特定硬件优化参数)[^2]。
### 十、总结与展望
Milvus通过C++引擎与Python服务的异步通信机制(基于gRPC和ZeroMQ),实现了微秒级响应延迟[^1]。其独特的Partition Key特性相比传统分库分表,在分区粒度上可细化到字段层级,支持数百万级别的动态分区管理[^5]。随着向量数据规模持续增长,Milvus的云原生架构和硬件感知优化使其成为处理超大规模AI应用场景的关键基础设施。未来在文本类型支持和分布式事务处理方面的改进,将进一步强化其在多模态数据处理领域的竞争优势。
[^1]: [12133](docs/intro_docs/what_is_milvus.md)
[^2]: file:///G:/deep-searcher/docs/intro_docs/milvus_and_others.md
[^3]: file:///G:/deep-searcher/docs/intro_docs/milvus_application.md
[^4]: file:///G:/deep-searcher/docs/intro_docs/milvus_roadmap.md
[^5]: https://www.baidu.com
[^1]: [/file/%2Fmnt%2Fc%2Fworkspace%2Fdocs%2Fintro_docs%2Fwhat_is_milvus.md](/file/%2Fmnt%2Fc%2Fworkspace%2Fdocs%2Fintro_docs%2Fwhat_is_milvus.md)
[^2]: [/file/%2Fmnt%2Fc%2Fworkspace%2Fdocs%2Fintro_docs%2Fmilvus_and_others.md](/file/%2Fmnt%2Fc%2Fworkspace%2Fdocs%2Fintro_docs%2Fmilvus_and_others.md)
[^3]: https://cloud.tencent.com/developer/article/2538386
[^4]: https://blog.csdn.net/weixin_53933896/article/details/147855500
[^5]: https://juejin.cn/post/7502352683375673382
[^6]: https://www.cnblogs.com/xfuture/p/18308851
[^7]: https://helloreader.blog.csdn.net/article/details/141892755
[^8]: https://cloud.tencent.com/developer/article/2437663
[^9]: https://dis.qidao123.com/thread-65170-1-1.html

2
deepsearcher/templates/static/js/app.js

@ -14,7 +14,7 @@ md.renderer.rules.footnote_ref = (tokens, idx, options, env, slf) => {
const href = `#fn${n}`;
const id = `fnref${n}`;
return `<sup class="footnote-ref">[^<a href="${href}" id="${id}">${n}</a>]</sup>`;
return `<sup class="footnote-ref">[<a href="${href}" id="${id}">${n}</a>]</sup>`;
};
// 工具函数:显示状态信息

145
deepsearcher/templates/static/themes/latex.css

@ -86,7 +86,7 @@
}
@media print {
.markdown-body #write {
.markdown-body {
padding: 0 !important;
}
.markdown-body h2 {
@ -95,15 +95,15 @@
.markdown-body h2:first-of-type {
break-before: avoid-page;
}
@page {
margin: 1.8cm 2cm 1.2cm 2cm !important; /* 页边距 */
}
/* @page {
margin: 1.8cm 2cm 1.2cm 2cm !important;
} */
}
.markdown-body #write {
.markdown-body {
font-family: var(--base-Latin-font), var(--base-Chinese-font), serif;
font-size: var(--base-font-size);
/* A4标准宽度 */
max-width: 21cm;
/* max-width: 21cm; */
background-color: white;
/* column-count: 2;
column-gap: 25px;
@ -111,17 +111,17 @@
display: inline-block; */
/* 这里可以试分栏的,但确实不适合实现 */
}
.markdown-body #write .md-math-block,
.markdown-body #write .md-rawblock,
.markdown-body #write p {
.markdown-body .md-math-block,
.markdown-body .md-rawblock,
.markdown-body p {
margin-top: 1em;
margin-bottom: 1em;
}
.markdown-body #write p {
.markdown-body p {
text-align: left;
line-height: var(--base-line-height);
}
.markdown-body #write a {
.markdown-body a {
color: var(--link-color-light);
}
@ -131,17 +131,12 @@
margin-bottom: 1.8em;
}
.markdown-body img {
/* 避免图片在导出时被断开 */
break-inside: avoid-page;
}
.markdown-body strong {
font-weight: var(--strong-weight);
}
@media screen {
.markdown-body #write {
.markdown-body {
padding: var(--set-margin);
/* 添加一个淡蓝色的边框 */
/* border: 0.8px solid #AAC ; */
@ -213,10 +208,10 @@
font-size: 0.8em;
}
.markdown-body #write > h3.md-focus:before,
.markdown-body #write > h4.md-focus:before,
.markdown-body #write > h5.md-focus:before,
.markdown-body #write > h6.md-focus:before,
.markdown-body > h3.md-focus:before,
.markdown-body > h4.md-focus:before,
.markdown-body > h5.md-focus:before,
.markdown-body > h6.md-focus:before,
.markdown-body h3.md-focus:before,
.markdown-body h4.md-focus:before,
.markdown-body h5.md-focus:before,
@ -236,86 +231,86 @@
line-height: inherit;
}
.markdown-body #write {
.markdown-body {
counter-reset: heading-h2 heading-h3 heading-h4 heading-h5 heading-h6;
}
.markdown-body #write h1,
.markdown-body #write h2,
.markdown-body #write h3,
.markdown-body #write h4,
.markdown-body #write h5,
.markdown-body #write h6 {
.markdown-body h1,
.markdown-body h2,
.markdown-body h3,
.markdown-body h4,
.markdown-body h5,
.markdown-body h6 {
font-weight: bold;
break-after: avoid-page !important;
}
.markdown-body .markdown-body #write h1 {
.markdown-body .markdown-body h1 {
font-family: var(--heading-Latin-font), var(--title-Chinese-font), serif;
text-align: center;
column-span: all;
font-size: var(--title-font-size);
}
.markdown-body #write h2 {
.markdown-body h2 {
font-family: var(--heading-Latin-font), var(--h2-Chinese-font), serif;
font-size: var(--h2-font-size);
}
.markdown-body #write h3 {
.markdown-body h3 {
font-family: var(--heading-Latin-font), var(--h3-Chinese-font), serif;
font-size: var(--h3-font-size);
line-height: var(--h3-font-size);
}
.markdown-body #write h4 {
.markdown-body h4 {
font-family: var(--heading-Latin-font), var(--h4-Chinese-font), serif;
font-size: var(--h4-font-size);
line-height: var(--h4-font-size);
}
.markdown-body #write h5 {
.markdown-body h5 {
font-family: var(--heading-Latin-font), var(--h5-Chinese-font), serif;
font-size: var(--h5-font-size);
line-height: var(--h5-font-size);
}
.markdown-body #write h6 {
.markdown-body h6 {
font-family: var(--heading-Latin-font), var(--h6-Chinese-font), serif;
font-size: var(--h6-font-size);
/* 没有写错,为了避免行距太小才这么写 */
line-height: var(--h5-font-size);
}
.markdown-body #write h1 {
.markdown-body h1 {
counter-set: heading-h2 0 heading-h3 0 heading-h4 0 heading-h5 0 heading-h6 0;
}
.markdown-body #write h2 {
.markdown-body h2 {
counter-set: heading-h3 0 heading-h4 0 heading-h5 0 heading-h6 0;
}
.markdown-body #write h3 {
.markdown-body h3 {
counter-set: heading-h4 0 heading-h5 0 heading-h6 0;
}
.markdown-body #write h4 {
.markdown-body h4 {
counter-set: heading-h5 0 heading-h6 0;
}
.markdown-body #write h5 {
.markdown-body h5 {
counter-set: heading-h6 0;
}
.markdown-body #write h2:before,
.markdown-body h2:before,
h2.md-focus.md-heading:before {
content: counter(heading-h2);
counter-increment: heading-h2;
margin-right: 1.2em;
}
.markdown-body #write h3:before,
.markdown-body h3:before,
h3.md-focus.md-heading:before {
content: counter(heading-h2) '.' counter(heading-h3);
counter-increment: heading-h3;
margin-right: 1.2em;
}
.markdown-body #write h4:before,
.markdown-body h4:before,
h4.md-focus.md-heading:before {
content: counter(heading-h2) '.' counter(heading-h3) '.' counter(heading-h4);
counter-increment: heading-h4;
margin-right: 1.2em;
}
.markdown-body #write h5:before,
.markdown-body h5:before,
h5.md-focus.md-heading:before {
content: counter(heading-h2) '.' counter(heading-h3) '.' counter(heading-h4)
'.' counter(heading-h5);
@ -323,7 +318,7 @@ h5.md-focus.md-heading:before {
margin-right: 1.2em;
}
.markdown-body #write h6:before,
.markdown-body h6:before,
h6.md-focus.md-heading:before {
content: counter(heading-h2) '.' counter(heading-h3) '.' counter(heading-h4)
'.' counter(heading-h5) '.' counter(heading-h6);
@ -443,16 +438,16 @@ h6.md-focus.md-heading:before {
}
/* 无序列表 */
.markdown-body #write ul {
.markdown-body ul {
list-style: disc;
padding-left: 2em;
}
.markdown-body #write ul ul {
.markdown-body ul ul {
/*list-style: circle;*/
/* 请勿删除“–”后的空格, 他们对缩进有一定影响, 下同 */
list-style: '–   ';
}
.markdown-body #write ul ul ul {
.markdown-body ul ul ul {
list-style: '◦  ';
}
@ -464,32 +459,32 @@ h6.md-focus.md-heading:before {
}
/* 有序列表 */
.markdown-body #write ol {
.markdown-body ol {
list-style: decimal;
}
.markdown-body #write ol ol {
.markdown-body ol ol {
counter-reset: liist;
list-style: none;
}
.markdown-body #write ol ol > li {
.markdown-body ol ol > li {
counter-increment: liist;
position: relative;
}
.markdown-body #write ol ol > li::before {
.markdown-body ol ol > li::before {
content: '(' counter(liist, lower-alpha) ')';
position: absolute;
left: -1.8em;
}
.markdown-body #write ol ol ol {
.markdown-body ol ol ol {
counter-reset: liiist;
list-style: none;
margin: 0;
}
.markdown-body #write ol ol ol > li {
.markdown-body ol ol ol > li {
counter-increment: liiist;
position: relative;
}
.markdown-body #write ol ol ol > li::before {
.markdown-body ol ol ol > li::before {
content: counter(liiist, lower-roman) '.';
align-self: flex-end;
position: absolute;
@ -502,19 +497,19 @@ h6.md-focus.md-heading:before {
text-align: right;
}
.markdown-body #write ol,
.markdown-body #write ul {
.markdown-body ol,
.markdown-body ul {
padding-inline-start: 2em;
}
.markdown-body #write li {
.markdown-body li {
position: relative;
}
.markdown-body #write li + li,
.markdown-body #write ul + ol > li,
.markdown-body #write ol + ul > li,
.markdown-body #write li > ul > li,
.markdown-body #write li > ol > li {
.markdown-body li + li,
.markdown-body ul + ol > li,
.markdown-body ol + ul > li,
.markdown-body li > ul > li,
.markdown-body li > ol > li {
margin-top: -0.8em;
}
@ -526,7 +521,7 @@ h6.md-focus.md-heading:before {
height: 1em !important;
}
.markdown-body #write table {
.markdown-body table {
/* 三线表第一条线宽度 */
border-top: 1.2pt solid;
/* 三线表第二条线宽度 */
@ -542,16 +537,22 @@ h6.md-focus.md-heading:before {
/* 使表格默认居中;虽然这个代码不好,但好像没别的实现办法 */
margin: 0 auto;
}
.markdown-body #write table td {
.markdown-body table td {
padding: 2px;
}
.markdown-body #write table tr {
/* .markdown-body table th,
.markdown-body table td {
padding: 6px 13px;
border: 1px solid #d0d7de;
} */
.markdown-body table tr {
padding: 2px;
}
.markdown-body #write th {
.markdown-body th {
padding: 0px 6px;
}
.markdown-body #write thead {
.markdown-body thead {
/* 表格标题(首行)样式 */
/* 三线表表头的线 */
border-bottom: 0.5pt solid;
@ -706,3 +707,13 @@ h6.md-focus.md-heading:before {
margin-left: 7.5em;
margin-right: 0.5em;
}
.markdown-body img {
border-style: none;
max-width: 100%;
box-sizing: content-box;
background-color: #ffffff;
/* 避免图片在导出时被断开 */
break-inside: avoid-page;
}

Loading…
Cancel
Save