RuoYi
2023-03-06 ee2205d4f1cc9bd5c3908fdf43453f1d98f3a231
新增富文本组件支持
已修改3个文件
已添加1个文件
176 ■■■■■ 文件已修改
package.json 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/Editor/index.vue 163 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main.js 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/notice/index.vue 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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",
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"],                    // å¼•用  ä»£ç å—
      [{ 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>
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)
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>