cherry-markdown开源markdown组件详细使用教程

文章目录

前言

博主介绍:✌目前全网粉丝3W+,csdn博客专家、Java领域优质创作者,博客之星、阿里云平台优质作者、专注于Java后端技术领域。

涵盖技术内容:Java后端、大数据、算法、分布式微服务、中间件、前端、运维等。

博主所有博客文件目录索引:博客目录索引(持续更新)

视频平台:b站-Coder长路


开发定位

个人开源项目https://gitee.com/changluJava/studio-vue,位于开发分支:feat_1.2.x_fsstudio,提交哈希码:9fff82c76f5a02e0977455fe53d2c560ca4c0ca7


目标

支持cherry markdown语法编辑博文


调研

Quill富文本编辑器

CherryMarkdown (推荐):https://github.com/Tencent/cherry-markdown

  • 推荐

Tinymce富文本编辑器:

可学习案例:ruo-yi-vue-blog:https://gitee.com/Ning310975876/ruo-yi-vue-blog


技术方案

前提

将studio-ui改造为studio-ui-vite为vite版本,引入cherry-markdown没有报错问题。


工作量安排

改造studio_think表

改造studio_race表

改造studio_ccie表


数据库表设计

针对有包含文本内容编辑的都额外支持一个字段:content_markdown

  • 主要包含两个字段存储博文内容:content(博客文章html)、contentMarkdown(博客文章markdown格式内容)

包含有存储内容形式的表如下

studio_ccie:证书表

复制代码
原字段:ccie_think

studio_race:竞赛表

shell 复制代码
原字段:race_summarize

studio_think:个人思考表

复制代码
原字段:content

改造后:
content
content_markdown

实现步骤

1、引入依赖

package.json添加依赖:

shell 复制代码
"cherry-markdown": "0.8.22"

安装依赖:

shell 复制代码
npm install --force

2、实现cherry-markdown的vue组件(修改上传接口路径)

在components目录下添加cherry-markdown组件:

修改该组件的上传图片地址:

js 复制代码
import commonConfig from "@/api/common.js";

// 图片上传路径修改为自己连接
request.open('POST', commonConfig.uploadAction) // 上传的图片服务器地址

修改上传资源之后的markdown语法:

js 复制代码
if (resp.code === 200) {
  if (/mp4|avi|rmvb/i.test(resp.fileSuffix)) {
    imgMdStr = `!video[${resp.data.originName}](${resp.data.visitUrl})`;
  } else if (/mp3/i.test(resp.fileSuffix)) {
    imgMdStr = `!audio[${resp.data.originName}](${resp.data.visitUrl})`;
  } else if (/bmp|gif|jpg|jpeg|png/i.test(resp.fileSuffix)) {
    imgMdStr = `![${resp.data.originName}](${resp.data.visitUrl})`
  } else {
    imgMdStr = `![${resp.data.originName}](${resp.data.visitUrl})`
  }
}

3、支持draw.io组件

支持引入draw.io:引入该drawio目录

效果展示:

实际打开的时候访问的就是我们对应的public下的目录:


4、支持展示悬浮目录toc

原始:

js 复制代码
toc: {
  /** 默认只渲染一个目录 */
  allowMultiToc: false
},

修改后:

js 复制代码
toc: {
  updateLocationHash: true, // 要不要更新URL的hash
  defaultModel: 'pure', // pure: 精简模式/缩略模式,只有一排小点; full: 完整模式,会展示所有标题
},

前端使用:编辑状态使用cherry-markdown的vue组件

使用方式如下:

js 复制代码
<CherryMarkdown ref="CherryMarkdown" :height='400' v-model='blogText.contentMarkdown' ></CherryMarkdown>

import CherryMarkdown from '@/components/CherryMarkdown'

    components: {
      CherryMarkdown
    },
    data() {
      return {
        // 博客内容
        blogText: {
          contentMarkdown: '',
          content: ''
        }
      }
    },
    methods: {
      submitForm() {
        	this.setFormContent()
        	console.log("submitForm=>", this.blogText)
      },
      // 对于markdown的html需要调用对应markdown组件中的getCherryHtml()方法
      setFormContent(){
        this.blogText.content = this.$refs.CherryMarkdown.getCherryHtml()
      },
    }

