vue-kindeditor 安装和解决问题

效果图

 kindeditor 引入

    一、去官网下载 kindeditor 包  官方链接

        

  二、在vue里的static文件夹下 创建一个 文件夹名字叫 kindeditor, 把下载好的文件放在这里

 三、在 公共组件 components 下 创建kindeditor.vue 文件

<template>
  <div class="kindeditor">
    <textarea :id="id" name="content">{{ outContent }}</textarea>
  </div>
</template>

<script>
export default {
  name: 'kindeditor',
  data () {
    return {
      editor: null,
      outContent: this.content
    }
  },
  props: {
    content: {
      type: String,
      default: ''
    },
    id: {
      type: String,
      required: true
    },
    width: {
      type: String
    },
    height: {
      type: String
    },
    minWidth: {
      type: Number,
      default: 650
    },
    minHeight: {
      type: Number,
      default: 100
    },
    items: {
      type: Array,
      default: function () {
        return [
          'source', '|', 'undo', 'redo', '|', 'preview', 'print', 'template', 'code', 'cut', 'copy', 'paste',
          'plainpaste', 'wordpaste', '|', 'justifyleft', 'justifycenter', 'justifyright',
          'justifyfull', 'insertorderedlist', 'insertunorderedlist', 'indent', 'outdent', 'subscript',
          'superscript', 'clearhtml', 'quickformat', 'selectall', '|', 'fullscreen', '/',
          'formatblock', 'fontname', 'fontsize', '|', 'forecolor', 'hilitecolor', 'bold',
          'italic', 'underline', 'strikethrough', 'lineheight', 'removeformat', '|', 'image', 'multiimage',
          'flash', 'media', 'insertfile', 'table', 'hr', 'emoticons', 'baidumap', 'pagebreak',
          'anchor', 'link', 'unlink', '|', 'about'
        ]
      }
    },
    noDisableItems: {
      type: Array,
      default: function () {
        return ['source', 'fullscreen']
      }
    },
    filterMode: {
      type: Boolean,
      default: true
    },
    htmlTags: {
      type: Object,
      default: function () {
        return {
          font: ['color', 'size', 'face', '.background-color'],
          span: ['style'],
          div: ['class', 'align', 'style'],
          table: ['class', 'border', 'cellspacing', 'cellpadding', 'width', 'height', 'align', 'style'],
          'td,th': ['class', 'align', 'valign', 'width', 'height', 'colspan', 'rowspan', 'bgcolor', 'style'],
          a: ['class', 'href', 'target', 'name', 'style'],
          embed: ['src', 'width', 'height', 'type', 'loop', 'autostart', 'quality',
            'style', 'align', 'allowscriptaccess', '/'],
          img: ['src', 'width', 'height', 'border', 'alt', 'title', 'align', 'style', '/'],
          hr: ['class', '/'],
          br: ['/'],
          'p,ol,ul,li,blockquote,h1,h2,h3,h4,h5,h6': ['align', 'style'],
          'tbody,tr,strong,b,sub,sup,em,i,u,strike': []
        }
      }
    },
    wellFormatMode: {
      type: Boolean,
      default: true
    },
    resizeType: {
      type: Number,
      default: 2
    },
    themeType: {
      type: String,
      default: 'default'
    },
    langType: {
      type: String,
      default: 'zh-CN'
    },
    designMode: {
      type: Boolean,
      default: true
    },
    fullscreenMode: {
      type: Boolean,
      default: false
    },
    basePath: {
      type: String
    },
    themesPath: {
      type: String
    },
    pluginsPath: {
      type: String,
      default: ''
    },
    langPath: {
      type: String
    },
    minChangeSize: {
      type: Number,
      default: 5
    },
    loadStyleMode: {
      type: Boolean,
      default: true
    },
    urlType: {
      type: String,
      default: ''
    },
    newlineTag: {
      type: String,
      default: 'p'
    },
    pasteType: {
      type: Number,
      default: 2
    },
    dialogAlignType: {
      type: String,
      default: 'page'
    },
    shadowMode: {
      type: Boolean,
      default: true
    },
    zIndex: {
      type: Number,
      default: 811213
    },
    useContextmenu: {
      type: Boolean,
      default: true
    },
    syncType: {
      type: String,
      default: 'form'
    },
    indentChar: {
      type: String,
      default: '\t'
    },
    cssPath: {
      type: [ String, Array ]
    },
    cssData: {
      type: String
    },
    bodyClass: {
      type: String,
      default: 'ke-content'
    },
    colorTable: {
      type: Array
    },
    afterCreate: {
      type: Function
    },
    afterChange: {
      type: Function
    },
    afterTab: {
      type: Function
    },
    afterFocus: {
      type: Function
    },
    afterBlur: {
      type: Function
    },
    afterUpload: {
      type: Function
    },
    uploadJson: {
      type: String
    },
    fileManagerJson: {
      type: Function
    },
    allowPreviewEmoticons: {
      type: Boolean,
      default: true
    },
    allowImageUpload: {
      type: Boolean,
      default: true
    },
    allowFlashUpload: {
      type: Boolean,
      default: true
    },
    allowMediaUpload: {
      type: Boolean,
      default: true
    },
    allowFileUpload: {
      type: Boolean,
      default: true
    },
    allowFileManager: {
      type: Boolean,
      default: false
    },
    fontSizeTable: {
      type: Array,
      default: function () {
        return ['9px', '10px', '12px', '14px', '16px', '18px', '24px', '32px']
      }
    },
    imageTabIndex: {
      type: Number,
      default: 0
    },
    formatUploadUrl: {
      type: Boolean,
      default: true
    },
    fullscreenShortcut: {
      type: Boolean,
      default: false
    },
    extraFileUploadParams: {
      type: Array,
      default: function () {
        return []
      }
    },
    filePostName: {
      type: String,
      default: 'imgFile'
    },
    fillDescAfterUploadImage: {
      type: Boolean,
      default: false
    },
    afterSelectFile: {
      type: Function
    },
    pagebreakHtml: {
      type: String,
      default: '<hr style=”page-break-after: always;” class=”ke-pagebreak” />'
    },
    allowImageRemote: {
      type: Boolean,
      default: true
    },
    autoHeightMode: {
      type: Boolean,
      default: false
    },
    fixToolBar: {
      type: Boolean,
      default: false
    },
    tabIndex: {
      type: Number
    }
  },
  watch: {
    content (val) {
      this.editor && val !== this.outContent && this.editor.html(val)
    },
    outContent (val) {
      this.$emit('update:content', val)
      this.$emit('on-content-change', val)
    }
  },
  mounted () {
    var _this = this
    _this.editor = window.KindEditor.create('#' + this.id, {
      width: _this.width,
      height: _this.height,
      minWidth: _this.minWidth,
      minHeight: _this.minHeight,
      items: _this.items,
      noDisableItems: _this.noDisableItems,
      filterMode: _this.filterMode,
      htmlTags: _this.htmlTags,
      wellFormatMode: _this.wellFormatMode,
      resizeType: _this.resizeType,
      themeType: _this.themeType,
      langType: _this.langType,
      designMode: _this.designMode,
      fullscreenMode: _this.fullscreenMode,
      basePath: _this.basePath,
      themesPath: _this.cssPath,
      pluginsPath: _this.pluginsPath,
      langPath: _this.langPath,
      minChangeSize: _this.minChangeSize,
      loadStyleMode: _this.loadStyleMode,
      urlType: _this.urlType,
      newlineTag: _this.newlineTag,
      pasteType: _this.pasteType,
      dialogAlignType: _this.dialogAlignType,
      shadowMode: _this.shadowMode,
      zIndex: _this.zIndex,
      useContextmenu: _this.useContextmenu,
      syncType: _this.syncType,
      indentChar: _this.indentChar,
      cssPath: _this.cssPath,
      cssData: _this.cssData,
      bodyClass: _this.bodyClass,
      colorTable: _this.colorTable,
      afterCreate: _this.afterCreate,
      afterChange: function () {
        _this.afterChange
        _this.outContent = this.html()
      },
      afterTab: _this.afterTab,
      afterFocus: _this.afterFocus,
      afterBlur: _this.afterBlur,
      afterUpload: _this.afterUpload,
      uploadJson: _this.uploadJson,
      fileManagerJson: _this.fileManagerJson,
      allowPreviewEmoticons: _this.allowPreviewEmoticons,
      allowImageUpload: _this.allowImageUpload,
      allowFlashUpload: _this.allowFlashUpload,
      allowMediaUpload: _this.allowMediaUpload,
      allowFileUpload: _this.allowFileUpload,
      allowFileManager: _this.allowFileManager,
      fontSizeTable: _this.fontSizeTable,
      imageTabIndex: _this.imageTabIndex,
      formatUploadUrl: _this.formatUploadUrl,
      fullscreenShortcut: _this.fullscreenShortcut,
      extraFileUploadParams: _this.extraFileUploadParams,
      filePostName: _this.filePostName,
      fillDescAfterUploadImage: _this.fillDescAfterUploadImage,
      afterSelectFile: _this.afterSelectFile,
      pagebreakHtml: _this.pagebreakHtml,
      allowImageRemote: _this.allowImageRemote,
      autoHeightMode: _this.autoHeightMode,
      fixToolBar: _this.fixToolBar,
      tabIndex: _this.tabIndex
    })
  }
}
</script>

