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