Files
education/frontend/node_modules/.cache/vue-loader/1f5105a27b8e4cddc081a17814c25fc1.json
T

1 line
21 KiB
JSON

{"remainingRequest":"C:\\Users\\Admin\\Desktop\\education\\frontend\\node_modules\\vue-loader\\lib\\index.js??vue-loader-options!C:\\Users\\Admin\\Desktop\\education\\frontend\\src\\components\\Editor\\index.vue?vue&type=script&lang=js","dependencies":[{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\src\\components\\Editor\\index.vue","mtime":1787567871495},{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\node_modules\\cache-loader\\dist\\cjs.js","mtime":1787309791955},{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\node_modules\\babel-loader\\lib\\index.js","mtime":1787309793142},{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\node_modules\\cache-loader\\dist\\cjs.js","mtime":1787309791955},{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\node_modules\\vue-loader\\lib\\index.js","mtime":1787309793790}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:Ly8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KDQppbXBvcnQgYXhpb3MgZnJvbSAiYXhpb3MiDQppbXBvcnQgUXVpbGwgZnJvbSAicXVpbGwiDQppbXBvcnQgInF1aWxsL2Rpc3QvcXVpbGwuY29yZS5jc3MiDQppbXBvcnQgInF1aWxsL2Rpc3QvcXVpbGwuc25vdy5jc3MiDQppbXBvcnQgInF1aWxsL2Rpc3QvcXVpbGwuYnViYmxlLmNzcyINCmltcG9ydCB7IGdldFRva2VuIH0gZnJvbSAiQC91dGlscy9hdXRoIg0KDQpleHBvcnQgZGVmYXVsdCB7DQogIG5hbWU6ICJFZGl0b3IiLA0KICBwcm9wczogew0KICAgIC8qIOe8lui+keWZqOeahOWGheWuuSAqLw0KICAgIHZhbHVlOiB7DQogICAgICB0eXBlOiBTdHJpbmcsDQogICAgICBkZWZhdWx0OiAiIiwNCiAgICB9LA0KICAgIC8qIOmrmOW6piAqLw0KICAgIGhlaWdodDogew0KICAgICAgdHlwZTogTnVtYmVyLA0KICAgICAgZGVmYXVsdDogbnVsbCwNCiAgICB9LA0KICAgIC8qIOacgOWwj+mrmOW6piAqLw0KICAgIG1pbkhlaWdodDogew0KICAgICAgdHlwZTogTnVtYmVyLA0KICAgICAgZGVmYXVsdDogbnVsbCwNCiAgICB9LA0KICAgIC8qIOWPquivuyAqLw0KICAgIHJlYWRPbmx5OiB7DQogICAgICB0eXBlOiBCb29sZWFuLA0KICAgICAgZGVmYXVsdDogZmFsc2UsDQogICAgfSwNCiAgICAvKiDkuIrkvKDmlofku7blpKflsI/pmZDliLYoTUIpICovDQogICAgZmlsZVNpemU6IHsNCiAgICAgIHR5cGU6IE51bWJlciwNCiAgICAgIGRlZmF1bHQ6IDUsDQogICAgfSwNCiAgICAvKiDnsbvlnovvvIhiYXNlNjTmoLzlvI/jgIF1cmzmoLzlvI/vvIkgKi8NCiAgICB0eXBlOiB7DQogICAgICB0eXBlOiBTdHJpbmcsDQogICAgICBkZWZhdWx0OiAidXJsIiwNCiAgICB9DQogIH0sDQogIGRhdGEoKSB7DQogICAgcmV0dXJuIHsNCiAgICAgIHVwbG9hZFVybDogcHJvY2Vzcy5lbnYuVlVFX0FQUF9CQVNFX0FQSSArICIvY29tbW9uL3VwbG9hZCIsIC8vIOS4iuS8oOeahOWbvueJh+acjeWKoeWZqOWcsOWdgA0KICAgICAgaGVhZGVyczogew0KICAgICAgICBBdXRob3JpemF0aW9uOiAiQmVhcmVyICIgKyBnZXRUb2tlbigpDQogICAgICB9LA0KICAgICAgUXVpbGw6IG51bGwsDQogICAgICBjdXJyZW50VmFsdWU6ICIiLA0KICAgICAgb3B0aW9uczogew0KICAgICAgICB0aGVtZTogInNub3ciLA0KICAgICAgICBib3VuZHM6IGRvY3VtZW50LmJvZHksDQogICAgICAgIGRlYnVnOiAid2FybiIsDQogICAgICAgIG1vZHVsZXM6IHsNCiAgICAgICAgICAvLyDlt6XlhbfmoI/phY3nva4NCiAgICAgICAgICB0b29sYmFyOiBbDQogICAgICAgICAgICBbImJvbGQiLCAiaXRhbGljIiwgInVuZGVybGluZSIsICJzdHJpa2UiXSwgICAgICAgLy8g5Yqg57KXIOaWnOS9kyDkuIvliJLnur8g5Yig6Zmk57q/DQogICAgICAgICAgICBbImJsb2NrcXVvdGUiLCAiY29kZS1ibG9jayJdLCAgICAgICAgICAgICAgICAgICAgLy8g5byV55SoICDku6PnoIHlnZcNCiAgICAgICAgICAgIFt7IGxpc3Q6ICJvcmRlcmVkIiB9LCB7IGxpc3Q6ICJidWxsZXQiIH1dLCAgICAgICAvLyDmnInluo/jgIHml6Dluo/liJfooagNCiAgICAgICAgICAgIFt7IGluZGVudDogIi0xIiB9LCB7IGluZGVudDogIisxIiB9XSwgICAgICAgICAgICAvLyDnvKnov5sNCiAgICAgICAgICAgIFt7IHNpemU6IFsic21hbGwiLCBmYWxzZSwgImxhcmdlIiwgImh1Z2UiXSB9XSwgICAvLyDlrZfkvZPlpKflsI8NCiAgICAgICAgICAgIFt7IGhlYWRlcjogWzEsIDIsIDMsIDQsIDUsIDYsIGZhbHNlXSB9XSwgICAgICAgICAvLyDmoIfpopgNCiAgICAgICAgICAgIFt7IGNvbG9yOiBbXSB9LCB7IGJhY2tncm91bmQ6IFtdIH1dLCAgICAgICAgICAgICAvLyDlrZfkvZPpopzoibLjgIHlrZfkvZPog4zmma/popzoibINCiAgICAgICAgICAgIFt7IGFsaWduOiBbXSB9XSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDlr7npvZDmlrnlvI8NCiAgICAgICAgICAgIFsiY2xlYW4iXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDmuIXpmaTmlofmnKzmoLzlvI8NCiAgICAgICAgICAgIFsibGluayIsICJpbWFnZSIsICJ2aWRlbyJdICAgICAgICAgICAgICAgICAgICAgICAvLyDpk77mjqXjgIHlm77niYfjgIHop4bpopENCiAgICAgICAgICBdLA0KICAgICAgICB9LA0KICAgICAgICBwbGFjZWhvbGRlcjogIuivt+i+k+WFpeWGheWuuSIsDQogICAgICAgIHJlYWRPbmx5OiB0aGlzLnJlYWRPbmx5LA0KICAgICAgfSwNCiAgICB9DQogIH0sDQogIGNvbXB1dGVkOiB7DQogICAgc3R5bGVzKCkgew0KICAgICAgbGV0IHN0eWxlID0ge30NCiAgICAgIGlmICh0aGlzLm1pbkhlaWdodCkgew0KICAgICAgICBzdHlsZS5taW5IZWlnaHQgPSBgJHt0aGlzLm1pbkhlaWdodH1weGANCiAgICAgIH0NCiAgICAgIGlmICh0aGlzLmhlaWdodCkgew0KICAgICAgICBzdHlsZS5oZWlnaHQgPSBgJHt0aGlzLmhlaWdodH1weGANCiAgICAgIH0NCiAgICAgIHJldHVybiBzdHlsZQ0KICAgIH0NCiAgfSwNCiAgd2F0Y2g6IHsNCiAgICB2YWx1ZTogew0KICAgICAgaGFuZGxlcih2YWwpIHsNCiAgICAgICAgaWYgKHZhbCAhPT0gdGhpcy5jdXJyZW50VmFsdWUpIHsNCiAgICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IHZhbCA9PT0gbnVsbCA/ICIiIDogdmFsDQogICAgICAgICAgaWYgKHRoaXMuUXVpbGwpIHsNCiAgICAgICAgICAgIHRoaXMuUXVpbGwuY2xpcGJvYXJkLmRhbmdlcm91c2x5UGFzdGVIVE1MKHRoaXMuY3VycmVudFZhbHVlKQ0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgfSwNCiAgICAgIGltbWVkaWF0ZTogdHJ1ZSwNCiAgICB9LA0KICB9LA0KICBtb3VudGVkKCkgew0KICAgIHRoaXMuaW5pdCgpDQogIH0sDQogIGJlZm9yZURlc3Ryb3koKSB7DQogICAgdGhpcy5RdWlsbCA9IG51bGwNCiAgfSwNCiAgbWV0aG9kczogew0KICAgIGluaXQoKSB7DQogICAgICBjb25zdCBlZGl0b3IgPSB0aGlzLiRyZWZzLmVkaXRvcg0KICAgICAgdGhpcy5RdWlsbCA9IG5ldyBRdWlsbChlZGl0b3IsIHRoaXMub3B0aW9ucykNCiAgICAgIC8vIOWmguaenOiuvue9ruS6huS4iuS8oOWcsOWdgOWImeiHquWumuS5ieWbvueJh+S4iuS8oOS6i+S7tg0KICAgICAgaWYgKHRoaXMudHlwZSA9PSAndXJsJykgew0KICAgICAgICBsZXQgdG9vbGJhciA9IHRoaXMuUXVpbGwuZ2V0TW9kdWxlKCJ0b29sYmFyIikNCiAgICAgICAgdG9vbGJhci5hZGRIYW5kbGVyKCJpbWFnZSIsICh2YWx1ZSkgPT4gew0KICAgICAgICAgIGlmICh2YWx1ZSkgew0KICAgICAgICAgICAgdGhpcy4kcmVmcy51cGxvYWQuJGNoaWxkcmVuWzBdLiRyZWZzLmlucHV0LmNsaWNrKCkNCiAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgdGhpcy5xdWlsbC5mb3JtYXQoImltYWdlIiwgZmFsc2UpDQogICAgICAgICAgfQ0KICAgICAgICB9KQ0KICAgICAgICB0aGlzLlF1aWxsLnJvb3QuYWRkRXZlbnRMaXN0ZW5lcigncGFzdGUnLCB0aGlzLmhhbmRsZVBhc3RlQ2FwdHVyZSwgdHJ1ZSkNCiAgICAgIH0NCiAgICAgIHRoaXMuUXVpbGwuY2xpcGJvYXJkLmRhbmdlcm91c2x5UGFzdGVIVE1MKHRoaXMuY3VycmVudFZhbHVlKQ0KICAgICAgdGhpcy5RdWlsbC5vbigidGV4dC1jaGFuZ2UiLCAoZGVsdGEsIG9sZERlbHRhLCBzb3VyY2UpID0+IHsNCiAgICAgICAgY29uc3QgaHRtbCA9IHRoaXMuJHJlZnMuZWRpdG9yLmNoaWxkcmVuWzBdLmlubmVySFRNTA0KICAgICAgICBjb25zdCB0ZXh0ID0gdGhpcy5RdWlsbC5nZXRUZXh0KCkNCiAgICAgICAgY29uc3QgcXVpbGwgPSB0aGlzLlF1aWxsDQogICAgICAgIHRoaXMuY3VycmVudFZhbHVlID0gaHRtbA0KICAgICAgICB0aGlzLiRlbWl0KCJpbnB1dCIsIGh0bWwpDQogICAgICAgIHRoaXMuJGVtaXQoIm9uLWNoYW5nZSIsIHsgaHRtbCwgdGV4dCwgcXVpbGwgfSkNCiAgICAgIH0pDQogICAgICB0aGlzLlF1aWxsLm9uKCJ0ZXh0LWNoYW5nZSIsIChkZWx0YSwgb2xkRGVsdGEsIHNvdXJjZSkgPT4gew0KICAgICAgICB0aGlzLiRlbWl0KCJvbi10ZXh0LWNoYW5nZSIsIGRlbHRhLCBvbGREZWx0YSwgc291cmNlKQ0KICAgICAgfSkNCiAgICAgIHRoaXMuUXVpbGwub24oInNlbGVjdGlvbi1jaGFuZ2UiLCAocmFuZ2UsIG9sZFJhbmdlLCBzb3VyY2UpID0+IHsNCiAgICAgICAgdGhpcy4kZW1pdCgib24tc2VsZWN0aW9uLWNoYW5nZSIsIHJhbmdlLCBvbGRSYW5nZSwgc291cmNlKQ0KICAgICAgfSkNCiAgICAgIHRoaXMuUXVpbGwub24oImVkaXRvci1jaGFuZ2UiLCAoZXZlbnROYW1lLCAuLi5hcmdzKSA9PiB7DQogICAgICAgIHRoaXMuJGVtaXQoIm9uLWVkaXRvci1jaGFuZ2UiLCBldmVudE5hbWUsIC4uLmFyZ3MpDQogICAgICB9KQ0KICAgIH0sDQogICAgLy8g5LiK5Lyg5YmN5qCh5qOA5qC85byP5ZKM5aSn5bCPDQogICAgaGFuZGxlQmVmb3JlVXBsb2FkKGZpbGUpIHsNCiAgICAgIGNvbnN0IHR5cGUgPSBbImltYWdlL2pwZWciLCAiaW1hZ2UvanBnIiwgImltYWdlL3BuZyIsICJpbWFnZS9zdmciXQ0KICAgICAgY29uc3QgaXNKUEcgPSB0eXBlLmluY2x1ZGVzKGZpbGUudHlwZSkNCiAgICAgIC8vIOajgOmqjOaWh+S7tuagvOW8jw0KICAgICAgaWYgKCFpc0pQRykgew0KICAgICAgICB0aGlzLiRtZXNzYWdlLmVycm9yKGDlm77niYfmoLzlvI/plJnor68hYCkNCiAgICAgICAgcmV0dXJuIGZhbHNlDQogICAgICB9DQogICAgICAvLyDmoKHmo4Dmlofku7blpKflsI8NCiAgICAgIGlmICh0aGlzLmZpbGVTaXplKSB7DQogICAgICAgIGNvbnN0IGlzTHQgPSBmaWxlLnNpemUgLyAxMDI0IC8gMTAyNCA8IHRoaXMuZmlsZVNpemUNCiAgICAgICAgaWYgKCFpc0x0KSB7DQogICAgICAgICAgdGhpcy4kbWVzc2FnZS5lcnJvcihg5LiK5Lyg5paH5Lu25aSn5bCP5LiN6IO96LaF6L+HICR7dGhpcy5maWxlU2l6ZX0gTUIhYCkNCiAgICAgICAgICByZXR1cm4gZmFsc2UNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgcmV0dXJuIHRydWUNCiAgICB9LA0KICAgIGhhbmRsZVVwbG9hZFN1Y2Nlc3MocmVzLCBmaWxlKSB7DQogICAgICAvLyDlpoLmnpzkuIrkvKDmiJDlip8NCiAgICAgIGlmIChyZXMuY29kZSA9PSAyMDApIHsNCiAgICAgICAgLy8g6I635Y+W5a+M5paH5pys57uE5Lu25a6e5L6LDQogICAgICAgIGxldCBxdWlsbCA9IHRoaXMuUXVpbGwNCiAgICAgICAgLy8g6I635Y+W5YWJ5qCH5omA5Zyo5L2N572uDQogICAgICAgIGxldCBsZW5ndGggPSBxdWlsbC5nZXRTZWxlY3Rpb24oKS5pbmRleA0KICAgICAgICAvLyDmj5LlhaXlm77niYcgIHJlcy51cmzkuLrmnI3liqHlmajov5Tlm57nmoTlm77niYflnLDlnYANCiAgICAgICAgcXVpbGwuaW5zZXJ0RW1iZWQobGVuZ3RoLCAiaW1hZ2UiLCBwcm9jZXNzLmVudi5WVUVfQVBQX0JBU0VfQVBJICsgcmVzLmZpbGVOYW1lKQ0KICAgICAgICAvLyDosIPmlbTlhYnmoIfliLDmnIDlkI4NCiAgICAgICAgcXVpbGwuc2V0U2VsZWN0aW9uKGxlbmd0aCArIDEpDQogICAgICB9IGVsc2Ugew0KICAgICAgICB0aGlzLiRtZXNzYWdlLmVycm9yKCLlm77niYfmj5LlhaXlpLHotKUiKQ0KICAgICAgfQ0KICAgIH0sDQogICAgaGFuZGxlVXBsb2FkRXJyb3IoKSB7DQogICAgICB0aGlzLiRtZXNzYWdlLmVycm9yKCLlm77niYfmj5LlhaXlpLHotKUiKQ0KICAgIH0sDQogICAgLy8g5aSN5Yi257KY6LS05Zu+54mH5aSE55CGDQogICAgaGFuZGxlUGFzdGVDYXB0dXJlKGUpIHsNCiAgICAgIGNvbnN0IGNsaXBib2FyZCA9IGUuY2xpcGJvYXJkRGF0YSB8fCB3aW5kb3cuY2xpcGJvYXJkRGF0YQ0KICAgICAgaWYgKGNsaXBib2FyZCAmJiBjbGlwYm9hcmQuaXRlbXMpIHsNCiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbGlwYm9hcmQuaXRlbXMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICBjb25zdCBpdGVtID0gY2xpcGJvYXJkLml0ZW1zW2ldDQogICAgICAgICAgaWYgKGl0ZW0udHlwZS5pbmRleE9mKCdpbWFnZScpICE9PSAtMSkgew0KICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpDQogICAgICAgICAgICBjb25zdCBmaWxlID0gaXRlbS5nZXRBc0ZpbGUoKQ0KICAgICAgICAgICAgdGhpcy5pbnNlcnRJbWFnZShmaWxlKQ0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0sDQogICAgaW5zZXJ0SW1hZ2UoZmlsZSkgew0KICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKQ0KICAgICAgZm9ybURhdGEuYXBwZW5kKCJmaWxlIiwgZmlsZSkNCiAgICAgIGF4aW9zLnBvc3QodGhpcy51cGxvYWRVcmwsIGZvcm1EYXRhLCB7IGhlYWRlcnM6IHsgIkNvbnRlbnQtVHlwZSI6ICJtdWx0aXBhcnQvZm9ybS1kYXRhIiwgQXV0aG9yaXphdGlvbjogdGhpcy5oZWFkZXJzLkF1dGhvcml6YXRpb24gfSB9KS50aGVuKHJlcyA9PiB7DQogICAgICAgIHRoaXMuaGFuZGxlVXBsb2FkU3VjY2VzcyhyZXMuZGF0YSkNCiAgICAgIH0pDQogICAgfQ0KICB9DQp9DQo="},{"version":3,"sources":["index.vue"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAoBA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"index.vue","sourceRoot":"src/components/Editor","sourcesContent":["<template>\r\n <div>\r\n <el-upload\r\n :action=\"uploadUrl\"\r\n :before-upload=\"handleBeforeUpload\"\r\n :on-success=\"handleUploadSuccess\"\r\n :on-error=\"handleUploadError\"\r\n name=\"file\"\r\n :show-file-list=\"false\"\r\n :headers=\"headers\"\r\n style=\"display: none\"\r\n ref=\"upload\"\r\n v-if=\"this.type == 'url'\"\r\n >\r\n </el-upload>\r\n <div class=\"editor\" ref=\"editor\" :style=\"styles\"></div>\r\n </div>\r\n</template>\r\n\r\n<script>\r\nimport axios from \"axios\"\r\nimport Quill from \"quill\"\r\nimport \"quill/dist/quill.core.css\"\r\nimport \"quill/dist/quill.snow.css\"\r\nimport \"quill/dist/quill.bubble.css\"\r\nimport { getToken } from \"@/utils/auth\"\r\n\r\nexport default {\r\n name: \"Editor\",\r\n props: {\r\n /* 编辑器的内容 */\r\n value: {\r\n type: String,\r\n default: \"\",\r\n },\r\n /* 高度 */\r\n height: {\r\n type: Number,\r\n default: null,\r\n },\r\n /* 最小高度 */\r\n minHeight: {\r\n type: Number,\r\n default: null,\r\n },\r\n /* 只读 */\r\n readOnly: {\r\n type: Boolean,\r\n default: false,\r\n },\r\n /* 上传文件大小限制(MB) */\r\n fileSize: {\r\n type: Number,\r\n default: 5,\r\n },\r\n /* 类型(base64格式、url格式) */\r\n type: {\r\n type: String,\r\n default: \"url\",\r\n }\r\n },\r\n data() {\r\n return {\r\n uploadUrl: process.env.VUE_APP_BASE_API + \"/common/upload\", // 上传的图片服务器地址\r\n headers: {\r\n Authorization: \"Bearer \" + getToken()\r\n },\r\n Quill: null,\r\n currentValue: \"\",\r\n options: {\r\n theme: \"snow\",\r\n bounds: document.body,\r\n debug: \"warn\",\r\n modules: {\r\n // 工具栏配置\r\n toolbar: [\r\n [\"bold\", \"italic\", \"underline\", \"strike\"], // 加粗 斜体 下划线 删除线\r\n [\"blockquote\", \"code-block\"], // 引用 代码块\r\n [{ list: \"ordered\" }, { list: \"bullet\" }], // 有序、无序列表\r\n [{ indent: \"-1\" }, { indent: \"+1\" }], // 缩进\r\n [{ size: [\"small\", false, \"large\", \"huge\"] }], // 字体大小\r\n [{ header: [1, 2, 3, 4, 5, 6, false] }], // 标题\r\n [{ color: [] }, { background: [] }], // 字体颜色、字体背景颜色\r\n [{ align: [] }], // 对齐方式\r\n [\"clean\"], // 清除文本格式\r\n [\"link\", \"image\", \"video\"] // 链接、图片、视频\r\n ],\r\n },\r\n placeholder: \"请输入内容\",\r\n readOnly: this.readOnly,\r\n },\r\n }\r\n },\r\n computed: {\r\n styles() {\r\n let style = {}\r\n if (this.minHeight) {\r\n style.minHeight = `${this.minHeight}px`\r\n }\r\n if (this.height) {\r\n style.height = `${this.height}px`\r\n }\r\n return style\r\n }\r\n },\r\n watch: {\r\n value: {\r\n handler(val) {\r\n if (val !== this.currentValue) {\r\n this.currentValue = val === null ? \"\" : val\r\n if (this.Quill) {\r\n this.Quill.clipboard.dangerouslyPasteHTML(this.currentValue)\r\n }\r\n }\r\n },\r\n immediate: true,\r\n },\r\n },\r\n mounted() {\r\n this.init()\r\n },\r\n beforeDestroy() {\r\n this.Quill = null\r\n },\r\n methods: {\r\n init() {\r\n const editor = this.$refs.editor\r\n this.Quill = new Quill(editor, this.options)\r\n // 如果设置了上传地址则自定义图片上传事件\r\n if (this.type == 'url') {\r\n let toolbar = this.Quill.getModule(\"toolbar\")\r\n toolbar.addHandler(\"image\", (value) => {\r\n if (value) {\r\n this.$refs.upload.$children[0].$refs.input.click()\r\n } else {\r\n this.quill.format(\"image\", false)\r\n }\r\n })\r\n this.Quill.root.addEventListener('paste', this.handlePasteCapture, true)\r\n }\r\n this.Quill.clipboard.dangerouslyPasteHTML(this.currentValue)\r\n this.Quill.on(\"text-change\", (delta, oldDelta, source) => {\r\n const html = this.$refs.editor.children[0].innerHTML\r\n const text = this.Quill.getText()\r\n const quill = this.Quill\r\n this.currentValue = html\r\n this.$emit(\"input\", html)\r\n this.$emit(\"on-change\", { html, text, quill })\r\n })\r\n this.Quill.on(\"text-change\", (delta, oldDelta, source) => {\r\n this.$emit(\"on-text-change\", delta, oldDelta, source)\r\n })\r\n this.Quill.on(\"selection-change\", (range, oldRange, source) => {\r\n this.$emit(\"on-selection-change\", range, oldRange, source)\r\n })\r\n this.Quill.on(\"editor-change\", (eventName, ...args) => {\r\n this.$emit(\"on-editor-change\", eventName, ...args)\r\n })\r\n },\r\n // 上传前校检格式和大小\r\n handleBeforeUpload(file) {\r\n const type = [\"image/jpeg\", \"image/jpg\", \"image/png\", \"image/svg\"]\r\n const isJPG = type.includes(file.type)\r\n // 检验文件格式\r\n if (!isJPG) {\r\n this.$message.error(`图片格式错误!`)\r\n return false\r\n }\r\n // 校检文件大小\r\n if (this.fileSize) {\r\n const isLt = file.size / 1024 / 1024 < this.fileSize\r\n if (!isLt) {\r\n this.$message.error(`上传文件大小不能超过 ${this.fileSize} MB!`)\r\n return false\r\n }\r\n }\r\n return true\r\n },\r\n handleUploadSuccess(res, file) {\r\n // 如果上传成功\r\n if (res.code == 200) {\r\n // 获取富文本组件实例\r\n let quill = this.Quill\r\n // 获取光标所在位置\r\n let length = quill.getSelection().index\r\n // 插入图片 res.url为服务器返回的图片地址\r\n quill.insertEmbed(length, \"image\", process.env.VUE_APP_BASE_API + res.fileName)\r\n // 调整光标到最后\r\n quill.setSelection(length + 1)\r\n } else {\r\n this.$message.error(\"图片插入失败\")\r\n }\r\n },\r\n handleUploadError() {\r\n this.$message.error(\"图片插入失败\")\r\n },\r\n // 复制粘贴图片处理\r\n handlePasteCapture(e) {\r\n const clipboard = e.clipboardData || window.clipboardData\r\n if (clipboard && clipboard.items) {\r\n for (let i = 0; i < clipboard.items.length; i++) {\r\n const item = clipboard.items[i]\r\n if (item.type.indexOf('image') !== -1) {\r\n e.preventDefault()\r\n const file = item.getAsFile()\r\n this.insertImage(file)\r\n }\r\n }\r\n }\r\n },\r\n insertImage(file) {\r\n const formData = new FormData()\r\n formData.append(\"file\", file)\r\n axios.post(this.uploadUrl, formData, { headers: { \"Content-Type\": \"multipart/form-data\", Authorization: this.headers.Authorization } }).then(res => {\r\n this.handleUploadSuccess(res.data)\r\n })\r\n }\r\n }\r\n}\r\n</script>\r\n\r\n<style>\r\n.editor, .ql-toolbar {\r\n white-space: pre-wrap !important;\r\n line-height: normal !important;\r\n}\r\n.quill-img {\r\n display: none;\r\n}\r\n.ql-snow .ql-tooltip[data-mode=\"link\"]::before {\r\n content: \"请输入链接地址:\";\r\n}\r\n.ql-snow .ql-tooltip.ql-editing a.ql-action::after {\r\n border-right: 0px;\r\n content: \"保存\";\r\n padding-right: 0px;\r\n}\r\n.ql-snow .ql-tooltip[data-mode=\"video\"]::before {\r\n content: \"请输入视频地址:\";\r\n}\r\n.ql-snow .ql-picker.ql-size .ql-picker-label::before,\r\n.ql-snow .ql-picker.ql-size .ql-picker-item::before {\r\n content: \"14px\";\r\n}\r\n.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=\"small\"]::before,\r\n.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=\"small\"]::before {\r\n content: \"10px\";\r\n}\r\n.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=\"large\"]::before,\r\n.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=\"large\"]::before {\r\n content: \"18px\";\r\n}\r\n.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=\"huge\"]::before,\r\n.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=\"huge\"]::before {\r\n content: \"32px\";\r\n}\r\n.ql-snow .ql-picker.ql-header .ql-picker-label::before,\r\n.ql-snow .ql-picker.ql-header .ql-picker-item::before {\r\n content: \"文本\";\r\n}\r\n.ql-snow .ql-picker.ql-header .ql-picker-label[data-value=\"1\"]::before,\r\n.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"1\"]::before {\r\n content: \"标题1\";\r\n}\r\n.ql-snow .ql-picker.ql-header .ql-picker-label[data-value=\"2\"]::before,\r\n.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"2\"]::before {\r\n content: \"标题2\";\r\n}\r\n.ql-snow .ql-picker.ql-header .ql-picker-label[data-value=\"3\"]::before,\r\n.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"3\"]::before {\r\n content: \"标题3\";\r\n}\r\n.ql-snow .ql-picker.ql-header .ql-picker-label[data-value=\"4\"]::before,\r\n.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"4\"]::before {\r\n content: \"标题4\";\r\n}\r\n.ql-snow .ql-picker.ql-header .ql-picker-label[data-value=\"5\"]::before,\r\n.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"5\"]::before {\r\n content: \"标题5\";\r\n}\r\n.ql-snow .ql-picker.ql-header .ql-picker-label[data-value=\"6\"]::before,\r\n.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"6\"]::before {\r\n content: \"标题6\";\r\n}\r\n.ql-snow .ql-picker.ql-font .ql-picker-label::before,\r\n.ql-snow .ql-picker.ql-font .ql-picker-item::before {\r\n content: \"标准字体\";\r\n}\r\n.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=\"serif\"]::before,\r\n.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=\"serif\"]::before {\r\n content: \"衬线字体\";\r\n}\r\n.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=\"monospace\"]::before,\r\n.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=\"monospace\"]::before {\r\n content: \"等宽字体\";\r\n}\r\n</style>\r\n"]}]}