From e9717d6ebed478c4ff7ddbf539d1a591bbf5185a Mon Sep 17 00:00:00 2001 From: liukangdong <898885815@qq.com> Date: 星期三, 12 六月 2024 10:49:24 +0800 Subject: [PATCH] Merge branch 'master' of http://139.186.142.91:10010/r/productDev/dmvisit --- admin/src/components/common/RichEditor.vue | 395 +++++++++++++++++++++++++++++++++++++++----------------- 1 files changed, 274 insertions(+), 121 deletions(-) diff --git a/admin/src/components/common/RichEditor.vue b/admin/src/components/common/RichEditor.vue index 7ed7fdc..bdcf1bf 100644 --- a/admin/src/components/common/RichEditor.vue +++ b/admin/src/components/common/RichEditor.vue @@ -1,162 +1,315 @@ <template> - <div class="wang_editor"> - <Toolbar - style="border-bottom: 1px solid #ccc" - :editor="editor" - :default-config="toolbarConfig" - :mode="mode" - /> - <Editor - v-model="html" - style="min-height: 200px" - :default-config="editorConfig" - :mode="mode" - @onCreated="onCreated" - /> + <div :style="styleEditor"> + <Toolbar style="border-bottom: 1px solid #ccc" :editor="editor" :defaultConfig="toolbarConfig" :mode="mode" /> + <Editor style="height: 300px; 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 '@wangeditor/editor/dist/css/style.css' -import axios from 'axios' - -import { uploadFile } from '@/api' - -const uploadConfig = { - action: uploadFile, // 蹇呭~鍙傛暟 鍥剧墖涓婁紶鍦板潃 - methods: 'POST', // 蹇呭~鍙傛暟 鍥剧墖涓婁紶鏂瑰紡 - token: '', // 鍙�夊弬鏁� 濡傛灉闇�瑕乼oken楠岃瘉锛屽亣璁句綘鐨則oken鏈夊瓨鏀惧湪sessionStorage - name: 'file', // 蹇呭~鍙傛暟 鏂囦欢鐨勫弬鏁板悕 - size: 500, // 鍙�夊弬鏁� 鍥剧墖澶у皬锛屽崟浣嶄负Kb, 1M = 1024Kb - accept: 'image/png, image/gif, image/jpeg, image/bmp, image/x-icon' // 鍙�� 鍙笂浼犵殑鍥剧墖鏍煎紡 -} -export default { - components: { - Editor, - Toolbar - }, +import { Loading } from 'element-ui'; +export default Vue.extend({ props: { - info: { + richData: { // 鐖剁粍浠朵紶閫掔殑鏁版嵁 type: String, default: '' }, - default: { - type: String, - default: '' - }, - placeholder: { - type: String, - default: '璇疯緭鍏ュ唴瀹�...' - } + styleEditor: '', + readonly: false, // 鏄惁鍙互杈撳叆 }, - data () { + name:'RichEditor', + components: { Editor, Toolbar }, + data() { return { editor: null, - toolbarConfig: {}, - editorConfig: { - placeholder: this.placeholder, + html: '', + toolbarConfig: { // 宸ュ叿鏍忛厤缃� + toolbarKeys: this.readonly ? ["fullScreen"]: [ // 鏄剧ず鎸囧畾鐨勮彍鍗曢」 + "bold", // 绮椾綋 + "underline", // 涓嬪垝绾� + "italic", // 鏂滀綋 + "through", // 鍒犻櫎绾� + "code", // 琛屽唴浠g爜 + "sub", // 涓嬫爣 + "sup", // 涓婃爣 + "clearStyle", // 娓呴櫎鏍煎紡 + "color", // 瀛椾綋棰滆壊 + "bgColor", // 鑳屾櫙鑹� + "fontSize", // 瀛楀彿 + "fontFamily", // 瀛椾綋 + "indent", // 澧炲姞缂╄繘 + "delIndent", // 鍑忓皯缂╄繘 + "justifyLeft", // 宸﹀榻� + "justifyRight", // 鍙冲榻� + "justifyCenter", // 灞呬腑瀵归綈 + "justifyJustify", // 涓ょ瀵归綈 + "lineHeight", // 琛岄珮 + // "viewImageLink", // 鏌ョ湅閾炬帴 + "divider", // 鍒嗗壊绾� + "emotion", // 琛ㄦ儏 + "insertLink", // 鎻掑叆閾炬帴 + // "editLink", // 淇敼閾炬帴 + // "unLink", // 鍙栨秷閾炬帴 + // "viewLink", // 鏌ョ湅閾炬帴 + "codeBlock", // 浠g爜鍧� + "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, // 鏄惁鍙锛岄粯璁alse + autoFocus: false, // 鏄惁鑷姩focus锛岄粯璁や负true + scroll: true, // 閰嶇疆缂栬緫鍣ㄦ槸鍚︽敮鎸佹粴鍔紝榛樿涓� true 銆傛敞鎰忥紝姝ゆ椂涓嶈鍥哄畾 editor-container 鐨勯珮搴︼紝璁剧疆涓�涓� min-height 鍗冲彲銆� + maxLength: 20000, // 鏈�澶ч檺鍒讹紝閬垮厤鍐呭杩囧鍗¢】 MENU_CONF: { + // 鍥剧墖涓婁紶 uploadImage: { - html: this.info, - server: uploadFile, + server: process.env.VUE_APP_BASE_API + "/common/upload", + fieldName: 'file', // 鍗曚釜鏂囦欢鐨勬渶澶т綋绉檺鍒讹紝榛樿涓� 2M - maxFileSize: 5 * 1024 * 1024, // 1M + maxFileSize: 10 * 1024 * 1024, // 10M + // 鏈�澶氬彲涓婁紶鍑犱釜鏂囦欢锛岄粯璁や负 100 + maxNumberOfFiles: 10, // 閫夋嫨鏂囦欢鏃剁殑绫诲瀷闄愬埗锛岄粯璁や负 ['image/*'] 銆傚涓嶆兂闄愬埗锛屽垯璁剧疆涓� [] allowedFileTypes: ['image/*'], - // 鑷畾涔変笂浼犲弬鏁帮紝渚嬪浼犻�掗獙璇佺殑 token 绛夈�傚弬鏁颁細琚坊鍔犲埌 formData 涓紝涓�璧蜂笂浼犲埌鏈嶅姟绔� + // 鑷畾涔変笂浼犲弬鏁帮紝渚嬪浼犻�掗獙璇佺殑 token 绛夈�傚弬鏁颁細琚坊鍔犲埌 formData 涓紝涓�璧蜂笂浼犲埌鏈嶅姟绔�� meta: { - token: '', - otherKey: '', - folder: 'COURSE_IMG' }, + // 灏� meta 鎷兼帴鍒� url 鍙傛暟涓紝榛樿 false + metaWithUrl: false, + // 鑷畾涔夊鍔� http header + // headers: { Authorization: "Bearer " + getToken() }, + // 璺ㄥ煙鏄惁浼犻�� cookie 锛岄粯璁や负 false + withCredentials: true, + // 瓒呮椂鏃堕棿锛岄粯璁や负 10 绉� + timeout: 10 * 1000, //10 绉� + // 涓婁紶鍓� + onBeforeUpload(files) { + Loading.service({ + lock: true, + text: '涓婁紶涓�...', + spinner: 'el-icon-loading', + background: 'rgba(0, 0, 0, 0.7)' + }); + return files; + }, + // 鑷畾涔夋彃鍏ュ浘鐗� + customInsert(res, insertFn) { + console.log(res); + // 鍥犱负鑷畾涔夋彃鍏ュ鑷磑nSuccess涓巓nFailed鍥炶皟鍑芥暟涓嶈捣浣滅敤,鑷繁鎵嬪姩澶勭悊 + // 鍏堝叧闂瓑寰呯殑Message + 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.url, res.originalFilename, res.newFileName); + }, + + // 鍗曚釜鏂囦欢涓婁紶鎴愬姛涔嬪悗 + onSuccess(file, res) { + console.log(`${file.originalFilename} 涓婁紶鎴愬姛`, res); + }, + // 鍗曚釜鏂囦欢涓婁紶澶辫触 + onFailed(file, res) { + console.log(`${file.originalFilename} 涓婁紶澶辫触`, res); + }, + // 涓婁紶杩涘害鐨勫洖璋冨嚱鏁� + onProgress(progress) { + console.log('progress', progress); + // progress 鏄� 0-100 鐨勬暟瀛� + }, + // 涓婁紶閿欒锛屾垨鑰呰Е鍙� timeout 瓒呮椂 + onError(file, err, res) { + console.log(`${file.originalFilename} 涓婁紶鍑洪敊`, err, res); + } + }, + // 瑙嗛涓婁紶 + uploadVideo: { + fieldName: 'file', + server: process.env.VUE_APP_BASE_API + "/common/upload", + // 鍗曚釜鏂囦欢鐨勬渶澶т綋绉檺鍒讹紝榛樿涓� 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: { - token: localStorage.getItem('token') || '' - // Accept: 'text/x-json', + // Authorization: "Bearer " + getToken() // otherKey: 'xxx' }, // 璺ㄥ煙鏄惁浼犻�� cookie 锛岄粯璁や负 false withCredentials: true, - // 瓒呮椂鏃堕棿锛岄粯璁や负 10 绉� - timeout: 5 * 1000, // 5 绉� - onSuccess (file, res) { // TS 璇硶 - // onSuccess(file, res) { // JS 璇硶 - console.log(`${file.name} 涓婁紶鎴愬姛`, res) + // 瓒呮椂鏃堕棿锛岄粯璁や负 30 绉� + timeout: 1000 * 1000, // 1000 绉�, + // 涓婁紶涔嬪墠瑙﹀彂 + onBeforeUpload(file) { + return file; }, - customUpload (file, insertFn) { // TS 璇硶 - // file 鍗抽�変腑鐨勬枃浠� - // 鑷繁瀹炵幇涓婁紶锛屽苟寰楀埌鍥剧墖 url alt href - // var form = new FormData() - // form.append('image', file) - // form.append('folder', 'COURSE_IMG') - var formData = new FormData() - formData.append(file.name, file) - formData.append('image', file) - formData.append('folder', 'member') - // formData.append('type', '') - - var xhr = new XMLHttpRequest() - xhr.open(uploadConfig.methods, uploadConfig.action, true) - // 涓婁紶鏁版嵁鎴愬姛锛屼細瑙﹀彂 - xhr.send(formData) - xhr.onreadystatechange = () => { - // 鑻ュ搷搴斿畬鎴愪笖璇锋眰鎴愬姛 - if (xhr.readyState === 4 && xhr.status === 200) { - const result = JSON.parse(xhr.responseText) - console.log('result', result); - insertFn(result.data.url, '', result.data.url) - } + // 鑷畾涔夋彃鍏ヨ棰� + customInsert(res, insertFn) { + // 鍥犱负鑷畾涔夋彃鍏ュ鑷磑nSuccess涓巓nFailed鍥炶皟鍑芥暟涓嶈捣浣滅敤,鑷繁鎵嬪姩澶勭悊 + // 鍏堝叧闂瓑寰呯殑Message + // Message.closeAll(); + if (res.code === 200) { + // Message.success({ + // message: `${res.data.originalName} 涓婁紶鎴愬姛` + // }); + } else { + // Message.error({ + // message: `${res.data.originalName} 涓婁紶澶辫触锛岃閲嶆柊灏濊瘯` + // }); } + insertFn(res.data.link, res.data.link); }, - customInsert (res, insertFn) { // TS 璇硶 - // customInsert(res, insertFn) { // JS 璇硶 - // res 鍗虫湇鍔$鐨勮繑鍥炵粨鏋� - console.log(res.data.url) - // 浠� res 涓壘鍒� url alt href 锛岀劧鍚庢彃鍏ュ浘鐗� - insertFn(res.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' + mode: 'default', // or 'simple' } }, - emits: ['input'], - computed: { - html: { - get () { - return this.info || '' - }, - set (newValue) { - this.$emit('input', newValue) - } - } + watch: { + richData: function (value) { + this.html = value + }, + readonly: function (value) { + this.readonly = value + }, + styleEditor: function (value) { + this.styleEditor = value + }, }, - mounted () { - setTimeout(() => { - this.info = this.default - }, 1200) + mounted() { + // 闇�瑕佸湪缂栬緫鍣ㄥ垱寤哄畬姣曞悗鍦ㄨ祴鍊� + this.$nextTick(()=>{ + this.html = this.richData + }) }, - beforeDestroy () { + methods: { + // 缂栬緫鍣ㄥ垱寤哄畬姣曟椂鐨勫洖璋冨嚱鏁� + onCreated(editor) { + this.editor = Object.seal(editor) // 涓�瀹氳鐢� Object.seal() 锛屽惁鍒欎細鎶ラ敊 + }, + // 缂栬緫鍣ㄥ唴瀹广�侀�夊尯鍙樺寲鏃剁殑鍥炶皟鍑芥暟 + 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() // 缁勪欢閿�姣佹椂锛屽強鏃堕攢姣佺紪杈戝櫒 - }, - methods: { - onCreated (editor) { - this.editor = Object.seal(editor) // 涓�瀹氳鐢� Object.seal() 锛屽惁鍒欎細鎶ラ敊 - this.$emit('input', '123123') - }, - test () { - console.log(this.info) - } } -} +}) </script> - -<style lang="scss" scoped> -.wang_editor { - border: 1px solid; -} -</style> +<style lang="scss"> +</style>> -- Gitblit v1.9.3