¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div :style="styleEditor"> |
| | | <Toolbar style="border-bottom: 1px solid #ccc" :editor="editor" :defaultConfig="toolbarConfig" :mode="mode" /> |
| | | <Editor style="min-height: 80px; overflow-y: hidden;" v-model="html" :defaultConfig="editorConfig" :mode="mode" |
| | | @onCreated="onCreated" @onChange="onChange" /> |
| | | </div> |
| | | </template> |
| | | <style src="@wangeditor/editor/dist/css/style.css"></style> |
| | | <script> |
| | | import Vue from 'vue' |
| | | import { Editor, Toolbar } from '@wangeditor/editor-for-vue' |
| | | import { Loading } from 'element-ui'; |
| | | let loadingInstance = null |
| | | export default Vue.extend({ |
| | | props: { |
| | | richData: { // ç¶ç»ä»¶ä¼ éçæ°æ® |
| | | type: String, |
| | | default: '' |
| | | }, |
| | | styleEditor: '', |
| | | readonly: false, // æ¯å¦å¯ä»¥è¾å
¥ |
| | | }, |
| | | name:'RichEditor', |
| | | components: { Editor, Toolbar }, |
| | | data() { |
| | | return { |
| | | editor: null, |
| | | html: '', |
| | | toolbarConfig: { // å·¥å
·æ é
ç½® |
| | | toolbarKeys: this.readonly ? ["fullScreen"]: [ // æ¾ç¤ºæå®çèå项 |
| | | "bold", // ç²ä½ |
| | | "underline", // ä¸å线 |
| | | "italic", // æä½ |
| | | "through", // å é¤çº¿ |
| | | "code", // è¡å
代ç |
| | | "sub", // 䏿 |
| | | "sup", // 䏿 |
| | | "clearStyle", // æ¸
餿 ¼å¼ |
| | | "color", // åä½é¢è² |
| | | "bgColor", // èæ¯è² |
| | | "fontSize", // åå· |
| | | "fontFamily", // åä½ |
| | | "indent", // å¢å ç¼©è¿ |
| | | "delIndent", // åå°ç¼©è¿ |
| | | "justifyLeft", // å·¦å¯¹é½ |
| | | "justifyRight", // å³å¯¹é½ |
| | | "justifyCenter", // å±
ä¸å¯¹é½ |
| | | "justifyJustify", // ä¸¤ç«¯å¯¹é½ |
| | | "lineHeight", // è¡é« |
| | | // "viewImageLink", // æ¥ç龿¥ |
| | | "divider", // åå²çº¿ |
| | | "emotion", // 表æ
|
| | | "insertLink", // æå
¥é¾æ¥ |
| | | // "editLink", // ä¿®æ¹é¾æ¥ |
| | | // "unLink", // 忶龿¥ |
| | | // "viewLink", // æ¥ç龿¥ |
| | | "codeBlock", // 代ç å |
| | | "blockquote", // å¼ç¨ |
| | | "headerSelect", // æ é¢ |
| | | // "header1", // æ é¢1 |
| | | // "header2", // æ é¢2 |
| | | // "header3", // æ é¢3 |
| | | // "header4", // æ é¢4 |
| | | // "header5", // æ é¢5 |
| | | // "todo", // å¾
å |
| | | "redo", // éå |
| | | "undo", // æ¤é |
| | | // "enter", // å车 |
| | | // "bulletedList", // æ åºå表 |
| | | // "numberedList", // æåºå表 |
| | | // "codeSelectLang" // éæ©è¯è¨ |
| | | // è¡¨æ ¼åè½åç» |
| | | /* { |
| | | key: 'table-style', // å¿
å¡«ï¼è¦ä»¥ group å¼å¤´ |
| | | title: 'è¡¨æ ¼', // å¿
å¡« |
| | | // iconSvg: '<svg>....</svg>', // å¯é |
| | | menuKeys: [ |
| | | "insertTable", // æå
¥è¡¨æ ¼ |
| | | "deleteTable", // å é¤è¡¨æ ¼ |
| | | "insertTableRow", // æå
¥è¡ |
| | | "deleteTableRow", // å é¤è¡ |
| | | "insertTableCol", // æå
¥å |
| | | "deleteTableCol", // å é¤å |
| | | "tableHeader", // 表头 |
| | | "tableFullWidth", // 宽度èªéåº |
| | | ] // ä¸çº§èå key ï¼å¿
å¡« |
| | | },*/ |
| | | // ä¸ä¼ å¾çåç» |
| | | { |
| | | key: 'img-style', // å¿
å¡«ï¼è¦ä»¥ group å¼å¤´ |
| | | title: 'å¾ç', // å¿
å¡« |
| | | // iconSvg: '<svg>....</svg>', // å¯é |
| | | menuKeys: [ |
| | | "uploadImage", // ä¸ä¼ å¾ç |
| | | "insertImage", // ç½ç»å¾ç |
| | | "deleteImage", // å é¤å¾ç |
| | | "editImage", // ç¼è¾å¾ç |
| | | "imageWidth30", // å¾ç宽度ç¸å¯¹äºç¼è¾å¨å®½åº¦çç¾åæ¯30 |
| | | "imageWidth50", // å¾ç宽度ç¸å¯¹äºç¼è¾å¨å®½åº¦çç¾åæ¯50 |
| | | "imageWidth100", // å¾ç宽度ç¸å¯¹äºç¼è¾å¨å®½åº¦çç¾åæ¯100 |
| | | ] // ä¸çº§èå key ï¼å¿
å¡« |
| | | }, |
| | | // è§é¢åç» |
| | | { |
| | | key: 'video-style', // å¿
å¡«ï¼è¦ä»¥ group å¼å¤´ |
| | | title: 'è§é¢', // å¿
å¡« |
| | | // iconSvg: '<svg>....</svg>', // å¯é |
| | | menuKeys: [ |
| | | "insertVideo", // æå
¥ç½ç»è§é¢ |
| | | "uploadVideo", // ä¸ä¼ è§é¢ |
| | | "editVideoSize", // ä¿®æ¹è§é¢å°ºå¯¸ |
| | | ] // ä¸çº§èå key ï¼å¿
å¡« |
| | | }, |
| | | "fullScreen", // å
¨å± |
| | | ], |
| | | excludeKeys: [ // éèæå®çèå项 |
| | | // 'headerSelect', |
| | | // 'video-style' |
| | | // æé¤èåç»ï¼åèåç» key çå¼å³å¯ |
| | | ], |
| | | |
| | | }, |
| | | editorConfig: { // ç¼è¾å¨é
ç½® |
| | | placeholder: '请è¾å
¥å
容...', |
| | | readOnly: this.readonly, // æ¯å¦åªè¯»ï¼é»è®¤false |
| | | autoFocus: false, // æ¯å¦èªå¨focusï¼é»è®¤ä¸ºtrue |
| | | scroll: true, // é
ç½®ç¼è¾å¨æ¯å¦æ¯ææ»å¨ï¼é»è®¤ä¸º true ãæ³¨æï¼æ¤æ¶ä¸è¦åºå® editor-container çé«åº¦ï¼è®¾ç½®ä¸ä¸ª min-height å³å¯ã |
| | | maxLength: 20000, // æå¤§éå¶ï¼é¿å
å
容è¿å¤å¡é¡¿ |
| | | MENU_CONF: { |
| | | // å¾çä¸ä¼ |
| | | uploadImage: { |
| | | server: process.env.VUE_APP_API_PREFIX + '/web/public/uploadLocal?folder=', |
| | | fieldName: 'file', |
| | | // å个æä»¶çæå¤§ä½ç§¯éå¶ï¼é»è®¤ä¸º 2M |
| | | maxFileSize: 10 * 1024 * 1024, // 10M |
| | | // æå¤å¯ä¸ä¼ å 个æä»¶ï¼é»è®¤ä¸º 100 |
| | | maxNumberOfFiles: 10, |
| | | // éæ©æä»¶æ¶çç±»åéå¶ï¼é»è®¤ä¸º ['image/*'] ãå¦ä¸æ³éå¶ï¼å设置为 [] |
| | | allowedFileTypes: ['image/*'], |
| | | // èªå®ä¹ä¸ä¼ åæ°ï¼ä¾å¦ä¼ ééªè¯ç token çãåæ°ä¼è¢«æ·»å å° formData ä¸ï¼ä¸èµ·ä¸ä¼ å°æå¡ç«¯ã |
| | | meta: { |
| | | }, |
| | | // å° meta æ¼æ¥å° url åæ°ä¸ï¼é»è®¤ false |
| | | metaWithUrl: false, |
| | | // èªå®ä¹å¢å http header |
| | | // headers: { Authorization: "Bearer " + getToken() }, |
| | | // è·¨åæ¯å¦ä¼ é cookie ï¼é»è®¤ä¸º false |
| | | withCredentials: true, |
| | | // è¶
æ¶æ¶é´ï¼é»è®¤ä¸º 10 ç§ |
| | | timeout: 10 * 1000, //10 ç§ |
| | | // ä¸ä¼ å |
| | | onBeforeUpload(files) { |
| | | loadingInstance = Loading.service({ |
| | | lock: true, |
| | | text: 'ä¸ä¼ ä¸...', |
| | | spinner: 'el-icon-loading', |
| | | background: 'rgba(0, 0, 0, 0.7)' |
| | | }); |
| | | return files; |
| | | }, |
| | | // èªå®ä¹æå
¥å¾ç |
| | | customInsert(res, insertFn) { |
| | | console.log(res); |
| | | // å 为èªå®ä¹æå
¥å¯¼è´onSuccessä¸onFailedåè°å½æ°ä¸èµ·ä½ç¨,èªå·±æå¨å¤ç |
| | | // å
å
³éçå¾
çMessage |
| | | loadingInstance = Loading.service({ |
| | | lock: true, |
| | | text: 'ä¸ä¼ ä¸...', |
| | | spinner: 'el-icon-loading', |
| | | background: 'rgba(0, 0, 0, 0.7)' |
| | | }).close(); |
| | | if (res.code === 200) { |
| | | // Message.success({ |
| | | // message: `${res.data.originalName} ä¸ä¼ æå` |
| | | // }); |
| | | } else { |
| | | // Message.error({ |
| | | // message: `${res.data.originalName} ä¸ä¼ 失败ï¼è¯·éæ°å°è¯` |
| | | // }); |
| | | } |
| | | insertFn(res.data.url, res.data.originname, res.data.imgname); |
| | | }, |
| | | |
| | | // å个æä»¶ä¸ä¼ æåä¹å |
| | | onSuccess(file, res) { |
| | | console.log(`${file.originalFilename} ä¸ä¼ æå`, res); |
| | | }, |
| | | // å个æä»¶ä¸ä¼ 失败 |
| | | onFailed(file, res) { |
| | | console.log(`${file.originalFilename} ä¸ä¼ 失败`, res); |
| | | loadingInstance.close(); |
| | | }, |
| | | // ä¸ä¼ è¿åº¦çåè°å½æ° |
| | | onProgress(progress) { |
| | | console.log('progress', progress); |
| | | // progress æ¯ 0-100 çæ°å |
| | | }, |
| | | // ä¸ä¼ éè¯¯ï¼æè
触å timeout è¶
æ¶ |
| | | onError(file, err, res) { |
| | | loadingInstance.close(); |
| | | console.log(`${file.originalFilename} ä¸ä¼ åºé`, err, res); |
| | | } |
| | | }, |
| | | // è§é¢ä¸ä¼ |
| | | uploadVideo: { |
| | | fieldName: 'file', |
| | | server: process.env.VUE_APP_API_PREFIX + '/web/public/upload?folder=richeditor', |
| | | // å个æä»¶çæå¤§ä½ç§¯éå¶ï¼é»è®¤ä¸º 10M |
| | | maxFileSize: 50 * 1024 * 1024, // 50M |
| | | // æå¤å¯ä¸ä¼ å 个æä»¶ï¼é»è®¤ä¸º 5 |
| | | maxNumberOfFiles: 3, |
| | | // éæ©æä»¶æ¶çç±»åéå¶ï¼é»è®¤ä¸º ['video/*'] ãå¦ä¸æ³éå¶ï¼å设置为 [] |
| | | allowedFileTypes: ['video/*'], |
| | | // èªå®ä¹ä¸ä¼ åæ°ï¼ä¾å¦ä¼ ééªè¯ç token çãåæ°ä¼è¢«æ·»å å° formData ä¸ï¼ä¸èµ·ä¸ä¼ å°æå¡ç«¯ã |
| | | meta: { |
| | | // token: 'xxx', |
| | | // otherKey: 'yyy' |
| | | }, |
| | | // å° meta æ¼æ¥å° url åæ°ä¸ï¼é»è®¤ false |
| | | metaWithUrl: false, |
| | | |
| | | // èªå®ä¹å¢å http header |
| | | headers: { |
| | | // Authorization: "Bearer " + getToken() |
| | | // otherKey: 'xxx' |
| | | }, |
| | | // è·¨åæ¯å¦ä¼ é cookie ï¼é»è®¤ä¸º false |
| | | withCredentials: true, |
| | | // è¶
æ¶æ¶é´ï¼é»è®¤ä¸º 30 ç§ |
| | | timeout: 1000 * 1000, // 1000 ç§, |
| | | // ä¸ä¼ ä¹å触å |
| | | onBeforeUpload(file) { |
| | | return file; |
| | | }, |
| | | // èªå®ä¹æå
¥è§é¢ |
| | | customInsert(res, insertFn) { |
| | | // å 为èªå®ä¹æå
¥å¯¼è´onSuccessä¸onFailedåè°å½æ°ä¸èµ·ä½ç¨,èªå·±æå¨å¤ç |
| | | // å
å
³éçå¾
çMessage |
| | | // Message.closeAll(); |
| | | if (res.code === 200) { |
| | | // Message.success({ |
| | | // message: `${res.data.originalName} ä¸ä¼ æå` |
| | | // }); |
| | | } else { |
| | | // Message.error({ |
| | | // message: `${res.data.originalName} ä¸ä¼ 失败ï¼è¯·éæ°å°è¯` |
| | | // }); |
| | | } |
| | | insertFn(res.data.url, res.data.url); |
| | | }, |
| | | // ä¸ä¼ è¿åº¦çåè°å½æ° |
| | | onProgress(progress) { |
| | | console.log(progress); |
| | | // onProgress(progress) { // JS è¯æ³ |
| | | // progress æ¯ 0-100 çæ°å |
| | | }, |
| | | // // å个æä»¶ä¸ä¼ æåä¹å |
| | | // onSuccess(file, res) { |
| | | // console.log(`${file.name} ä¸ä¼ æå`, res); |
| | | // this.successMsg(file); |
| | | // }, |
| | | // // å个æä»¶ä¸ä¼ 失败 |
| | | // onFailed(file, res) { |
| | | // console.log(`${file.name} ä¸ä¼ 失败`, res); |
| | | // this.errorMsg(file); |
| | | // }, |
| | | // ä¸ä¼ éè¯¯ï¼æè
触å timeout è¶
æ¶ |
| | | onError(file, err, res) { |
| | | console.log(`${file.name} ä¸ä¼ åºé`, err, res); |
| | | // Notification.error({ |
| | | // title: 'é误', |
| | | // message: `${file.name} ä¸ä¼ 失败ï¼è¯·éæ°å°è¯` |
| | | // }); |
| | | } |
| | | } |
| | | } |
| | | }, |
| | | mode: 'default', // or 'simple' |
| | | } |
| | | }, |
| | | watch: { |
| | | richData: function (value) { |
| | | this.html = value |
| | | console.log("onChange123", value); // onChange æ¶è·åç¼è¾å¨ææ°å
容 |
| | | this.$nextTick(()=>{ |
| | | this.html = value |
| | | }) |
| | | }, |
| | | readonly: function (value) { |
| | | this.readonly = value |
| | | }, |
| | | styleEditor: function (value) { |
| | | this.styleEditor = value |
| | | }, |
| | | }, |
| | | mounted() { |
| | | // éè¦å¨ç¼è¾å¨åå»ºå®æ¯åå¨èµå¼ |
| | | this.$nextTick(()=>{ |
| | | this.html = this.richData |
| | | }) |
| | | }, |
| | | methods: { |
| | | // ç¼è¾å¨åå»ºå®æ¯æ¶çåè°å½æ° |
| | | onCreated(editor) { |
| | | var that =this |
| | | this.editor = Object.seal(editor) // ä¸å®è¦ç¨ Object.seal() ï¼å¦å伿¥é |
| | | setTimeout(function (){ |
| | | that.html = that.richData |
| | | // alert(that.html) |
| | | },15000) |
| | | }, |
| | | // ç¼è¾å¨å
容ãéåºååæ¶çåè°å½æ° |
| | | onChange(editor) { |
| | | this.$emit('getWangedditor', editor.getHtml()) |
| | | console.log("onChange", editor.getHtml()); // onChange æ¶è·åç¼è¾å¨ææ°å
容 |
| | | }, |
| | | }, |
| | | beforeDestroy() { |
| | | // ç¼è¾å¨éæ¯æ¶çåè°å½æ°ãè°ç¨ editor.destroy() å³å¯éæ¯ç¼è¾å¨ |
| | | const editor = this.editor |
| | | if (editor == null) return |
| | | editor.destroy() // ç»ä»¶éæ¯æ¶ï¼åæ¶éæ¯ç¼è¾å¨ |
| | | } |
| | | }) |
| | | </script> |
| | | <style> |
| | | ::v-deep .w-e-text-container { |
| | | height: 420px !important; |
| | | } |
| | | .w-e-text-container .w-e-scroll { |
| | | height: 500px !important; |
| | | -webkit-overflow-scrolling: touch; |
| | | } |
| | | </style> |
| | | |