From ee2205d4f1cc9bd5c3908fdf43453f1d98f3a231 Mon Sep 17 00:00:00 2001 From: RuoYi <yzz_ivy@163.com> Date: 星期一, 06 三月 2023 14:19:40 +0800 Subject: [PATCH] 新增富文本组件支持 --- src/main.js | 5 + package.json | 1 src/views/system/notice/index.vue | 7 -- src/components/Editor/index.vue | 163 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 168 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index fc1939f..c274f80 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ }, "dependencies": { "@element-plus/icons-vue": "2.0.10", + "@vueup/vue-quill": "1.1.0", "@vueuse/core": "9.5.0", "axios": "0.27.2", "echarts": "5.4.0", diff --git a/src/components/Editor/index.vue b/src/components/Editor/index.vue new file mode 100644 index 0000000..ef3a832 --- /dev/null +++ b/src/components/Editor/index.vue @@ -0,0 +1,163 @@ +<template> + <div class="editor"> + <quill-editor + v-model:content="content" + contentType="html" + @textChange="(e) => $emit('update:modelValue', content)" + :options="options" + :style="styles" + /> + </div> +</template> + +<script setup> +import { QuillEditor } from '@vueup/vue-quill'; +import '@vueup/vue-quill/dist/vue-quill.snow.css'; + +const props = defineProps({ + /* 缂栬緫鍣ㄧ殑鍐呭 */ + modelValue: { + type: String, + }, + /* 楂樺害 */ + height: { + type: Number, + default: null, + }, + /* 鏈�灏忛珮搴� */ + minHeight: { + type: Number, + default: null, + }, + /* 鍙 */ + readOnly: { + type: Boolean, + default: false, + }, +}); + +const options = ref({ + theme: "snow", + bounds: document.body, + debug: "warn", + modules: { + // 宸ュ叿鏍忛厤缃� + toolbar: [ + ["bold", "italic", "underline", "strike"], // 鍔犵矖 鏂滀綋 涓嬪垝绾� 鍒犻櫎绾� + ["blockquote", "code-block"], // 寮曠敤 浠g爜鍧� + [{ 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: props.readOnly, + theme: 'snow' +}); + +const styles = computed(() => { + let style = {}; + if (props.minHeight) { + style.minHeight = `${props.minHeight}px`; + } + if (props.height) { + style.height = `${props.height}px`; + } + return style; +}) + +const content = ref(""); +watch(() => props.modelValue, (v) => { + if (v !== content) { + content.value = v === undefined ? "<p></p>" : v; + } +}, { immediate: true }); + + +</script> + +<style> +.editor, .ql-toolbar { + white-space: pre-wrap !important; + line-height: normal !important; +} +.quill-img { + display: none; +} +.ql-snow .ql-tooltip[data-mode="link"]::before { + content: "璇疯緭鍏ラ摼鎺ュ湴鍧�:"; +} +.ql-snow .ql-tooltip.ql-editing a.ql-action::after { + border-right: 0px; + content: "淇濆瓨"; + padding-right: 0px; +} + +.ql-snow .ql-tooltip[data-mode="video"]::before { + content: "璇疯緭鍏ヨ棰戝湴鍧�:"; +} + +.ql-snow .ql-picker.ql-size .ql-picker-label::before, +.ql-snow .ql-picker.ql-size .ql-picker-item::before { + content: "14px"; +} +.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="small"]::before, +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="small"]::before { + content: "10px"; +} +.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="large"]::before, +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="large"]::before { + content: "18px"; +} +.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="huge"]::before, +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="huge"]::before { + content: "32px"; +} + +.ql-snow .ql-picker.ql-header .ql-picker-label::before, +.ql-snow .ql-picker.ql-header .ql-picker-item::before { + content: "鏂囨湰"; +} +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="1"]::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="1"]::before { + content: "鏍囬1"; +} +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="2"]::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="2"]::before { + content: "鏍囬2"; +} +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="3"]::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="3"]::before { + content: "鏍囬3"; +} +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="4"]::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="4"]::before { + content: "鏍囬4"; +} +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="5"]::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="5"]::before { + content: "鏍囬5"; +} +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="6"]::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"]::before { + content: "鏍囬6"; +} + +.ql-snow .ql-picker.ql-font .ql-picker-label::before, +.ql-snow .ql-picker.ql-font .ql-picker-item::before { + content: "鏍囧噯瀛椾綋"; +} +.ql-snow .ql-picker.ql-font .ql-picker-label[data-value="serif"]::before, +.ql-snow .ql-picker.ql-font .ql-picker-item[data-value="serif"]::before { + content: "琛嚎瀛椾綋"; +} +.ql-snow .ql-picker.ql-font .ql-picker-label[data-value="monospace"]::before, +.ql-snow .ql-picker.ql-font .ql-picker-item[data-value="monospace"]::before { + content: "绛夊瀛椾綋"; +} +</style> diff --git a/src/main.js b/src/main.js index 28725e7..b399777 100644 --- a/src/main.js +++ b/src/main.js @@ -6,12 +6,10 @@ import locale from 'element-plus/lib/locale/lang/zh-cn' // 涓枃璇█ import '@/assets/styles/index.scss' // global css - import App from './App' import store from './store' import router from './router' import directive from './directive' // directive - // 娉ㄥ唽鎸囦护 import plugins from './plugins' // plugins @@ -31,6 +29,8 @@ import Pagination from '@/components/Pagination' // 鑷畾涔夎〃鏍煎伐鍏风粍浠� import RightToolbar from '@/components/RightToolbar' +// 瀵屾枃鏈粍浠� +import Editor from "@/components/Editor" // 鏂囦欢涓婁紶缁勪欢 import FileUpload from "@/components/FileUpload" // 鍥剧墖涓婁紶缁勪欢 @@ -62,6 +62,7 @@ app.component('ImageUpload', ImageUpload) app.component('ImagePreview', ImagePreview) app.component('RightToolbar', RightToolbar) +app.component('Editor', Editor) app.use(router) app.use(store) diff --git a/src/views/system/notice/index.vue b/src/views/system/notice/index.vue index 35e15c1..55fbc3a 100644 --- a/src/views/system/notice/index.vue +++ b/src/views/system/notice/index.vue @@ -143,12 +143,7 @@ </el-col> <el-col :span="24"> <el-form-item label="鍐呭"> - <el-input - :rows="6" - type="textarea" - placeholder="璇疯緭鍏ュ唴瀹�" - v-model="form.noticeContent" - /> + <editor v-model="form.noticeContent" :min-height="192"/> </el-form-item> </el-col> </el-row> -- Gitblit v1.9.3