CSS 基础:文本和字体(4)<思维导图>

作者利用间隙时间学习CSS基础知识,虽主要从事后台开发,但认为系统学习CSS基础很有必要,还展示了学习时做的思维导图,参考资料为《CSS设计指南(第二版)》。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 这段时间利用一下间隙时间学习了CSS的基础知识,主要目的是加深对CSS的理解,虽然个人主要工作基本都是后台开发,但是个人觉得系统学习一下CSS的基础还是很有必要的。下面我学习CSS时做的思维导图(全屏查看:文本和字体<思维导图>):

 

参考资料:《CSS设计指南(第二版)》

 

分类:  CSS
本文转自gyzhao博客园博客,原文链接:http://www.cnblogs.com/IPrograming/p/CSS_Font_Text.html ,如需转载请自行联系原作者
分析以下html 使用这个js 实现markdown转思维导图生成html: <!doctype html> <html> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Markmap</title> <style> * { margin: 0; padding: 0; } html { font-family: ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; } #mindmap { display: block; width: 100vw; height: 100vh; } .markmap-dark { background: #27272a; color: white; } </style> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/markmap-toolbar@0.18.12/dist/style.css"> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.18/dist/katex.min.css"> </head> <body> <svg id="mindmap"></svg> <script src="https://cdn.jsdelivr.net/npm/d3@7.9.0/dist/d3.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/markmap-view@0.18.12/dist/browser/index.js"></script> <script src="https://cdn.jsdelivr.net/npm/markmap-toolbar@0.18.12/dist/index.js"></script> <script>(e=>{window.WebFontConfig={custom:{families:["KaTeX_AMS","KaTeX_Caligraphic:n4,n7","KaTeX_Fraktur:n4,n7","KaTeX_Main:n4,n7,i4,i7","KaTeX_Math:i4,i7","KaTeX_Script","KaTeX_SansSerif:n4,n7,i4","KaTeX_Size1","KaTeX_Size2","KaTeX_Size3","KaTeX_Size4","KaTeX_Typewriter"]},active:()=>{e().refreshHook.call()}}})(()=>window.markmap)</script><script src="https://cdn.jsdelivr.net/npm/webfontloader@1.6.28/webfontloader.js" defer></script><script>(()=>{setTimeout(()=>{const{markmap:S,mm:Q}=window,$=new S.Toolbar;$.attach(Q);const I=$.render();I.setAttribute("style","position:absolute;bottom:20px;right:20px"),document.body.append(I)})})()</script> <script>((l,U,M,R)=>{const N=l();window.mm=N.Markmap.create("svg#mindmap",(U||N.deriveOptions)(R),M),window.matchMedia("(prefers-color-scheme: dark)").matches&&document.documentElement.classList.add("markmap-dark")})(()=>window.markmap,null,{"content":"markmap","children":[{"content":"Links","children":[{"content":"<a href=\"https://markmap.js.org/\">Website</a>","children":[],"payload":{"tag":"li","lines":"8,9"}},{"content":"<a href=\"https://github.com/gera2ld/markmap\">GitHub</a>","children":[],"payload":{"tag":"li","lines":"9,11"}}],"payload":{"tag":"h2","lines":"6,7"}},{"content":"Related Projects","children":[{"content":"<a href=\"https://github.com/gera2ld/coc-markmap\">coc-markmap</a> for Neovim","children":[],"payload":{"tag":"li","lines":"13,14"}},{"content":"<a href=\"https://marketplace.visualstudio.com/items?itemName=gera2ld.markmap-vscode\">markmap-vscode</a> for VSCode","children":[],"payload":{"tag":"li","lines":"14,15"}},{"content":"<a href=\"https://github.com/emacs-eaf/eaf-markmap\">eaf-markmap</a> for Emacs","children":[],"payload":{"tag":"li","lines":"15,17"}}],"payload":{"tag":"h2","lines":"11,12"}},{"content":"Features","children":[{"content":"Lists","children":[{"content":"<strong>strong</strong> <s>del</s> italic <mark>highlight</mark>","children":[],"payload":{"tag":"li","lines":"23,24"}},{"content":"<code>inline code</code>","children":[],"payload":{"tag":"li","lines":"24,25"}},{"content":"<svg width=\"16\" height=\"16\" viewBox=\"0 -3 24 24\"><path d=\"M19 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2m-9 14-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8z\"/></svg> checkbox","children":[],"payload":{"tag":"li","lines":"25,26"}},{"content":"Katex: <span class=\"katex\"><span class=\"katex-mathml\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\"><semantics><mrow><mi>x</mi><mo>=</mo><mfrac><mrow><mo>−</mo><mi>b</mi><mo>±</mo><msqrt><mrow><msup><mi>b</mi><mn>2</mn></msup><mo>−</mo><mn>4</mn><mi>a</mi><mi>c</mi></mrow></msqrt></mrow><mrow><mn>2</mn><mi>a</mi></mrow></mfrac></mrow><annotation encoding=\"application/x-tex\">x = {-b \\pm \\sqrt{b^2-4ac} \\over 2a}</annotation></semantics></math></span><span class=\"katex-html\" aria-hidden=\"true\"><span class=\"base\"><span class=\"strut\" style=\"height:0.4306em;\"></span><span class=\"mord mathnormal\">x</span><span class=\"mspace\" style=\"margin-right:0.2778em;\"></span><span class=\"mrel\">=</span><span class=\"mspace\" style=\"margin-right:0.2778em;\"></span></span><span class=\"base\"><span class=\"strut\" style=\"height:1.3845em;vertical-align:-0.345em;\"></span><span class=\"mord\"><span class=\"mord\"><span class=\"mopen nulldelimiter\"></span><span class=\"mfrac\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:1.0395em;\"><span style=\"top:-2.655em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\"><span class=\"mord mtight\">2</span><span class=\"mord mathnormal mtight\">a</span></span></span></span><span style=\"top:-3.23em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"frac-line\" style=\"border-bottom-width:0.04em;\"></span></span><span style=\"top:-3.394em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"sizing reset-size6 size3 mtight\"><span class=\"mord mtight\"><span class=\"mord mtight\">−</span><span class=\"mord mathnormal mtight\">b</span><span class=\"mbin mtight\">±</span><span class=\"mord sqrt mtight\"><span class=\"vlist-t vlist-t2\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.9221em;\"><span class=\"svg-align\" style=\"top:-3em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"mord mtight\" style=\"padding-left:0.833em;\"><span class=\"mord mtight\"><span class=\"mord mathnormal mtight\">b</span><span class=\"msupsub\"><span class=\"vlist-t\"><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.7463em;\"><span style=\"top:-2.786em;margin-right:0.0714em;\"><span class=\"pstrut\" style=\"height:2.5em;\"></span><span class=\"sizing reset-size3 size1 mtight\"><span class=\"mord mtight\">2</span></span></span></span></span></span></span></span><span class=\"mbin mtight\">−</span><span class=\"mord mtight\">4</span><span class=\"mord mathnormal mtight\">a</span><span class=\"mord mathnormal mtight\">c</span></span></span><span style=\"top:-2.8821em;\"><span class=\"pstrut\" style=\"height:3em;\"></span><span class=\"hide-tail mtight\" style=\"min-width:0.853em;height:1.08em;\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"400em\" height=\"1.08em\" viewBox=\"0 0 400000 1080\" preserveAspectRatio=\"xMinYMin slice\"><path d=\"M95,702\nc-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14\nc0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54\nc44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10\ns173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429\nc69,-144,104.5,-217.7,106.5,-221\nl0 -0\nc5.3,-9.3,12,-14,20,-14\nH400000v40H845.2724\ns-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7\nc-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z\nM834 80h400000v40h-400000z\"/></svg></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.1179em;\"><span></span></span></span></span></span></span></span></span></span><span class=\"vlist-s\">​</span></span><span class=\"vlist-r\"><span class=\"vlist\" style=\"height:0.345em;\"><span></span></span></span></span></span><span class=\"mclose nulldelimiter\"></span></span></span></span></span></span>","children":[{"content":"<a href=\"#?d=gist:af76a4c245b302206b16aec503dbe07b:katex.md\">More Katex Examples</a>","children":[],"payload":{"tag":"li","lines":"27,28"}}],"payload":{"tag":"li","lines":"26,28","fold":1}},{"content":"Now we can wrap very very very very long text with the <code>maxWidth</code> option","children":[],"payload":{"tag":"li","lines":"28,29"}},{"content":"Ordered list","children":[{"content":"1. item 1","children":[],"payload":{"tag":"li","lines":"30,31","listIndex":1}},{"content":"2. item 2","children":[],"payload":{"tag":"li","lines":"31,33","listIndex":2}}],"payload":{"tag":"li","lines":"29,33"}}],"payload":{"tag":"h3","lines":"21,22"}},{"content":"Blocks","children":[{"content":"<pre data-lines=\"35,38\"><code class=\"language-js\"><span class=\"hljs-variable language_\">console</span>.<span class=\"hljs-title function_\">log</span>(<span class=\"hljs-string\">&apos;hello, JavaScript&apos;</span>)\n</code></pre>","children":[],"payload":{"tag":"pre","lines":"35,38"}},{"content":"<table data-lines=\"39,43\">\n<thead data-lines=\"39,40\">\n<tr data-lines=\"39,40\">\n<th>Products</th>\n<th>Price</th>\n</tr>\n</thead>\n<tbody data-lines=\"41,43\">\n<tr data-lines=\"41,42\">\n<td>Apple</td>\n<td>4</td>\n</tr>\n<tr data-lines=\"42,43\">\n<td>Banana</td>\n<td>2</td>\n</tr>\n</tbody>\n</table>","children":[],"payload":{"tag":"table","lines":"39,43"}},{"content":"<img src=\"https://markmap.js.org/favicon.png\" alt>","children":[],"payload":{"tag":"img","lines":"44,45"}}],"payload":{"tag":"h3","lines":"33,34"}}],"payload":{"tag":"h2","lines":"17,18"}}]},{"colorFreezeLevel":2})</script> </body> </html>
06-25
<think>我们分析提供的HTML文件,它使用markmap库将Markdown内容转换为思维导图。主要步骤如下:1.引入必要的CSSJS文件(d3.js,markmap-view,markmap-toolbar等)。2.在页面中放置一个SVG元素(id为"mindmap")作为思维导图的容器。3.使用JavaScript初始化思维导图,将Markdown内容(以特定结构表示)转换为思维导图并渲染在SVG中。我们要做的是:使用这个HTML模板,将我们自己的Markdown内容转换为思维导图,生成一个独立的HTML文件。但是,注意:原始HTML中,思维导图的数据是内嵌在最后一个`<script>`标签中的。我们需要替换这部分数据。观察最后一个`<script>`标签的内容:((l,U,M,R)=>{...})(()=>window.markmap,null,{...},...)其中第三个参数(M)就是思维导图的数据,是一个对象,包含了Markdown内容的结构化表示。然而,我们通常希望从Markdown文本开始转换。markmap-view库提供了将Markdown文本解析为结构化数据的方法。因此,我们可以调整这个HTML模板:1.移除内嵌的数据,改为从外部Markdown文本转换。2.使用markmap库的API将Markdown文本解析为树状结构,然后渲染。具体步骤:1.创建一个SVG容器(如原HTML中的`<svgid="mindmap"></svg>`)。2.引入必要的库(d3,markmap-view,markmap-toolbar等)。3.编写JavaScript代码:-获取Markdown文本(可以内嵌在HTML中,或者通过其他方式传入)-使用`markmap.transform.parse(markdownText)`将Markdown解析为树状结构。-使用`markmap.Markmap.create(svgElement,options,data)`创建思维导图。另外,原HTML中还集成了工具栏暗色模式支持,我们可以保留这些功能。我们将创建一个函数,它接收Markdown文本,输出一个完整的HTML字符串,其中包含渲染思维导图的所有内容。注意:为了避免CDN不稳定,我们可以考虑将库文件内联或使用本地文件,但这里为了简便,我们仍然使用CDN。下面是一个生成HTML的示例代码(使用Java):</think># Markdown 转思维导图 HTML 实现分析 我将分析提供的 HTML 实现,并提供一个完整的 Markdown 转思维导图解决方案。原始代码展示了使用 markmap 库将 Markdown 内容转换为交互式思维导图的过程。 ## 实现原理分析 ### 关键组件 1. **D3.js** (v7.9.0): 用于数据可视化 2. **Markmap-view** (v0.18.12): 核心思维导图库 3. **Markmap-toolbar** (v0.18.12): 提供交互工具栏 4. **KaTeX** (v0.16.18): 数学公式渲染支持 5. **WebFontLoader**: 加载 KaTeX 所需字体 ### 核心流程 ```mermaid graph TD A[输入 Markdown 内容] --> B[转换为结构化 JSON] B --> C[创建 SVG 容器] C --> D[使用 D3.js 渲染思维导图] D --> E[添加工具栏交互] E --> F[应用暗色模式检测] ``` ## 完整实现代码 ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Markdown to Mindmap</title> <style> * { margin: 0; padding: 0; box-sizing: border-box; } html { font-family: ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; } #container { display: flex; flex-direction: column; height: 100vh; } #toolbar { padding: 10px 15px; background-color: #2c3e50; color: white; display: flex; justify-content: space-between; align-items: center; box-shadow: 0 2px 5px rgba(0,0,0,0.2); } #mindmap { flex-grow: 1; background: white; overflow: hidden; } .btn { background-color: #3498db; color: white; border: none; padding: 8px 15px; border-radius: 4px; cursor: pointer; font-size: 14px; margin-left: 5px; transition: background-color 0.2s; } .btn:hover { background-color: #2980b9; } .markdown-input { width: 100%; height: 200px; padding: 10px; font-family: monospace; border: 1px solid #ddd; border-radius: 4px; resize: vertical; } .input-container { padding: 15px; background-color: #f8f9fa; border-bottom: 1px solid #eee; } .markmap-dark #toolbar { background-color: #1a1a2e; } .markmap-dark #mindmap { background: #121212; } .markmap-dark .input-container { background-color: #2d3748; color: #e2e8f0; } </style> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/markmap-toolbar@0.18.12/dist/style.css"> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.18/dist/katex.min.css"> </head> <body> <div id="container"> <div class="input-container"> <h2>Markdown 输入</h2> <textarea id="markdown-input" class="markdown-input"> # Java 编程知识体系 ## 核心概念 - **数据类型** - 基本类型 - 引用类型 - **控制结构** - 条件语句 - 循环语句 ## 高级特性 - **并发编程** - 线程 - 锁机制 - **内存管理** - 垃圾回收 - 内存模型 ## 常用框架 ```java public class Main { public static void main(String[] args) { System.out.println("Hello, World!"); } } ``` ### 数学公式 二次方程求根公式: $x = {-b \pm \sqrt{b^2-4ac} \over 2a}$ </textarea> <button id="generate-btn" class="btn">生成思维导图</button> </div> <div id="toolbar"> <h2>Markdown 思维导图</h2> <div> <button class="btn" id="zoom-in">放大</button> <button class="btn" id="zoom-out">缩小</button> <button class="btn" id="reset">重置</button> <button class="btn" id="toggle-dark">暗色模式</button> </div> </div> <svg id="mindmap"></svg> </div> <script src="https://cdn.jsdelivr.net/npm/d3@7.9.0/dist/d3.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/markmap-view@0.18.12/dist/browser/index.js"></script> <script src="https://cdn.jsdelivr.net/npm/markmap-toolbar@0.18.12/dist/index.js"></script> <script> // 初始化变量 let markmapInstance; let toolbarInstance; // 初始化思维导图 function initMarkmap(markdownContent) { // 清除现有的思维导图 d3.select('#mindmap').selectAll('*').remove(); try { // 解析 Markdown 为结构化数据 const { root } = markmap.transform.parse(markdownContent); // 创建 SVG 容器 const svg = d3.select('#mindmap').append('svg'); // 设置尺寸 const container = document.getElementById('mindmap'); svg.attr('width', container.clientWidth) .attr('height', container.clientHeight); // 创建 Markmap 实例 markmapInstance = markmap.Markmap.create(svg.node(), { color: ['#3498db', '#2ecc71', '#e74c3c', '#f39c12'], nodeMinHeight: 24, spacingVertical: 8, paddingX: 10, duration: 500, maxWidth: 300, zoom: true }, root); // 添加工具栏 if (!toolbarInstance) { toolbarInstance = new markmap.Toolbar(); toolbarInstance.attach(markmapInstance); const toolbarElement = toolbarInstance.render(); toolbarElement.style.position = 'absolute'; toolbarElement.style.top = '10px'; toolbarElement.style.right = '10px'; document.getElementById('toolbar').appendChild(toolbarElement); } // 添加窗口大小调整事件 window.addEventListener('resize', () => { svg.attr('width', container.clientWidth) .attr('height', container.clientHeight); markmapInstance.fit(); }); // 添加节点点击事件 svg.on('click', 'g', function(event, d) { console.log('节点点击:', d.data.content); // 自定义节点点击逻辑 }); } catch (error) { console.error('思维导图创建失败:', error); alert('思维导图创建失败: ' + error.message); } } // 切换暗色模式 function toggleDarkMode() { document.documentElement.classList.toggle('markmap-dark'); } // 初始化页面 document.addEventListener('DOMContentLoaded', () => { // 初始生成思维导图 const initialContent = document.getElementById('markdown-input').value; initMarkmap(initialContent); // 绑定事件 document.getElementById('generate-btn').addEventListener('click', () => { const content = document.getElementById('markdown-input').value; initMarkmap(content); }); document.getElementById('zoom-in').addEventListener('click', () => { if (markmapInstance) markmapInstance.zoom(1.2); }); document.getElementById('zoom-out').addEventListener('click', () => { if (markmapInstance) markmapInstance.zoom(0.8); }); document.getElementById('reset').addEventListener('click', () => { if (markmapInstance) { markmapInstance.fit(); markmapInstance.zoom(1); } }); document.getElementById('toggle-dark').addEventListener('click', toggleDarkMode); // 检测系统暗色模式偏好 if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { document.documentElement.classList.add('markmap-dark'); } }); </script> <!-- KaTeX 字体加载 --> <script> window.WebFontConfig = { custom: { families: ["KaTeX_AMS", "KaTeX_Caligraphic:n4,n7", "KaTeX_Fraktur:n4,n7", "KaTeX_Main:n4,n7,i4,i7", "KaTeX_Math:i4,i7", "KaTeX_Script", "KaTeX_SansSerif:n4,n7,i4", "KaTeX_Size1", "KaTeX_Size2", "KaTeX_Size3", "KaTeX_Size4", "KaTeX_Typewriter"], active: () => { if (window.markmap && markmapInstance) { markmapInstance.refreshHook.call(); } } } }; </script> <script src="https://cdn.jsdelivr.net/npm/webfontloader@1.6.28/webfontloader.js" defer></script> </body> </html> ``` ## 关键功能解析 ### 1. Markdown 解析与转换 ```javascript // 解析 Markdown 为结构化数据 const { root } = markmap.transform.parse(markdownContent); ``` ### 2. 思维导图初始化 ```javascript // 创建 Markmap 实例 markmapInstance = markmap.Markmap.create(svg.node(), { color: ['#3498db', '#2ecc71', '#e74c3c', '#f39c12'], nodeMinHeight: 24, spacingVertical: 8, paddingX: 10, duration: 500, maxWidth: 300, zoom: true }, root); ``` ### 3. 工具栏集成 ```javascript // 添加工具栏 toolbarInstance = new markmap.Toolbar(); toolbarInstance.attach(markmapInstance); const toolbarElement = toolbarInstance.render(); ``` ### 4. 响应式设计 ```javascript // 窗口大小调整处理 window.addEventListener('resize', () => { svg.attr('width', container.clientWidth) .attr('height', container.clientHeight); markmapInstance.fit(); }); ``` ### 5. 暗色模式支持 ```javascript // 切换暗色模式 function toggleDarkMode() { document.documentElement.classList.toggle('markmap-dark'); } // 系统偏好检测 if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { document.documentElement.classList.add('markmap-dark'); } ``` ### 6. Markdown 输入与实时生成 ```html <textarea id="markdown-input" class="markdown-input">...</textarea> <button id="generate-btn" class="btn">生成思维导图</button> ``` ```javascript document.getElementById('generate-btn').addEventListener('click', () => { const content = document.getElementById('markdown-input').value; initMarkmap(content); }); ``` ## 支持的功能特性 1. **完整的 Markdown 支持**: - 标题层级(H1-H6) - 列表(有序/无序) - 代码块(支持语法高亮) - 表格 - 数学公式(KaTeX) - 内联样式(粗体、斜体、删除线等) 2. **交互功能**: - 缩放控制(放大/缩小/重置) - 节点展开/折叠 - 暗色/亮色模式切换 - 工具栏操作(导出、视图控制等) 3. **响应式设计**: - 自动适应窗口大小 - 移动设备友好 4. **高级特性**: - 自动检测系统暗色模式 - 节点点击事件处理 - 动态内容更新 ## 使用示例 在文本区域输入 Markdown 内容: ```markdown # 项目计划 ## 阶段一 - 需求分析 - 原型设计 ## 阶段二 - 开发实现 - 测试验证 ``` 点击"生成思维导图"按钮,即可将 Markdown 转换为交互式思维导图
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值