| | |
| | | <template> |
| | | <div> |
| | | <!-- å¾çä¸ä¼ ç»ä»¶è¾
å© --> |
| | | <el-upload |
| | | class="avatar-uploader quill-img" |
| | | :action="uploadImgUrl" |
| | | name="file" |
| | | :headers="headers" |
| | | :show-file-list="false" |
| | | :on-success="quillImgSuccess" |
| | | :on-error="uploadError" |
| | | :before-upload="quillImgBefore" |
| | | accept='.jpg,.jpeg,.png,.gif' |
| | | ></el-upload> |
| | | |
| | | <!-- 坿æ¬ç»ä»¶ --> |
| | | <quill-editor |
| | | class="editor" |
| | | v-model="content" |
| | | ref="quillEditor" |
| | | :options="editorOption" |
| | | @blur="onEditorBlur($event)" |
| | | @focus="onEditorFocus($event)" |
| | | @change="onEditorChange($event)" |
| | | ></quill-editor> |
| | | </div> |
| | | <div class="editor" ref="editor" :style="styles"></div> |
| | | </template> |
| | | |
| | | <script> |
| | | import { getToken } from '@/utils/auth' |
| | | |
| | | // å·¥å
·æ é
ç½® |
| | | const toolbarOptions = [ |
| | | ["bold", "italic", "underline", "strike"], // å ç² æä½ ä¸å线 å é¤çº¿ |
| | | ["blockquote", "code-block"], // å¼ç¨ 代ç å |
| | | [{ list: "ordered" }, { list: "bullet" }], // æåºãæ åºå表 |
| | | [{ indent: "-1" }, { indent: "+1" }], // ç¼©è¿ |
| | | [{ size: ["small", false, "large", "huge"] }], // åä½å¤§å° |
| | | [{ header: [1, 2, 3, 4, 5, 6, false] }], // æ é¢ |
| | | [{ color: [] }, { background: [] }], // åä½é¢è²ãåä½èæ¯é¢è² |
| | | [{ align: [] }], // 坹齿¹å¼ |
| | | ["clean"], // æ¸
é¤ææ¬æ ¼å¼ |
| | | ["link", "image", "video"] // 龿¥ãå¾çãè§é¢ |
| | | ]; |
| | | |
| | | import { quillEditor } from "vue-quill-editor"; |
| | | import Quill from "quill"; |
| | | import "quill/dist/quill.core.css"; |
| | | import "quill/dist/quill.snow.css"; |
| | | import "quill/dist/quill.bubble.css"; |
| | | |
| | | export default { |
| | | name: "Editor", |
| | | props: { |
| | | /* ç¼è¾å¨çå
容 */ |
| | | value: { |
| | | type: String |
| | | type: String, |
| | | default: "", |
| | | }, |
| | | /* å¾çå¤§å° */ |
| | | maxSize: { |
| | | /* é«åº¦ */ |
| | | height: { |
| | | type: Number, |
| | | default: 4000 //kb |
| | | } |
| | | default: null, |
| | | }, |
| | | /* æå°é«åº¦ */ |
| | | minHeight: { |
| | | type: Number, |
| | | default: null, |
| | | }, |
| | | }, |
| | | components: { quillEditor }, |
| | | data() { |
| | | return { |
| | | content: this.value, |
| | | uploadImgUrl: "", |
| | | editorOption: { |
| | | theme: "snow", // or 'bubble' |
| | | placeholder: "请è¾å
¥å
容", |
| | | Quill: null, |
| | | currentValue: "", |
| | | options: { |
| | | theme: "snow", |
| | | bounds: document.body, |
| | | debug: "warn", |
| | | modules: { |
| | | toolbar: { |
| | | container: toolbarOptions, |
| | | handlers: { |
| | | image: function(value) { |
| | | if (value) { |
| | | // 触åinputæ¡éæ©å¾çæä»¶ |
| | | document.querySelector(".quill-img input").click(); |
| | | } else { |
| | | this.quill.format("image", false); |
| | | } |
| | | } |
| | | } |
| | | // å·¥å
·æ é
ç½® |
| | | toolbar: [ |
| | | ["bold", "italic", "underline", "strike"], // å ç² æä½ ä¸å线 å é¤çº¿ |
| | | ["blockquote", "code-block"], // å¼ç¨ 代ç å |
| | | [{ list: "ordered" }, { list: "bullet" }], // æåºãæ åºå表 |
| | | [{ indent: "-1" }, { indent: "+1" }], // ç¼©è¿ |
| | | [{ size: ["small", false, "large", "huge"] }], // åä½å¤§å° |
| | | [{ header: [1, 2, 3, 4, 5, 6, false] }], // æ é¢ |
| | | [{ color: [] }, { background: [] }], // åä½é¢è²ãåä½èæ¯é¢è² |
| | | [{ align: [] }], // 坹齿¹å¼ |
| | | ["clean"], // æ¸
é¤ææ¬æ ¼å¼ |
| | | ["link", "image", "video"] // 龿¥ãå¾çãè§é¢ |
| | | ], |
| | | }, |
| | | placeholder: "请è¾å
¥å
容", |
| | | readOnly: false, |
| | | }, |
| | | }; |
| | | }, |
| | | computed: { |
| | | styles() { |
| | | let style = {}; |
| | | if (this.minHeight) { |
| | | style.minHeight = `${this.minHeight}px`; |
| | | } |
| | | if (this.height) { |
| | | style.height = `${this.height}px`; |
| | | } |
| | | return style; |
| | | }, |
| | | }, |
| | | watch: { |
| | | value: { |
| | | handler(val) { |
| | | if (val !== this.currentValue) { |
| | | this.currentValue = val; |
| | | if (this.Quill) { |
| | | this.Quill.pasteHTML(this.value); |
| | | } |
| | | } |
| | | }, |
| | | uploadImgUrl: process.env.VUE_APP_BASE_API + "/common/upload", // ä¸ä¼ çå¾çæå¡å¨å°å |
| | | headers: { |
| | | Authorization: 'Bearer ' + getToken() |
| | | } |
| | | }; |
| | | immediate: true, |
| | | }, |
| | | }, |
| | | watch: { |
| | | value: function() { |
| | | this.content = this.value; |
| | | } |
| | | mounted() { |
| | | this.init(); |
| | | }, |
| | | beforeDestroy() { |
| | | this.Quill = null; |
| | | }, |
| | | methods: { |
| | | onEditorBlur() { |
| | | //失å»ç¦ç¹äºä»¶ |
| | | init() { |
| | | const editor = this.$refs.editor; |
| | | this.Quill = new Quill(editor, this.options); |
| | | this.Quill.pasteHTML(this.currentValue); |
| | | this.Quill.on("text-change", (delta, oldDelta, source) => { |
| | | const html = this.$refs.editor.children[0].innerHTML; |
| | | const text = this.Quill.getText(); |
| | | const quill = this.Quill; |
| | | this.currentValue = html; |
| | | this.$emit("input", html); |
| | | this.$emit("on-change", { html, text, quill }); |
| | | }); |
| | | this.Quill.on("text-change", (delta, oldDelta, source) => { |
| | | this.$emit("on-text-change", delta, oldDelta, source); |
| | | }); |
| | | this.Quill.on("selection-change", (range, oldRange, source) => { |
| | | this.$emit("on-selection-change", range, oldRange, source); |
| | | }); |
| | | this.Quill.on("editor-change", (eventName, ...args) => { |
| | | this.$emit("on-editor-change", eventName, ...args); |
| | | }); |
| | | }, |
| | | onEditorFocus() { |
| | | //è·å¾ç¦ç¹äºä»¶ |
| | | }, |
| | | onEditorChange() { |
| | | //å
容æ¹åäºä»¶ |
| | | this.$emit("input", this.content); |
| | | }, |
| | | |
| | | // 坿æ¬å¾çä¸ä¼ å |
| | | quillImgBefore(file) { |
| | | let fileType = file.type; |
| | | if(fileType === 'image/jpeg' || fileType === 'image/png'){ |
| | | return true; |
| | | }else { |
| | | this.$message.error('请æå
¥å¾çç±»åæä»¶(jpg/jpeg/png)'); |
| | | return false; |
| | | } |
| | | }, |
| | | |
| | | quillImgSuccess(res, file) { |
| | | // res为å¾çæå¡å¨è¿åçæ°æ® |
| | | // è·å坿æ¬ç»ä»¶å®ä¾ |
| | | let quill = this.$refs.quillEditor.quill; |
| | | // 妿ä¸ä¼ æå |
| | | if (res.code == 200) { |
| | | // è·åå
æ æå¨ä½ç½® |
| | | let length = quill.getSelection().index; |
| | | // æå
¥å¾ç res.url为æå¡å¨è¿åçå¾çå°å |
| | | quill.insertEmbed(length, "image", res.url); |
| | | // è°æ´å
æ å°æå |
| | | quill.setSelection(length + 1); |
| | | } else { |
| | | this.$message.error("å¾çæå
¥å¤±è´¥"); |
| | | } |
| | | }, |
| | | // 坿æ¬å¾çä¸ä¼ 失败 |
| | | uploadError() { |
| | | // loadingå¨ç»æ¶å¤± |
| | | this.$message.error("å¾çæå
¥å¤±è´¥"); |
| | | } |
| | | } |
| | | }, |
| | | }; |
| | | </script> |
| | | </script> |
| | | |
| | | <style> |
| | | .editor { |
| | | white-space: pre-wrap!important; |
| | | line-height: normal !important; |
| | | height: 192px; |
| | | } |
| | | .quill-img { |
| | | display: none; |