vue-kindeditor 安装和解决问题

news2024/11/29 10:52:14

效果图

 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>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/589999.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

拿到字节跳动奖学金,入职字节跳动做科研,他们经历了什么?

前不久&#xff0c;第三届字节跳动奖学金计划已经正式启动。 自 2021 年起&#xff0c;字节跳动奖学金计划已经完成了两届评选&#xff0c;共有 19 位优秀学子荣获每人 10 万元人民币的奖学金。 在奖学金支持下&#xff0c;他们获得了新的科研项目费用、学术交流机会&#xff0…

高压放大器在驱动压电陶瓷进行铝板无损检测中的应用研究

想要达成在不损害或不影响被测对象使用性能及自身性质的前提下&#xff0c;对被测对象内部进行缺陷&#xff0c;结构&#xff0c;失效分析&#xff0c;就得用到无损检测&#xff08;Non Destructive Testing&#xff09;技术&#xff0c;最常用的无损检测方法有很多&#xff0c…

【网络安全知识】网络技术领域术语大全,强烈建议收藏!

自主访问控(DAC:Discretionary Access Control) 自主访问控制(DAC)是一个访问控制服务&#xff0c;其执行一个基于系统实体身份的安全政策和它们的授权来访问系统资源。 双附接集线器(DAC: Dual-attached Concentrator) 双附接集线器(DAC)是FDDI或CDDI集线器有能力接入到一个…

RK3568 AP6275S蓝牙驱动程序调度过程

1、前言 今年3月份调度了RK3568驱动程序&#xff0c;当时由于时间的问题&#xff0c;AP6275S蓝牙驱动程序没有调试成功。当时仔细检查的设备树的配置。 wireless_bluetooth: wireless-bluetooth {compatible "bluetooth-platdata";clocks <&rk809 1>;cl…

离散数学_十章-图 ( 4 ):图的表示和图的同构

&#x1f4f7;10.4 图的表示和图的同构 1. 图的表示1.1 邻接表1.1.1 简单图的邻接表1.1.2 有向图的邻接表 1.2 邻接矩阵❗在邻接表和邻接矩阵之间取舍1.3 关联矩阵 2. 图同构3. ⚡判断两个简单图是否同构 图的表示方式有很多种&#xff0c;选择最方便的表示有助于对图的处理~ …

Navicat 面向 PostgreSQL 查询超时的工具解决方案

文章目录 Navicat 面向 PostgreSQL 查询超时的工具解决方案查询超时的必要性应用场景 查询分析器 | Navicat Monitor在数据库级别设置为特定用户设置查询超时 结语 Navicat 面向 PostgreSQL 查询超时的工具解决方案 早前&#xff0c;我们发表过一篇《PostgreSQL 与 Navicat &am…

Datax ftp写入hive

这是一个巨大的坑&#xff0c;网上对这块的完整描述真的很少&#xff0c;新手真的会很迷茫&#xff01;&#xff01;&#xff01; 插件 选择插件 reader插件选择&#xff1a;ftpread write插件选择&#xff1a;hdfswrite 参数配置 reader参数 "parameter": {/…

干货|SpringCloud全家桶微服务初探

SpringCloud的从整体架构上看&#xff0c;相对来说是完整的、庞大的。它不仅仅是一个基础性架构工具&#xff0c;它为微服务架构提供了一个“全家桶”的套餐。每一个模块关注各自的职能&#xff0c;并且能够很好地配合与协作&#xff0c;能够帮助入门者快速搭建起一套微服务架构…

前后端联调跨域问题

文章目录 什么是同源策略如何判断是否同源&#xff1f;跨域资源共享(CORS)如何解决跨域问题 什么是同源策略 同源策略限制了从同一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这是一个用于隔离潜在恶意文件的重要安全机制。 如何判断是否同源&#xff1f; 如果…

从中国人民大学与加拿大女王大学金融硕士的学员构成,了解金融行业都有哪些职位

金融行业最受欢迎的岗位莫过于券商、银行、基金公司、私募市场、体制内&#xff08;监管部门、交易所等&#xff09;、信托、大企业投资部、保险、管理咨询、资产管理。在当下如果要选择工作&#xff0c;想找就业率第一、薪酬排名第一的行业&#xff0c;那一定是金融工作。中国…

