JeecgBoot富文本编辑器:Tinymce+Markdown双模式支持

JeecgBoot富文本编辑器:Tinymce+Markdown双模式支持

【免费下载链接】JeecgBoot 🔥企业级低代码平台集成了AI应用平台,帮助企业快速实现低代码开发和构建AI应用!前后端分离架构 SpringBoot,SpringCloud、Mybatis,Ant Design4、 Vue3.0、TS+vite!强大的代码生成器让前后端代码一键生成,无需写任何代码! 引领AI低代码开发模式: AI生成->OnlineCoding-> 代码生成-> 手工MERGE,显著的提高效率,又不失灵活~ 【免费下载链接】JeecgBoot 项目地址: https://gitcode.com/jeecgboot/JeecgBoot

在企业级应用开发中,富文本编辑器是不可或缺的核心组件。JeecgBoot作为一款优秀的企业级低代码平台,提供了Tinymce和Markdown双模式富文本编辑器支持,满足不同场景下的内容编辑需求。本文将深入解析这两种编辑器的实现原理、使用方法和最佳实践。

双模式编辑器架构设计

JeecgBoot采用模块化设计思想,将富文本编辑器封装为独立的Vue组件,支持按需引入和灵活配置。

架构流程图

mermaid

Tinymce富文本编辑器

核心特性

Tinymce是一款功能强大的WYSIWYG(所见即所得)编辑器,JeecgBoot对其进行了深度定制和优化:

  • 多语言支持:内置中文、英文等多语言包
  • 暗黑主题适配:自动跟随系统主题切换
  • 图片上传集成:无缝对接平台文件服务
  • 插件系统:支持丰富的功能扩展

配置示例

// Tinymce基础配置
const initOptions = {
  height: 400,
  width: 'auto',
  language: 'zh_CN',
  branding: false,
  menubar: false,
  plugins: ['fullscreen', 'link', 'lists', 'preview', 'image'],
  toolbar: 'undo redo | formatselect | bold italic | alignleft aligncenter alignright | bullist numlist outdent indent | link image',
  images_upload_handler: (blobInfo, progress) => {
    // 自定义图片上传处理
    return new Promise((resolve, reject) => {
      const formData = new FormData();
      formData.append('file', blobInfo.blob(), blobInfo.filename());
      
      uploadFile(formData).then(res => {
        if (res.success) {
          resolve(getFileAccessHttpUrl(res.message));
        } else {
          reject('上传失败');
        }
      });
    });
  }
};

功能对比表

功能特性TinymceMarkdown适用场景
编辑模式WYSIWYG源码编辑内容创作
学习曲线简单中等技术文档
格式化可视化语法标记富文本内容
代码支持有限原生支持技术文章
图片处理拖拽上传链接插入多媒体内容
表格编辑可视化语法标记数据展示

Markdown编辑器实现

Vditor集成方案

JeecgBoot采用Vditor作为Markdown编辑器核心,提供专业的Markdown编辑体验:

// Vditor配置示例
const vditorConfig = {
  theme: 'classic',
  lang: 'zh_CN',
  mode: 'sv',
  toolbar: [
    'emoji', 'headings', 'bold', 'italic', 'strike', 'link',
    '|', 'list', 'ordered-list', 'check', 'outdent', 'indent',
    '|', 'quote', 'line', 'code', 'inline-code',
    '|', 'upload', 'table', '|', 'undo', 'redo',
    '|', 'fullscreen', 'edit-mode', 'more'
  ],
  upload: {
    accept: 'image/*',
    fieldName: 'file',
    extraData: { biz: 'markdown' },
    handler: async (files) => {
      for (const file of files) {
        await uploadFile({
          file: file,
          filename: file.name,
          data: { biz: 'markdown' }
        });
      }
    }
  }
};

Markdown语法支持

语法元素示例渲染结果
标题# H1 ## H2一级/二级标题
粗体**粗体**粗体文字
斜体*斜体*斜体文字
链接[文本](URL)可点击链接
图片![alt](URL)嵌入图片
代码块代码语法高亮
表格\|列1\|列2\|结构化表格

双模式切换实现

组件封装策略

JeecgBoot通过统一的组件接口封装两种编辑器:

<template>
  <div class="editor-container">
    <div class="editor-mode-switch">
      <a-radio-group v-model:value="editorMode">
        <a-radio-button value="tinymce">富文本模式</a-radio-button>
        <a-radio-button value="markdown">Markdown模式</a-radio-button>
      </a-radio-group>
    </div>
    
    <div class="editor-content">
      <Tinymce
        v-if="editorMode === 'tinymce'"
        v-model:value="content"
        :height="400"
        @change="handleContentChange"
      />
      
      <JMarkdownEditor
        v-else
        v-model:value="content"
        :height="400"
        @change="handleContentChange"
      />
    </div>
  </div>
</template>