<style>
  
</style>

四、在src文件里面创建文件夹名字叫 plugin  并在里面创建kindeditor.js 文件

import KindEditor from '../components/KindEditor'
const install = function (Vue) {
  if (install.installed) return
  install.installed = true
  Vue.component('editor', KindEditor)
}

export default install

五、然后在main.js里引入相关信息

import VueKindEditor from './plugin/kindeditor.js'
	import '../static/kindeditor/themes/default/default.css'
	import '../static/kindeditor/kindeditor-all.js'
	import '../static/kindeditor/lang/zh-CN.js'

六、然后就可以在组件中引入了

<template>
  <div class="table"> 
    <editor id="editor_id" height="500px" width="700px" :content.sync="editorText"
            :afterChange="afterChange()"
            pluginsPath="../../../static/kindeditor/plugins/"
            :loadStyleMode="false"
            @on-content-change="onContentChange"></editor>
    <div> editorTextCopy: {{ editorTextCopy }} </div>
  </div>
</template>

<script>
export default {
  name: 'table',
  data () {
    return {
      editorText: '直接初始化值', // 双向同步的变量
      editorTextCopy: ''  // content-change 事件回掉改变的对象
    }
  },
    methods: {
    onContentChange (val) {
      this.editorTextCopy = val;
      console.log(this.editorTextCopy)
    },
    afterChange () {
    }
  }
}
</script>