03 redis新类型bitmap/hyperloglgo/GEO

亿级系统中常见的四种统计 聚合统计 统计多个集合元素的聚合结果&#xff0c;就是前面讲解过的交差并等集合统计交并差集和聚合函数的应用 排序统计 抖音视频最新评论留言的场景&#xff0c;请你设计一个展现列表。考察你的数据结构和设计思路设计案例和回答思路以抖音vcr最…

3.java高级之GUI编程

1.gui (graphical user interface) awt sun公司最早的gui,不美观,不兼容各平台swing : awt升级2.顶层容器(只有一个)(其他的只能放这里)Jframe Jdialog对话框 Jwindow(x) //在main方法写fnew Jframe(); f.setSize(300,300); //设置大小f.setTitle("hello"); //设置…

java条件语句

文章目录 一、java条件语句1、Java 条件语句 - if...else2、Java switch case 语句 总结 一、java条件语句 1、Java 条件语句 - if…else Java 中的条件语句允许程序根据条件的不同执行不同的代码块。 一个 if 语句包含一个布尔表达式和一条或多条语句。 语法 if 语句的语法…

你真的了解kotlin中协程的suspendCoroutine原理吗?

文章目录 什么是协程suspendCoroutineUninterceptedOrReturnsuspendCoroutineUninterceptedOrReturn存在的问题suspendCoroutinesuspendCancellableCoroutine ​ 引言&#xff1a; 在Kotlin协程中&#xff0c;如何让一个suspned 函数挂起&#xff1f;如何让挂起协程恢复&#…

STM32G4 比较器COMPx(寄存器开发)

目录 1. 特性1.1 框图1.2 比较器输入信号SEL1.3 比较器滞回选择HYST1.4 比较器的输出1.5 LOCK机制 2. 编程2.1 初始化步骤2.2 举例 STM内部的比较器是模拟量的比较器&#xff0c;其与APB2时钟同步&#xff0c;在RCC时钟控制器中没有COMx时钟使能标志位&#xff0c;其时钟的使能…

前端自学要多久?自学前端一般多久可以找到差不多的工作?

好程序员今天给各位同学分享自学前端的高效率路径&#xff0c;最快4个月&#xff0c;平均6个月&#xff01; 一、html, CSS (1月) 1.基本语法, 2.做2-3个项目实战 3.刷面试题 二、JavaScript (1.5月) 1.基本语法 2.实际案例练习融合HTML, Css项目实战 3.刷题面试题 三、Vue/Rea…

Java 高级应用-多线程-(三)实现 Callable 接口与使用线程池创建线程

实现 Callable 接口 • 与使用 Runnable 相比&#xff0c; Callable 功能更强大些 – 相比 run()方法&#xff0c;可以有返回值 – 方法可以抛出异常 – 支持泛型的返回值&#xff08;需要借助 FutureTask 类&#xff0c;获取返回结果&#xff09; • Future 接口&#xff08;…

游戏研发项目管理

基于阶段模式进行游戏新产品研发过程&#xff0c;以及基于这种研发过程Leangoo 领歌提供的项目模板。 二、游戏产品开发流程 通常开发一款新游戏大体上会按照如下流程来进行&#xff1a; 1&#xff09; 概念阶段 – Concept 主策根据产品创意&#xff0c;确定游戏策划草案&a…

C++中的内存空间管理详解【C++】

文章目录 C/C内存分布C语言中动态内存管理方式&#xff1a;malloc/calloc/realloc/freeC内存管理方式new/delete操作内置类型new和delete操作自定义类型 operator new与operator delete函数重载operator new与operator deletenew和delete的实现原理内置类型自定义类型 定位new表…

使用tomcat可能遇到的问题

问题一&#xff1a;窗口一闪而过 如果双击startup.bat&#xff0c;启动tomcat&#xff0c;命令窗口一闪而过&#xff1b;或者用命令窗口执行startup.bat命令&#xff0c;未能启动tomcat&#xff0c;而是提示下面的文字&#xff1b; 说明可能是java的环境变量配置错误&#xf…