最终效果演示:

关注这两个内容即可,分别一个是html内容,另一个是markdown内容:


前端使用:展示markdown(对外展示)

代码如下 :这里若是仅仅只需要预览,添加该属性即可:defaultModel="'previewOnly'"

shell 复制代码
<CherryMarkdown v-if="previewOpen" v-model='curThinkMarkdown' :defaultModel="'previewOnly'"></CherryMarkdown>

import CherryMarkdown from '@/components/CherryMarkdown'

    components: {
      CherryMarkdown
    },

效果:


问题解决

问题1:cherrymarkdown不随对应的markdown加载最新的

**场景:**例如编辑打开了一个markdown,此时又编辑打开另一个markdown,此时依旧是原先的markdown内容。

修复方式:

在cherrymarkdown组件中添加watch:

js 复制代码
    watch: {
      // 监控 value 属性
      value(newValue, oldValue) {
        // 当 value 发生变化时,这个函数会被调用
        // console.log(`value changed from ${oldValue} to ${newValue}`);
        this.setMarkdown(newValue)
      }
    },  

问题2:在一个vue文件中使用了两次cherrymarkdown组件,打开一个之后,另一个位置打开时就会出现空情况

**场景:**首先打开预览总结的,然后打开添加或编辑的,此时就会为空

解决方案:

在对应的对框中的组件里分别加上v-if随着预览对话框的是否展示而统一进行变动:

此时即可解决该问题。


问题3:cherry-markdown中支持虚拟目录toc

问题描述:

按照网站的配置参数:https://blog.csdn.net/weixin_73480865/article/details/136604029,发现不生效

问题解决:

首先确认你的cherry版本,我一开始是0.8.22,可以找到node_module中对应cherry-markdown的config.js,在配置文件中看是否支持这个toc,若是有下面的配置项就是支持的:

关于cherry团队在github解决的issue:

最终经过验证补充的toc配置方式:

js 复制代码
toc: true, // 不展示悬浮目录
toc: {
  updateLocationHash: false, // 要不要更新URL的hash
  defaultModel: 'full', // pure: 精简模式/缩略模式,只有一排小点; full: 完整模式,会展示所有标题
  showAutoNumber: false, // 是否显示自增序号
  position: 'fixed', // 悬浮目录的悬浮方式。当滚动条在cherry内部时,用absolute;当滚动条在cherry外部时,用fixed
  cssText: '', // 自定义样式
},

此时右侧出现了toc悬浮目录:


整理者:长路 时间:2024.9.7-9.21

相关推荐
来杯@Java1 天前
学生选课管理系统(基于springboot+vue前后端分离的项目)计算机毕业设计java
java·spring boot·spring·vue·毕业设计·maven·mybatis
医疗信息化王工1 天前
医院自律端系统——预警处置模块全栈实战(ASP.NET Core + Vue3 + Quartz 定时调度)
mysql·postgresql·vue·asp.net core·quartz
大大杰哥2 天前
Vue2学习(1)--了解基本方法与概念
javascript·学习·vue
Agatha方艺璇2 天前
前端开发技术复习笔记
vue·bootstrap·css3·html5·web
小葛要努力3 天前
创建vue2项目
程序人生·vue
七仔啊3 天前
基于海康门禁的人员计数系统
vue
步十人4 天前
【Vue3】前置知识简单概述(包括ES6核心语法,模块化ESM以及npm基础)
arcgis·npm·vue·es6
有梦想的程序星空4 天前
【环境配置】Vue3项目离线化本地部署echarts全攻略
前端·javascript·vue·echarts
向日的葵0065 天前
vue路由(二)
前端·javascript·vue.js·vue
小妖6665 天前
Hydration completed but contains mismatches
javascript·vue·vuepress