<style>

</style>


解决 kindeditor

一、 在光标位置插入内容

 const str = `<img src="${response}" style="max-width:100%"/>`

 // 这里就是插入光标位置了,因为在 KindEditor.vue 已经初始化了editor,所以我们可以直接使用 
    this.$refs.editor.editor.insertHtml(str)

二、在同一个组件下面使用两个富文本,导致其中有一个不生效

 - 在同一个文件,两个id 不能一直 id="editor_id",
 - 这里的同一个文件夹 包括 在子组件 或 el-dialog组件

三、kindeditor上传到服务器视频文件过大

  •    在**application.properties**加入以下配置即可
##视频上传大小
	spring.http.multipart.maxFileSize=50Mb
	spring.http.multipart.maxRequestSize=50Mb

四、kindeditor 自定义上传图片和视频

  •  在 公共组件 components 下 kindeditor.vue 文件修改
  •  this.$api.file.upload 和 oss.upload 是上传文件后端返回来 url 的方法
<template>
  <div class="kindeditor">
    <input
      accept=".png,.jpg,.gif"
      @change="pictureFileChange"
      type="file" ref="pictureFile" style="display: none">
    <input
      accept=".mp4"
      @change="videoFileChange"
      type="file" ref="videoFile" style="display: none">
    <textarea
      :id="id" name="content">{{ outContent }}</textarea>
  </div>
</template>