<script>
import { Tinymce, JMarkdownEditor } from '@/components/Editor';
import { ref, watch } from 'vue';

export default {
  components: { Tinymce, JMarkdownEditor },
  props: {
    modelValue: String
  },
  emits: ['update:modelValue'],
  setup(props, { emit }) {
    const editorMode = ref('tinymce');
    const content = ref(props.modelValue || '');

    const handleContentChange = (value) => {
      content.value = value;
      emit('update:modelValue', value);
    };

    watch(() => props.modelValue, (newVal) => {
      content.value = newVal;
    });

    return { editorMode, content, handleContentChange };
  }
};
</script>

图片上传统一处理

后端接口设计

两种编辑器共享同一套图片上传机制:

// 文件上传控制器
@RestController
@RequestMapping("/sys/common")
public class CommonController {
    
    @PostMapping("/upload")
    public Result<?> upload(
        HttpServletRequest request,
        @RequestParam("file") MultipartFile file,
        @RequestParam(value = "biz", required = false) String biz) {
        
        // 根据biz参数区分上传目录
        String uploadPath = "upload";
        if ("markdown".equals(biz)) {
            uploadPath = "markdown";
        } else if ("jeditor".equals(biz)) {
            uploadPath = "jeditor";
        }
        
        // 文件上传处理逻辑
        String fileName = FileUtils.upload(file, uploadPath);
        return Result.OK(fileName);
    }
}

前端上传适配

// 统一的文件上传服务
export const uploadFile = (params, callback) => {
  const formData = new FormData();
  formData.append('file', params.file);
  formData.append('filename', params.filename);
  
  if (params.data) {
    Object.keys(params.data).forEach(key => {
      formData.append(key, params.data[key]);
    });
  }
  
  return request({
    url: '/sys/common/upload',
    method: 'post',
    data: formData,
    headers: { 'Content-Type': 'multipart/form-data' }
  }).then(callback);
};

性能优化实践

懒加载策略

// 编辑器组件懒加载
const Tinymce = defineAsyncComponent(() =>
  import('@/components/Tinymce').then(mod => mod.Tinymce)
);

const MarkdownEditor = defineAsyncComponent(() =>
  import('@/components/Markdown').then(mod => mod.MarkDown)
);

主题切换优化

// 暗黑主题适配
watch(
  () => theme.value,
  (newTheme) => {
    if (editorInstance.value) {
      if (editorType.value === 'tinymce') {
        editorInstance.value.setTheme(newTheme === 'dark' ? 'oxide-dark' : 'jeecg');
      } else {
        editorInstance.value.setTheme(newTheme === 'dark' ? 'dark' : 'classic');
      }
    }
  }
);

最佳实践指南

场景选择建议

  1. Tinymce适用场景

    • 需要复杂格式化的内容
    • 非技术用户的内容创作
    • 包含大量多媒体元素的内容
    • 企业公告、新闻发布等
  2. Markdown适用场景

    • 技术文档、API文档
    • 代码相关的教程文章
    • 需要版本控制的内容
    • 开发人员的技术博客

配置调优建议

// 生产环境优化配置
const getEditorConfig = (type) => {
  const baseConfig = {
    height: 500,
    width: '100%',
    branding: false,
    menubar: false
  };
  
  if (type === 'tinymce') {
    return {
      ...baseConfig,
      plugins: ['link', 'lists', 'image', 'preview'],
      toolbar: 'bold italic | alignleft aligncenter alignright | bullist numlist | link image preview'
    };
  } else {
    return {
      ...baseConfig,
      mode: 'sv',
      toolbar: ['headings', 'bold', 'italic', 'link', 'code', 'table']
    };
  }
};

总结与展望

JeecgBoot的双模式富文本编辑器解决方案为企业应用开发提供了灵活的内容编辑能力。通过Tinymce和Markdown的有机结合,既满足了普通用户的可视化编辑需求,又为技术人员提供了高效的Markdown写作体验。

未来发展方向包括:

  • AI辅助内容生成集成
  • 实时协作编辑功能
  • 更强大的模板系统
  • 深度集成知识管理

通过本文的详细解析,开发者可以充分理解JeecgBoot富文本编辑器的实现原理和使用方法,在实际项目中灵活运用双模式编辑器提升开发效率和用户体验。

【免费下载链接】JeecgBoot 🔥企业级低代码平台集成了AI应用平台,帮助企业快速实现低代码开发和构建AI应用!前后端分离架构 SpringBoot,SpringCloud、Mybatis,Ant Design4、 Vue3.0、TS+vite!强大的代码生成器让前后端代码一键生成,无需写任何代码! 引领AI低代码开发模式: AI生成->OnlineCoding-> 代码生成-> 手工MERGE,显著的提高效率,又不失灵活~ 【免费下载链接】JeecgBoot 项目地址: https://gitcode.com/jeecgboot/JeecgBoot

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值