1. 程式人生 > >使用百度UEditor

使用百度UEditor

百度UEditor展示

在這裡插入圖片描述
如上圖所示,是一個百度UEditor富文字編輯器。這裡就講解一下:如何使用百度UEditor,新增toolbar以及如何實現上傳本地圖片,和將外部黏貼進來的圖片進行地址替換。


使用百度UEditor前遇到的問題

大家知道,富文字編輯器有很多種。我一個星期前用了Vue2Editor發現,這個的封裝存在很多問題。它是使用了quill的這個庫,但是呢,利用的還是有很多問題。比如:toolbar無法進行自定義外部複製來東西會格式化樣式
在這裡插入圖片描述
在這裡插入圖片描述


使用百度UEditor

在這裡插入圖片描述

(1) 引入+ 組建內註冊:
import VueUeditorWrap from "vue-ueditor-wrap";
export default {
  components: {
    VueUeditorWrap,   
  },
  data(){
	  return{
	  	data.pageContent = "";
	  	editorConfig: {
		        // 如果需要上傳功能,找後端小夥伴要伺服器介面地址
		        serverUrl: "/book/update/upload",
		        // 你的UEditor資源存放的路徑,相對於打包後的index.html(路由使用history模式注意使用絕對路徑或者填寫正確的相對路徑)
		        UEDITOR_HOME_URL: "/static/UEditor/",
		        // 編輯器不自動被內容撐高
		        autoHeightEnabled: false,
		        // 初始容器高度
		        initialFrameHeight: 600,
		        // 初始容器寬度
		        initialFrameWidth: "100%",
		        // 關閉自動儲存
		        enableAutoSave: false
		      },
     	editorInstance: null,
	  }
  }
}
(2) 在view中進行展示:
 <vue-ueditor-wrap
                    ref="ueditor"
                    v-model="data.pageContent"
                    :config="editorConfig"
                    :destroy="true"
                    :init="initUeditor"
                    @ready="ueditorReady"
                  />
(3) methods:裡面的方法 (批量上傳外部圖片)