<script>
import oss from '@utils/oss'
export default {
  name: 'kindeditor',
  data () {
    return {
      editor: null,
      pictureData: {
        editor: null
      },
      videoData: {
        editor: null
      },
      outContent: this.content
    }
  },
  props: {
    content: {
      type: String,
      default: ''
    },
    id: {
      type: String,
      required: true
    },
    width: {
      type: String
    },
    height: {
      type: String
    },
    minWidth: {
      type: Number,
      default: 650
    },
    minHeight: {
      type: Number,
      default: 100
    },
    items: {
      type: Array,
      default: function () {
        return [
          'source',
          '|',
          'undo',
          'redo',
          '|',
          'preview',
          'code',
          'cut',
          'copy',
          'paste',
          'plainpaste',
          'wordpaste',
          '|',
          'justifyleft',
          'justifycenter',
          'justifyright',
          'justifyfull',
          'insertorderedlist',
          'insertunorderedlist',
          'indent',
          'outdent',
          'subscript',
          'superscript',
          'clearhtml',
          'quickformat',
          'selectall',
          '|',
          'fullscreen',
          '/',
          'formatblock',
          'fontname',
          'fontsize',
          '|',
          'forecolor',
          'hilitecolor',
          'bold',
          'italic',
          'underline',
          'strikethrough',
          'lineheight',
          'removeformat',
          '|',
          'insertfile',
          'table',
          'hr',
          'pagebreak',
          'anchor',
          'link',
          'unlink',
          '|',
          'about',
          'picture',
          'video'
        ]
      }
    },
    // , 'image', 'media'
    noDisableItems: {
      type: Array,
      default: function () {
        return ['source', 'fullscreen']
      }
    },
    filterMode: {
      type: Boolean,
      default: false
    },
    htmlTags: {
      type: Object,
      default: function () {
        return {
          font: ['color', 'size', 'face', '.background-color'],
          span: ['style'],
          div: ['class', 'align', 'style'],
          table: [
            'class',
            'border',
            'cellspacing',
            'cellpadding',
            'width',
            'height',
            'align',
            'style'
          ],
          'td,th': [
            'class',
            'align',
            'valign',
            'width',
            'height',
            'colspan',
            'rowspan',
            'bgcolor',
            'style'
          ],
          a: ['class', 'href', 'target', 'name', 'style'],
          embed: [
            'src',
            'width',
            'height',
            'type',
            'loop',
            'autostart',
            'quality',
            'style',
            'align',
            'allowscriptaccess',
            '/'
          ],
          img: [
            'src',
            'width',
            'height',
            'border',
            'alt',
            'title',
            'align',
            'style',
            '/'
          ],
          hr: ['class', '/'],
          br: ['/'],
          'p,ol,ul,li,blockquote,h1,h2,h3,h4,h5,h6': ['align', 'style'],
          'tbody,tr,strong,b,sub,sup,em,i,u,strike': []
        }
      }
    },
    wellFormatMode: {
      type: Boolean,
      default: true
    },
    resizeType: {
      type: Number,
      default: 2
    },
    themeType: {
      type: String,
      default: 'default'
    },
    langType: {
      type: String,
      default: 'zh-CN'
    },
    designMode: {
      type: Boolean,
      default: true
    },
    fullscreenMode: {
      type: Boolean,
      default: false
    },
    basePath: {
      type: String
    },
    themesPath: {
      type: String
    },
    pluginsPath: {
      type: String,
      default: ''
    },
    langPath: {
      type: String
    },
    minChangeSize: {
      type: Number,
      default: 5
    },
    loadStyleMode: {
      type: Boolean,
      default: true
    },
    urlType: {
      type: String,
      default: ''
    },
    newlineTag: {
      type: String,
      default: 'p'
    },
    pasteType: {
      type: Number,
      default: 2
    },
    dialogAlignType: {
      type: String,
      default: 'page'
    },
    shadowMode: {
      type: Boolean,
      default: true
    },
    zIndex: {
      type: Number,
      default: 811213
    },
    useContextmenu: {
      type: Boolean,
      default: true
    },
    syncType: {
      type: String,
      default: 'form'
    },
    indentChar: {
      type: String,
      default: '\t'
    },
    cssPath: {
      type: [String, Array]
    },
    cssData: {
      type: String
    },
    bodyClass: {
      type: String,
      default: 'ke-content'
    },
    colorTable: {
      type: Array
    },
    afterCreate: {
      type: Function
    },
    afterChange: {
      type: Function
    },
    afterTab: {
      type: Function
    },
    afterFocus: {
      type: Function
    },
    afterBlur: {
      type: Function
    },
    afterUpload: {
      type: Function
    },
    uploadJson: {
      type: String
    },
    fileManagerJson: {
      type: Function
    },
    allowPreviewEmoticons: {
      type: Boolean,
      default: true
    },
    allowImageUpload: {
      type: Boolean,
      default: true
    },
    allowFlashUpload: {
      type: Boolean,
      default: true
    },
    allowMediaUpload: {
      type: Boolean,
      default: true
    },
    allowFileUpload: {
      type: Boolean,
      default: true
    },
    allowFileManager: {
      type: Boolean,
      default: false
    },
    fontSizeTable: {
      type: Array,
      default: function () {
        return ['9px', '10px', '12px', '14px', '16px', '18px', '24px', '32px']
      }
    },
    imageTabIndex: {
      type: Number,
      default: 0
    },
    formatUploadUrl: {
      type: Boolean,
      default: true
    },
    fullscreenShortcut: {
      type: Boolean,
      default: false
    },
    extraFileUploadParams: {
      type: Array,
      default: function () {
        return []
      }
    },
    filePostName: {
      type: String,
      default: 'imgFile'
    },
    fillDescAfterUploadImage: {
      type: Boolean,
      default: false
    },
    afterSelectFile: {
      type: Function
    },
    pagebreakHtml: {
      type: String,
      default: '<hr style=”page-break-after: always;” class=”ke-pagebreak” />'
    },
    allowImageRemote: {
      type: Boolean,
      default: true
    },
    autoHeightMode: {
      type: Boolean,
      default: false
    },
    fixToolBar: {
      type: Boolean,
      default: false
    },
    tabIndex: {
      type: Number
    }
  },
  watch: {
    content (val) {
      this.editor && val !== this.outContent && this.editor.html(val)
    },
    outContent (val) {
      this.$emit('update:content', val)
      this.$emit('on-content-change', val)
    }
  },
  methods: {
    async pictureFileChange (e) {
      const files = e.target.files;
      if(files && files[0]) {
        const file = files[0];
        console.log(file.type)
        const typeList = ["image/jpg","image/jpeg","image/png","image/pjpeg","image/gif","image/bmp","image/x-png"]
        if(file.size > 1024 * 1024 * 10) {
          this.$message.error('图片大小不能超过10M!')
          return false;
        } else if (!typeList.find(v => v === file.type)) {
          this.$message.error('图片格式有误!')
          return false;
        } else {
          const loading = this.$loading({
            lock: true,
            text: 'Loading',
            spinner: 'el-icon-loading',
            background: 'rgba(0, 0, 0, 0.7)'
          })
          await oss.upload(file).then((url) => {
            loading.close()
            const str = `<p><img src="${url}" style="max-width:100%"/></p>`
            this.pictureData.editor.insertHtml(str);
          })
          setTimeout(() => {
            loading.close()
          }, 10000)
        }
      }
    },
    videoFileChange (e) {
      const files = e.target.files;
      if(files && files[0]) {
        const file = files[0];
        console.log(file.type)
        const typeList = ["video/mp4"]
        if(file.size > 1024 * 1024 * 500) {
          this.$message.error('视频大小不能超过500M!')
          return false;
        } else if (!typeList.find(v => v === file.type)) {
          this.$message.error('视频格式有误!')
          return false;
        } else {
          const loading = this.$loading({
            lock: true,
            text: 'Loading',
            spinner: 'el-icon-loading',
            background: 'rgba(0, 0, 0, 0.7)'
          })
          const formData = new FormData()
          formData.append('file', file)
          this.$api.file.upload(formData).then(res => {
            if (res.code === 200) {
              const _URL = window.URL || window.webkitURL
              const video = document.createElement('video')
              video.onloadedmetadata = () => {
                loading.close()
                const str = `<p>
                        <img
                             class="richTextVideoBox"
                             style="border: 1px solid #AAA;
                             display: inline-block;
                             background-position: center center;
                             background-repeat: no-repeat;
                             width: 100%;
                             height: 50px;
                             background-image: url('https://eos-wuxi-1.cmecloud.cn/desheng-teach/admin-35/938101f2e07d46ff87a9ddf9597bfcb3.gif');"
                             />
                          <video
                           class="richTextVideoBox"
                           style="display: none;width: 100%;"
                             src="${res.data[0]}"  filterMode="false" controls autobuffer autoplay muted/>
                      </p>`
                this.videoData.editor.insertHtml(str);
              }
              video.src = _URL.createObjectURL(file)
              video.load() // fetches metadata

            }
          })
          setTimeout(() => {
            loading.close()
          }, 10000)
        }
      }
    },
  },
  mounted () {
    var _this = this
    window.KindEditor.lang({
      picture : '上传图片',
      video : '上传视频',
    });
    window.KindEditor.plugin('picture', function(K) {
      var editor = this, name = 'picture';
      editor.clickToolbar(name, function() {
        _this.$refs.pictureFile.click();
        _this.pictureData.editor = editor
      });
    });
    window.KindEditor.plugin('video', function(K) {
      var editor = this, name = 'video';
      editor.clickToolbar(name, function() {
        _this.$refs.videoFile.click();
        _this.videoData.editor = editor
      });
    });
    _this.editor = window.KindEditor.create('#' + this.id, {
      width: _this.width,
      height: _this.height,
      minWidth: _this.minWidth,
      minHeight: _this.minHeight,
      items: _this.items,
      noDisableItems: _this.noDisableItems,
      filterMode: _this.filterMode,
      htmlTags: _this.htmlTags,
      wellFormatMode: _this.wellFormatMode,
      resizeType: _this.resizeType,
      themeType: _this.themeType,
      langType: _this.langType,
      designMode: _this.designMode,
      fullscreenMode: _this.fullscreenMode,
      basePath: _this.basePath,
      themesPath: _this.cssPath,
      pluginsPath: _this.pluginsPath,
      langPath: _this.langPath,
      minChangeSize: _this.minChangeSize,
      loadStyleMode: _this.loadStyleMode,
      urlType: _this.urlType,
      newlineTag: _this.newlineTag,
      pasteType: _this.pasteType,
      dialogAlignType: _this.dialogAlignType,
      shadowMode: _this.shadowMode,
      zIndex: _this.zIndex,
      useContextmenu: _this.useContextmenu,
      syncType: _this.syncType,
      indentChar: _this.indentChar,
      cssPath: _this.cssPath,
      cssData: _this.cssData,
      bodyClass: _this.bodyClass,
      colorTable: _this.colorTable,
      afterCreate: _this.afterCreate,
      afterChange: function () {
        _this.afterChange
        _this.outContent = this.html()
      },
      afterTab: _this.afterTab,
      afterFocus: _this.afterFocus,
      afterBlur: _this.afterBlur,
      afterUpload: _this.afterUpload,
      uploadJson: _this.uploadJson,
      fileManagerJson: _this.fileManagerJson,
      allowPreviewEmoticons: _this.allowPreviewEmoticons,
      allowImageUpload: _this.allowImageUpload,
      allowFlashUpload: _this.allowFlashUpload,
      allowMediaUpload: _this.allowMediaUpload,
      allowFileUpload: _this.allowFileUpload,
      allowFileManager: _this.allowFileManager,
      fontSizeTable: _this.fontSizeTable,
      imageTabIndex: _this.imageTabIndex,
      formatUploadUrl: _this.formatUploadUrl,
      fullscreenShortcut: _this.fullscreenShortcut,
      extraFileUploadParams: _this.extraFileUploadParams,
      filePostName: _this.filePostName,
      fillDescAfterUploadImage: _this.fillDescAfterUploadImage,
      afterSelectFile: _this.afterSelectFile,
      pagebreakHtml: _this.pagebreakHtml,
      allowImageRemote: _this.allowImageRemote,
      autoHeightMode: _this.autoHeightMode,
      fixToolBar: _this.fixToolBar,
      tabIndex: _this.tabIndex
    })
  }
}
</script>

