Markdown编辑器editor.md的使用

使用editor.md踩坑血泪史总结 当我们的项目需要引入一个功能强大的markdown编辑器,我们兴许会考虑使用当今比较主流的markdown编辑器:editor.md,最重要的是它完全开源,免费。 这是它的官方地址:https://pandao.github.io/editor.md/ 然而这个编辑器并不是拿来即用的,引入的时候可能会遇到一些棘手的问题和莫名其妙的错误,而且这些错误在网上百度却很难快速找到行之有效的解决方案。 写在前面 首先要注意的是,editor.md是依赖于 jQuery 的,所以必须先引入 jQuery 文件(或 j 阅读详情

一、Markdown和editor.md简介:


Markdown在技术圈里(估计更多是程序猿吧)越来越流行。简单的语法,统一的格式,使用过程中,手基本上不用从键盘上移到鼠标上去,超级方便。写好了一篇md文档(也就是含Markdown语法格式的普通TXT文件),可以随意放到别的支持Markdown格式的网站上发布。

editor.md是国内开源的一款在线Markdown编辑器,单纯基于前端JavaScript实现,和后端什么语言无关。这个还可以画流程图,以及数学公式。官网Demo示例使用的是PHP语言,我后端使用的是Java,Springmvc。

如下记录我在个人开源项目17Smart中使用的方法和过程。17Smart源码目前托管在Github上,感兴趣的可以参考了解。


二、editor.md的使用:


2.1、下载:

我们可以从其官网中找到下载最新版V1.5.0,解压资源包如下图:
这里写图片描述

  • >1.examples文件中是使用PHP做的所有示例(可以在文档编辑器里打开,并查看源代码);
  • >2.lib中是editor.md所依赖的第三方js资源;
  • >3.plugins中是如emoji表情支持、代码格式化等插件;

2.2、简单使用:

将上面的解压的editormd资源文件拷贝(选取需要的)到我们的项目适合目录下面。

2.2.1、在自己的页面上引入相关的css和js,代码如下:
<link rel="stylesheet"href="/smart-api/htdocs/mdeditor/css/editormd.css" />

<script src="/smart-api/htdocs/mdeditor/js/jquery.min.js"></script>
<script src="/smart-api/htdocs/mdeditor/js/editormd.min.js"></script>
2.2.2、在自己的页面中加上DIV:

DIV的id为my-editormd(这个div在form表单中)。DIV中包含二个textarea,其实官方demo中只有一个,第二个是否方便我们POST提交时,后端可以获取到md文档内容,如java中request.getParameter("my-editormd-html-code")。

<div id="my-editormd" >
<textarea id="my-editormd-markdown-doc" name="my-editormd-markdown-doc" style="display:none;"></textarea>
<!-- 注意:name属性的值-->
<textarea id="my-editormd-html-code" name="my-editormd-html-code" style="display:none;"></textarea>
</div>

这里值得注意两点:

  • >1.后端要想获得第二个textarea中的值,首先需要打开editor.md的saveHTMLToTextarea : true设置(见下面);
  • >2.textarea中name属性值,应该跟着div的IDmy-editormd值来定,即$-html-code(刚开始,后端死活获取不到值,翻看了源码才知道)
2.2.3、在同页面中再加上如下JS代码:
<script type="text/javascript">
  $(function() {
      editormd("my-editormd", {//注意1:这里的就是上面的DIV的id属性值
          width   : "90%",
          height  : 640,
          syncScrolling : "single",
          path    : "/smart-api/htdocs/mdeditor/lib/",//注意2:你的路径
          saveHTMLToTextarea : true//注意3:这个配置,方便post提交表单
      });
  });
</script>

这里值得注意三点:

  • >1.注意1:这里的就是上面的DIV的id属性值;
  • >2.注意2:你的path路径(原资源文件中lib包在我们项目中所放的位置);
  • >3.注意3:saveHTMLToTextarea 设置true或false关乎后端是否可以获取到值;

这样我们就完成了一个最简单的editor.md的编辑器了,我们可以在这里面书写自己熟悉的Markdown文档,包括代码,右侧有实时预览。