在這裡插入圖片描述

    ueditorReady(editorInstance) {
      this.editorInstance = editorInstance;
    },
    initUeditor() {
      // 註冊富文字框按鈕(這裡講解:第一張圖中最後兩個圖片按鈕:單張上傳和批量上傳的操作)
      const _this = this;
      window.UE.registerUI("上傳外部圖片", (editor, uiName) => {       /*----------上傳外部圖片按鈕-----------*/
        // 註冊按鈕執行時的command命令,使用命令預設就會帶有回退操作
        editor.registerCommand(uiName, {
          execCommand() {
            const doc = new DOMParser().parseFromString(
              _this.editorInstance.getContent(),
              "text/html"
            );
            const imgs = doc.querySelectorAll("img");
            if (!imgs.length) return;
            editor.setDisabled();

            _this.uploadImg(imgs, doc, editor);
          }
        });

        // 建立一個button
        const btn = new window.UE.ui.Button({
          // 按鈕的名字
          name: uiName,
          // 提示
          title: uiName,
          // 需要新增的額外樣式,指定icon圖示,這裡預設使用一個重複的icon
          cssRules: "background-position: -726px -76px;",
          // 點選時執行的命令
          onclick() {
            // 這裡可以不用執行命令,做你自己的操作也可
            editor.execCommand(uiName);
          }
        });
        return btn;
      });

      window.UE.registerUI(                  /*----------上傳內部圖片按鈕-----------*/
        "上傳圖片",
        (editor, uiName) => {
          editor.registerCommand(uiName, {
            execCommand() {
              _this.$refs.fileInputHidden.click();
            }
          });
          const btn = new window.UE.ui.Button({
            name: uiName,
            title: uiName,
            cssRules: "background-position: -380px 0px;",
            onclick() {
              editor.execCommand(uiName);
            }
          });
          return btn;
        },
        44
      );
    },
    // 獲取圖片地址
    uploadImg(imgs, doc, editor) {
      if (imgs) {
        if (imgs.length === 0) {
          this.$message({
            type: "warning",
            message: "請先放置圖片!"
          });
        }
        this.uploadSingle(imgs, 0, doc, editor);
      }
    },
   // 批量上傳外部圖片
    uploadSingle(imgs, i, doc, editor) {
      if (imgs.length === i) {
        this.enableEditor(doc, editor);
        return;
      }
      const img = imgs[i];
      if (img.src.indexOf("你不想轉換的圖片地址片段") >= 0) {  
        this.uploadSingle(imgs, (i += 1), doc, editor);
        return;
      }
      DataResearch.getImageDataUrl({ url: img.src })   //  呼叫更改圖片地址介面(你們公司的更改圖片地址介面)
        .then(
          res => {
            this.imageChange(res, resolve => {    // 獲得更改後的圖片地址
              img.setAttribute("src", resolve);
              this.uploadSingle(imgs, (i += 1), doc, editor);   // 進行遞迴的上傳圖片
            });
          },
          resolve => {
            throw resolve;
          }
        )
        .then(() => {
          this.$message({
            type: "success",
            message: "圖片上傳成功!"
          });
        });
    },
       // 將傳外部圖片地址修改為你們公司的地址
    imageChange(file, getdata) {
      const uploadData = getFormData({
        file,
        a_id: this.admin.admin_id,
        a_token: this.admin.app_token,
        prefix: "shop-manage/product",
        overwrite: 2
      });
      const imageTypes = ["image/jpeg", "image/png", "image/gif"];
      const validType = imageTypes.some(
        type => type === String(file.type).toLowerCase()
      );
      const isLt5M = file.size / 1024 / 1024 < 5;
      if (!validType) {
        this.$message.error("上傳圖片格式錯誤!");
        return false;
      }
      if (!isLt5M) {
        this.$message.error("上傳圖片大小不能超過 5MB!");
        return false;
      }
      axios({
        method: "post",
        url: `${this.config.fs_url}/upload`,  // 你們公司的修改圖片地址介面
        data: uploadData
      })
        .then(res => getdata(res.data.data.url))
        .catch(() => {
          this.$message.error("圖片上傳失敗,請稍後重試");
        });
    },
(4) methods:裡面的方法 (單張上傳內部圖片)

在這裡插入圖片描述
原理:

  1. 寫一個input輸入框並將其type設定為檔案型別,將其隱藏。
  2. 當點選上傳內部圖片按鈕時,去呼叫該input框的change方法

view裡面

<input
                    ref="fileInputHidden"
                    type="file"
                    style="display: none"
                    @change="uploadHiddenFile">

methods:裡面的方法

    uploadHiddenFile() {
      const file = this.$refs.fileInputHidden.files[0];
      this.imageChange(file, url => {
        this.editorInstance.focus();
        this.editorInstance.execCommand("inserthtml", `<img src=${url}>`);
      });
    },
    // 將傳外部圖片地址修改為噠噠地址
    imageChange(file, getdata) {
      const uploadData = getFormData({
        file,
        a_id: this.admin.admin_id,
        a_token: this.admin.app_token,
        prefix: "shop-manage/product",
        overwrite: 2
      });
      const imageTypes = ["image/jpeg", "image/png", "image/gif"];
      const validType = imageTypes.some(
        type => type === String(file.type).toLowerCase()
      );
      const isLt5M = file.size / 1024 / 1024 < 5;
      if (!validType) {
        this.$message.error("上傳圖片格式錯誤!");
        return false;
      }
      if (!isLt5M) {
        this.$message.error("上傳圖片大小不能超過 5MB!");
        return false;
      }
      axios({
        method: "post",
        url: `${this.config.fs_url}/upload`,
        data: uploadData
      })
        .then(res => getdata(res.data.data.url))
        .catch(() => {
          this.$message.error("圖片上傳失敗,請稍後重試");
        });
    },