<style>
  .ke-toolbar-icon-url {
    background-image: url(https://hysertest.oss-cn-shenzhen.aliyuncs.com/userupload/578dbc61-1f57-406e-86a7-3bb8fd753782default.4a1cec12.png?Signature=8fhX%2B1oYENtnth50y6%2BVkdX4rgs%3D&AWSAccessKeyId=l1f3KYCLRmxhm69u&Expires=4788815796) !important;
  }
  .ke-icon-video {
    background-image: url(
    'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAEKADAAQAAAABAAAACQAAAABZpYQBAAABlklEQVQoFV1RTyiDcRh+Pn0H3LSkXDQ5aAnjgHLhQlrCiIMd7KL823KRmljt4CCF25SUozUuCuXPQa0dmB3YauvzWd/++WQ25ttq+fhebcx7+D3P732f5+33e1/m6NwtC6wKjRWluPbx+BtyNknXZEr+xlcMdbVAo9EwfzUsF37GYE8rzJZV7NrMSOVSVM9kMpA+1TDMLKHfqsKIygznyQXVOI6Ttw9vibMRMYuS3BOexCglXC4XYeSjFMlUgvhjQgSfFnDr5bG47iSzobce4/NrYAP+e4xNn+FdktA3uUAGhedjVK+Drq4NfEgAF+KwuWKEzmjB7Fg7SVjlNI13Q6/XM1t7R/LEwwEOG4wok+Ooqq5DbU0llO/kg3sUieaRddgtjMP+U1aGJW7sQ+u2wu+NIx4JwhMU8l5CPvpGmJR+mtILfhWviF3eAZIMX0xCs3YA6u9iOBcrSNbtO8Q9vgBhUYN0thwvYhjKZpSBpbOnJIpF04UGN8c7zJXLK89ZNyhXtFNlPcNTtoL4P9lcNqGzo6nI8wVE47JkjKimBwAAAABJRU5ErkJggg=='
    ) !important;
    background-size: 100%;
    background-position: 0px 3px;
    width: 16px;
    height: 16px;
  }
  .ke-icon-picture {
    background-image: url(
     'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAPCAYAAADtc08vAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAEKADAAQAAAABAAAADwAAAADW5XGhAAABtUlEQVQoFZ1STUsCURQ9L0absUYbA1v0YVoboQ8LSZBWgv+gXT/AVZvoB9S6ResWuWgpLRNaqEtpobUJalVaBhaIOMJkiU3vzXNehRLShcc9795zD+++e0mj0TDpwX9M0zRIhUIBsVjsz3pZlgfm8/k8JDujX23ZsM/rfRHAFzu3okLgs3uNac0lqG81Q+BBQFEUkslkTCHgfQdYkdvvtvgO5i/KvNYzSILHhMBTWcdIXcKDOYXV5SjQrlBGmbOa3N0aP/+ibQWFwM7xKGedPcLnqXEMDa/Njx4e7Ebs8N2LEx1JhX9mDOsbn1BUR18xy9vHrrNewMYkj09A7xCEQnU7hzptp2WY1j0cXkMqdWLhdDqNg8VFMxAIfI9RdRF41FE4PxZ6AlW4HQZaUOD1eq3idJULJJN7pFgsmsFgkIgWHLIGo/M9Rqai03sikUA2mwXdOnL5fAN2mEUiEcK8Nct4PM6wMDZjcaFgL79r3tfL9IV8xM2WjpW5BexHD4nE+mDr/NNyuRxvnAbZmm+fb6NULWF2UhW0SoOLicAwwH/kNzdPl4Q4qxF7MIzAfIeuZFf7Rf0CUp+HJtIbu2MAAAAASUVORK5CYII='
    ) !important;
    background-size: 100%;
    width: 16px;
    height: 16px;
  }
  img.richTextVideoBox{display: none !important;}
  video.richTextVideoBox{display: inline-block !important;}
</style>

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值