2.3、上传图片:

上面最简单的editor.md的编辑器,目前还是不可以上传图片的。我们需要略作配置修改,还是很简单的。

我们都知道在编写Markdown文档时,图片语法是![说明](url地址)。可是,往往我们需要上传本地图片。在上面的基础之上,略做如下修改即可(当然后端的代码得自己写):

<script type="text/javascript">
  $(function() {
      editormd("my-editormd", {//注意1:这里的就是上面的DIV的id属性值
          width   : "90%",
          height  : 640,
          syncScrolling : "single",
          path    : "/smart-api/htdocs/mdeditor/lib/",//注意2:你的路径
          saveHTMLToTextarea : true,//注意3:这个配置,方便post提交表单

         /**上传图片相关配置如下*/
         imageUpload : true,
         imageFormats : ["jpg", "jpeg", "gif", "png", "bmp", "webp"],
         imageUploadURL : "/smart-api/upload/editormdPic/",//注意你后端的上传图片服务地址
      });
  });
</script>

注意:editor.md期望你上传图片的服务返回如下json格式的内容

{
    success : 0 | 1, //0表示上传失败;1表示上传成功
    message : "提示的信息",
    url     : "图片地址" //上传成功时才返回
}

我的后台使用的是springmvc,代码如下:
(注意:@RequestParam(value = "editormd-image-file", required = true注解)

@RequestMapping("editormdPic")
@ResponseBody
public JSONObject editormdPic (@RequestParam(value = "editormd-image-file", required = true) MultipartFile file, HttpServletRequest request,HttpServletResponse response) throws Exception{

        String trueFileName = file.getOriginalFilename();  

        String suffix = trueFileName.substring(trueFileName.lastIndexOf("."));

        String fileName = System.currentTimeMillis()+"_"+CommonUtils.getRandomNumber(100, 999)+suffix;  

        String path = request.getSession().getServletContext().getRealPath("/assets/msg/upload/");
        System.out.println(path);  

        File targetFile = new File(path, fileName);  
        if(!targetFile.exists()){  
           targetFile.mkdirs();  
        }  

       //保存  
        try {  
           file.transferTo(targetFile);  
        } catch (Exception e) {  
           e.printStackTrace();  
        }  


        JSONObject res = new JSONObject();
        res.put("url", Constant.WEB_ROOT+"assets/msg/upload/"+fileName);
        res.put("success", 1);
        res.put("message", "upload success!");

        return res;

    }

2.4、Markdown文档页面展示:

上面我们通过post提交,后端获取到MD文档内容后,往往存在数据库中,然后在页面展示时,我们需要把MD语法文档,转换为HTML语法(也可以先转换为标准的HTML存储,但我觉得先转换的话,会占用较多存储空间)。

首先引入必要JS(下面不是所有必要):

<script src="/smart-api/htdocs/mdeditor/js/jquery.min.js"></script>
<script src="/smart-api/htdocs/mdeditor/lib/marked.min.js"></script>
<script src="/smart-api/htdocs/mdeditor/lib/prettify.min.js"></script>
<script src="/smart-api/htdocs/mdeditor/lib/raphael.min.js"></script>
<script src="/smart-api/htdocs/mdeditor/lib/underscore.min.js"></script>
<script src="/smart-api/htdocs/mdeditor/lib/sequence-diagram.min.js"></script>
<script src="/smart-api/htdocs/mdeditor/lib/flowchart.min.js"></script>
<script src="/smart-api/htdocs/mdeditor/lib/jquery.flowchart.min.js"></script>
<script src="/smart-api/htdocs/mdeditor/js/editormd.min.js"></script>

然后,本页面中,加入如下DIV:

<div id="doc-content">
    <textarea style="display:none;">${message.detail }</textarea>
</div>

最后,再引入如下JS代码:

<script type="text/javascript">
    var testEditor;
    $(function () {
        testEditor = editormd.markdownToHTML("doc-content", {//注意:这里是上面DIV的id
            htmlDecode: "style,script,iframe",
            emoji: true,
            taskList: true,
            tex: true, // 默认不解析
            flowChart: true, // 默认不解析
            sequenceDiagram: true, // 默认不解析
            codeFold: true,
    });});
 </script>

三、editor.md的更多配置项:


这配置,可以根据官方提供的Demo和源码找到(editor.md-master/examples目录下面)。如,主题颜色设置;上传图片后的特殊处理等。

    <script type="text/javascript">
            var myEditor;

            $(function() {
                myEditor = editormd("my-editormd", {
                    width   : "90%",
                    height  : 800,
                    syncScrolling : "single",
                    path    : "/smart-api/htdocs/mdeditor/lib/",
                    saveHTMLToTextarea : true,

                    emoji: true,//emoji表情,默认关闭
                    taskList: true,
                    tocm: true, // Using [TOCM]
                    tex: true,// 开启科学公式TeX语言支持,默认关闭

                    flowChart: true,//开启流程图支持,默认关闭
                    sequenceDiagram: true,//开启时序/序列图支持,默认关闭,

                    dialogLockScreen : false,//设置弹出层对话框不锁屏,全局通用,默认为true
                    dialogShowMask : false,//设置弹出层对话框显示透明遮罩层,全局通用,默认为true
                    dialogDraggable : false,//设置弹出层对话框不可拖动,全局通用,默认为true
                    dialogMaskOpacity : 0.4, //设置透明遮罩层的透明度,全局通用,默认值为0.1
                    dialogMaskBgColor : "#000",//设置透明遮罩层的背景颜色,全局通用,默认为#fff

                    codeFold: true,

                    imageUpload : true,
                    imageFormats : ["jpg", "jpeg", "gif", "png", "bmp", "webp"],
                    imageUploadURL : "/smart-api/upload/editormdPic/",

                    /*上传图片成功后可以做一些自己的处理*/
                    onload: function () {
                        //console.log('onload', this);
                        //this.fullscreen();
                        //this.unwatch();
                        //this.watch().fullscreen();
                        //this.width("100%");
                        //this.height(480);
                        //this.resize("100%", 640);
                    },

                    /**设置主题颜色*/
                    editorTheme: "pastel-on-dark",
                    theme: "gray",
                    previewTheme: "dark"
                });

            });
        </script>

四、网站&源码:


项目中使用markdown-editor-django版 Markdown编辑器是一种用于编写和格式化文本的工具,支持Markdown语法,能够轻松地将简单的文本转化为格式化的内容。:Markdown使用简单的符号和语法,使得用户可以快速上手。例如,使用表示标题,或表示列表。:许多Markdown编辑器提供实时预览功能,允许用户在编写时看到格式化后的效果。:Markdown支持标题、段落、链接、图片、表格、代码块等多种格式,适合各种文档需求。:大多数Markdown编辑器可以在网页、桌面和移动设备上使用,方便用户随时随地编辑内容。 阅读详情

相关推荐

javaweb项目集成editor.md编辑器---markdown编辑器

最近写一个博客系统,需要集成编辑器,所以我就打算集成一个markdown编辑器用来编辑文章。在网上搜,好像editor.md这个国产开源的markdown编辑器比较好。不过想吐槽是网上的教程真的。。。哈哈哈,开始我们的教程: 1.首先在editor.md官网(http://pandao.github.io/editor.md/)下载这一个编辑器。 这是下载好后的文件目录 2.将目录下的css目

qq_36157439的博客 6084

富文本编辑器Editor.md入门

Editor.md入门 一、富文本编辑器介绍 什么是富文本编辑器? 我们平时在博客园,或者优快云等平台进行写作的时候,他们的编辑器就是富文本编辑器。 其实这个就是富文本编辑器,市面上有许多非常成熟的富文本编辑器。这个文章有很多介绍https://blog.csdn.net/davidhzq/article/details/100815332想了解的小伙伴可以看一下这里就不一一列举了。 下面进入我们的主题Editor.md 二、Editor.md介绍 Editor.md——功能非常丰富的编辑器,左端编辑,右

Mr.zhao的博客 1万+

Markdown 编辑器 Editor.md 图片上传使用

目录一、Markdown 编辑器 Editor.md 使用二、上传图片1、[查看官方Demo](http://editor.md.ipandao.com/examples/image-upload.html)2、初始化时加3个参数配置3、数据返回格式 Json格式三、注意四、editor.md显示编辑框及图片上传心得(非常详细) 一、Markdown 编辑器 Editor.md 使用 Markdo...

夏已微凉、 2672

markdown编辑器之editormd使用

文章目录不啰嗦看效果1. editor.md简介2. 项目整合3. 图片上传处理4. 前台展示editormd数据5. 项目源码6.联系我 不啰嗦看效果 如果觉得对你项目有用请继续深入。 1. editor.md简介 1.1 说明 Editor.md 是一款开源的、可嵌入的 Markdown 在线编辑器(组件),基于 CodeMirror、jQuery 和 Marked 构建。 ...

扣丁曼 3612

画个板子玩一玩STM32F030F4P6,也许是最便宜的32bit MCU

前言,什么是STM32F030F4P6 STM32目前最便宜的芯片之一应该就是这一块,STM32F030F4P6,这一个芯片没有USB,但是其他都有,引脚少,价格低廉,如果找不到原厂,可以买替代的国产芯片,性能也一样。 不管怎么样也是Cortex-M0,比8bit和16bit的性能都强,总的来说就是低价,引脚少,体积小的同时,还容易开发,有很多模拟输入可玩,还有SPI,硬件I2C等等 所以,这一款MCU真的是从理论来说又便宜又好用,非常适合把玩。 画个板,最小系统 STM32F030其..

arenascat的博客 2万+

如何把ORCAD 中的修改同步到PADS 中

Generate ECO file(*.eco),eco 文件的默然保存地址是在pads 的。ECO Files (*.eco),接着在文件中找到所生成的eco 文件,找到。再下来是产生eco 文件,先打开old_design.pcb,然后选择。PCB Design 前面的选项选中,意思把当前文件做为原始的比对。安装目录下(可修改eco 文件的保存目录),这里把eco 文件保存。接下来用新生成asc 文件的文件产生新的PCB 文件,新生成。不对新生成的pcb 做任何的修改,直接保存文件,这里把新文件。

智光工作室 993

富文本编辑器:editor.md

富文本编辑器 Editormd 简介 Editor.md——功能非常丰富的编辑器,左端编辑,右端预览,非常方便,完全免费 官网:https://pandao.github.io/editor.md/ 主要特征 支持“标准” Markdown / CommonMark 和 Github 风格的语法,也可变身为代码编辑器; 支持实时预览、图片(跨域)上传、预格式文本/代码/表格插入、代码折叠、搜索替换、只读模式、自定义样式主题和多语言语法高亮等功能; 支持 ToC 目录(Table o

qq_47750283的博客 3916

C51红外接收与发射控制及原理编码与解码

基于38khz的NEC协议红外发射简易电路图NEC协议产生红外光数据编码 0 1结合程序红外接收接收电路解码过程解码代码 红外发射 通过通过红外二极管发射红外光,三极管的状态来控制。 红外模块一般都是三个引脚,vcc,gnd,dat,通过控制dat口的来控制发射红外光。 简易电路图 将数据口连接到单片机的引脚为上,控制io口的电平状态,来控制三极管的导通状态,从而发射红外光。 NEC协议 NEC协议特点:8位地址和8位命令为提高可靠性,地址和命令都传输2次,脉冲间隔调制38kHz载波频率。 包含引导码,

yangfeng20的博客 1万+

基于JavaWeb的MarkDown编辑器editor.md的使用

editor.md 简介 editor.md是国内开发的开源项目,单纯基于前端JavaScript,可以实现markdown编辑器的所有功能。 主要特性 支持通用 Markdown / CommonMark 和 GFM (GitHub Flavored Markdown) 风格的语法,也可变身为代码编辑器; 支持实时预览、图片(跨域)上传、预格式文本/代码/表格插入、代码折叠、跳转到行、搜索替换...

哈 5383

Matlab安装硬件支持包、simulink离线安装硬件支持包安装,离线安装ESP32、stm32等安装包,Are you up-to-date on SoftWare Maintenance?

注意:如果提示出现“没有可从此位置安装的兼容支持包后,这个问题,请查看步骤5,是不是没有按照步骤5进行操作.一般情况下出现“没有可从此位置安装的兼容支持包”后,重新安装选择了默认路径就可以成功。如果不是很清楚,直接安装在默认的文件夹下面,即使这个文件夹下没有matlab相关的文件夹,也要这么下载,没有为什么,切记尽量按默认路径安装,更改下载的路径不成功,别怪我没提醒。:下载到哪里非常重要,如果下载的不是默认的路径下,就需要将其中这个的是这个archives文件夹,连同其他文件一并要复制出来,拷贝到。

pvmsmfchcs的博客 1746

Linux内核vmlinuz文件:了解和编程

vmlinuz文件是Linux操作系统中的内核镜像文件。它包含了Linux内核的压缩版本,用于引导和启动操作系统。vmlinuz文件通常是一个zImage格式的压缩内核镜像,其中包含了操作系统所需的核心功能和驱动程序。vmlinuz文件的名称可能会因Linux发行版和版本而有所不同,但它们的作用是相同的。在某些发行版中,vmlinuz文件可能被重命名为vmlinux或bzImage。

PixelDyno的博客 1351

Markdown编辑器——Editor.md的使用

最近在写一个个人博客项目,其中用到了一款开源的Markdown文本编辑器——Editor.md,记录一下将其集成到项目中的方法,以及踩的坑。 1. 从官网上下载源码 官网地址:Editor.md - 开源在线 Markdown 编辑器 最新版本: v1.5.0,更新于 2015-06-09 (已经很久没有更新版本了,但在项目中用的还是非常多的) 下载下来之后是一个压缩包,解压 2. 将需要的资源导入项目 创建一个Springboot项目,在resources/statics目录下创建一个

weixin_38083551的博客 7990

【第一章】核心思维:那个在此刻“消失”的 CPU

摘要:RTOS本质是"有状态的抢占"而非"多任务",单核MCU通过时间片分时复用实现任务切换。裸机编程的线性思维在RTOS中不再适用,开发者需接受代码随时被打断的现实。RTOS通过保存/恢复CPU寄存器组(上下文)实现任务切换,每个任务拥有独立栈空间。非原子操作(如全局变量自增)会导致竞态条件,必须使用临界区或互斥锁保护。RTOS编程需要建立并发思维,关注代码原子性、可重入性和栈空间分配。

一路往蓝-Anbo 的博客 105

13.6K星开源可嵌入式Markdown在线编辑器Editor.md

简化内容创作,让Markdown在网页上绽放

2401_83063795的博客 2046

【异常】Antigravity IDE 登录异常与网络连接错误排查指南

在使用 Google 推出的 AI 原生 IDE时,部分用户可能会遇到身份验证失效与网络环境冲突导致的叠加错误。本文将针对此类典型故障提供完整的解决思路。

奶爸的编程之路,也就一周冷个三天 1721

将GroundDINO、EdgeMTAM和FoundationPose的ONNX模型转换为TensorRT格式并部署到NVIDIA Jetson Orin平台的完整技术指南

TensorRT模型部署指南:从ONNX到Jetson Orin的优化实践 本文详细介绍了将GroundDINO、EdgeMTAM和FoundationPose模型从ONNX格式转换为TensorRT引擎并在Jetson Orin平台部署的全流程。主要内容包括: 环境配置:JetPack 5.1.2+环境搭建,TensorRT工具链安装,存储与交换空间优化 模型转换:动态尺寸处理、自定义算子实现、层融合策略及INT8量化校准 部署优化:引擎序列化加密、多模型并行推理架构设计、CUDA流异步执行 实战技巧。

huanghm88的专栏 438

md-editor开源!一款开箱即用的markdown编辑器

hi, 大家好, 我是徐小夕.之前一直在社区分享零代码&低代码的技术实践,也陆陆续续设计并开发了多款可视化搭建产品,比如:H5-Dooring(页面可视化搭建平台)V6.Dooring(可视化大屏搭建平台)Flowmix/Docx 多模态文档编辑器: 让文档不止于文档最近也一直在研究多模态文档+ AI相关的技术实践, 花了一天时间,做了一款可本地存储数据和文档管理的开源markdown...

趣谈前端 2461

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

一款好看的markdown编辑器:md-editor-v3

codeMirrorExtensions: 根据主题和内部默认的 codeMirror 扩展自定义新的扩展。监听编辑器内部状态,包括:屏幕全屏、浏览器全屏、预览文本、预览 html、目录等。编辑器暴露了若干方法在组件实例上,用来快捷监听编辑器内部状态或对调整内部状态。注意:粘贴板上传时,如果是网页上的 gif 图,无法正确上传为 gif 格式!editorExtensions: 类型如下,用于配置编辑器内部的扩展。以便生成的内部目录能够正确导航。使用示例:编辑器默认不显示输入框的行号,需要手动添加扩展。

pscool的博客 1万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

在HTML页面中引用Markdown编辑器(Editor.md)

在html页面中添加Editor.md

威威的博客 4968

Markdown编辑器--editor.md的用法

本文用实例介绍editor.md这款Markdown编辑器的用法。 此编辑器是最主流、最好用的markdown编辑器。

IT利刃出鞘的博客 854

Markdown 编辑器 editor.md插件的集成

https://pandao.github.io/editor.md/ 网站下载压缩包解压 1.首先可以在自己的静态页面新建一个文件夹来放编辑器插件所需的css可以所需的内容我的是放在lib下面的editormd下面,大家可以自己去复制出相应的文件 2.然后再需要打开上面压缩文件中的examples文件(这个是放实例的文件夹)找出simple.html在编辑工具中打开可以在我们的前端界面中仿照着...

booleangjh的博客 1085

Markdown 编辑器 Editor.md 使用

目录一、文档1、Editor.md官网2、常用Demo二、使用1、实例化2、[常用方法,更多方法可查看 完整示例 Full example http://editor.md.ipandao.com/examples/full.html](http://editor.md.ipandao.com/examples/full.html) 一、文档 1、Editor.md官网 1、Editor.md...

夏已微凉、 1600

【常用 JS 插件】Editor.md 实现 Markdown 编辑器

Editor.md Editor.md 是一个Markdown 编辑器,单纯基于前端 JavaScript,无需后台代码加持,适用于任何语言。 下载地址 http://pandao.github.io/editor.md/examples/ 从上面的地址下载 Editor.md 页面引用 CSS 部分 &amp;lt;link rel=&quot;stylesheet&quot; href=&quot;/static/admin...

Yuu 9825

Markdown 编辑器Editor.md简单集成

既然要集成,第一步就是找到来源,直接到官方网站下载依赖。 官方网站地址:https://pandao.github.io/editor.md/ 下载之后解压下载文件 要是用的依赖基本就是用红框标注出来的,将需要的依赖丢入自己项目中的resources目录下 找到文本输入框的html,开始引入...

chujuntu1211的博客 313

在网站中嵌入editor.md markdown编辑器以及CSS样式修改

欢迎访问我的个人博客查看显示效果: 点击跳转到hehung的博客查看显示效果 最近在网上查找markdown编辑器的时候,找到了一款比较好的编辑器 editor.md, 开源免费的。点我跳转到官网 官网也有使用教程,我这里主要是针对hexo上的使用,因为我们正在hexo上使用的是静态页面,所以只能用于对文章的编辑。如果是动态网站,还可以实现,文章的自动发布等功能。 特性 支持“标...

hehung的博客 4332

SpringBoot整合Editor.md实现Markdown编辑器

框架 SpringBoot1.x Markdown插件 Editor.md 持久层框架 SpringBootJPA 框架 SpringBoot2.x Markdown插件 Editor.md 持久层框架 SpringBootJPA 框架 SpringBoot2.x Markdown插件 Editor.md 持久层框架 Mybati...

Gblfy_Blog 1707
上一篇: How tomcat works——序言
下一篇: Java中Callable和Future——引子
易德军
博客等级 码龄19年 134粉丝 74原创
评论 13
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值