富文本
Showing
5 changed files
with
166 additions
and
6 deletions
| ... | @@ -23,6 +23,7 @@ | ... | @@ -23,6 +23,7 @@ | 
| 23 | "normalize.css": "7.0.0", | 23 | "normalize.css": "7.0.0", | 
| 24 | "nprogress": "0.2.0", | 24 | "nprogress": "0.2.0", | 
| 25 | "vue": "2.6.10", | 25 | "vue": "2.6.10", | 
| 26 | "vue-quill-editor": "^3.0.6", | ||
| 26 | "vue-router": "3.0.2", | 27 | "vue-router": "3.0.2", | 
| 27 | "vue-seamless-scroll": "^1.1.23", | 28 | "vue-seamless-scroll": "^1.1.23", | 
| 28 | "vuex": "3.1.0" | 29 | "vuex": "3.1.0" | ... | ... | 
| ... | @@ -29,6 +29,13 @@ import store from './store' | ... | @@ -29,6 +29,13 @@ import store from './store' | 
| 29 | import router from './router' | 29 | import router from './router' | 
| 30 | import _ from 'lodash' | 30 | import _ from 'lodash' | 
| 31 | 31 | ||
| 32 | import VueQuillEditor from 'vue-quill-editor'//调用编辑器 | ||
| 33 | // 样式 | ||
| 34 | import 'quill/dist/quill.core.css' | ||
| 35 | import 'quill/dist/quill.snow.css' | ||
| 36 | import 'quill/dist/quill.bubble.css' | ||
| 37 | Vue.use(VueQuillEditor) | ||
| 38 | |||
| 32 | import * as filters from './filters' // global filters | 39 | import * as filters from './filters' // global filters | 
| 33 | import './permission' // permission control | 40 | import './permission' // permission control | 
| 34 | Vue.use(Element, { size: 'small', zIndex: 1000 }) | 41 | Vue.use(Element, { size: 'small', zIndex: 1000 }) | ... | ... | 
| 1 | <template> | 1 | <template> | 
| 2 | <dialogBox title="新增系统通知" @submitForm="submitForm" saveButton="保存" :isFullscreen="false" width="50%" | 2 | <dialogBox title="新增系统通知" @submitForm="submitForm" saveButton="保存" :isFullscreen="false" width="60%" | 
| 3 | @closeDialog="closeDialog" v-model="value"> | 3 | @closeDialog="closeDialog" v-model="value"> | 
| 4 | <el-form ref="ruleForm" :model="ruleForm" label-width="100px" :rules="rules"> | 4 | <el-form ref="ruleForm" :model="ruleForm" label-width="100px" :rules="rules"> | 
| 5 | <el-row> | 5 | <el-row> | 
| ... | @@ -10,16 +10,33 @@ | ... | @@ -10,16 +10,33 @@ | 
| 10 | </el-col> | 10 | </el-col> | 
| 11 | </el-row> | 11 | </el-row> | 
| 12 | <el-row> | 12 | <el-row> | 
| 13 | <el-col :span="12"> | ||
| 14 | <el-form-item label="通知来源:" prop="noticeSource"> | ||
| 15 | <el-input v-model="ruleForm.noticeSource"></el-input> | ||
| 16 | </el-form-item> | ||
| 17 | </el-col> | ||
| 18 | </el-row> | ||
| 19 | <el-row> | ||
| 13 | <el-col :span="24"> | 20 | <el-col :span="24"> | 
| 14 | <el-form-item label="通知内容:" prop="noticeContent"> | 21 | <el-form-item label="通知内容:" prop="noticeContent"> | 
| 15 | <el-input v-model="ruleForm.noticeContent" type="textarea" :rows="16"></el-input> | 22 | <quill-editor | 
| 23 | v-model="ruleForm.noticeContent" | ||
| 24 | ref="myQuillEditor" | ||
| 25 | :options="editorOption" | ||
| 26 | @blur="onEditorBlur($event)" | ||
| 27 | @focus="onEditorFocus($event)" | ||
| 28 | @change="onEditorChange($event)" | ||
| 29 | @ready="onEditorReady($event)" | ||
| 30 | > | ||
| 31 | </quill-editor> | ||
| 32 | <!-- <el-input v-model="ruleForm.noticeContent" type="textarea" :rows="16"></el-input> --> | ||
| 16 | </el-form-item> | 33 | </el-form-item> | 
| 17 | </el-col> | 34 | </el-col> | 
| 18 | </el-row> | 35 | </el-row> | 
| 19 | <el-row> | 36 | <el-row> | 
| 20 | <el-col :span="8"> | 37 | <el-col :span="8"> | 
| 21 | <el-form-item label="附件:" prop="noticeFileUrl"> | 38 | <el-form-item label="附件:" prop="noticeFileUrl"> | 
| 22 | <el-upload action="" :file-list="fileList" multiple :auto-upload="false" :limit="1" | 39 | <el-upload action="" multiple :auto-upload="false" :limit="1" | 
| 23 | :on-change="handleChange" :before-upload="beforeUpload"> | 40 | :on-change="handleChange" :before-upload="beforeUpload"> | 
| 24 | <el-button icon="el-icon-upload" type="primary">上传</el-button> | 41 | <el-button icon="el-icon-upload" type="primary">上传</el-button> | 
| 25 | <div slot="tip" class="el-upload__tip">文件大小不超过20MB</div> | 42 | <div slot="tip" class="el-upload__tip">文件大小不超过20MB</div> | 
| ... | @@ -27,6 +44,13 @@ | ... | @@ -27,6 +44,13 @@ | 
| 27 | </el-form-item> | 44 | </el-form-item> | 
| 28 | </el-col> | 45 | </el-col> | 
| 29 | </el-row> | 46 | </el-row> | 
| 47 | <div v-show="false"> | ||
| 48 | <el-upload action="" multiple :auto-upload="false" | ||
| 49 | :on-change="RichTexthandleChange" :before-upload="beforeUpload" class="richUpload"> | ||
| 50 | <el-button icon="el-icon-upload" type="primary">上传</el-button> | ||
| 51 | <div slot="tip" class="el-upload__tip">文件大小不超过20MB</div> | ||
| 52 | </el-upload> | ||
| 53 | </div> | ||
| 30 | </el-form> | 54 | </el-form> | 
| 31 | </dialogBox> | 55 | </dialogBox> | 
| 32 | </template> | 56 | </template> | 
| ... | @@ -34,16 +58,19 @@ | ... | @@ -34,16 +58,19 @@ | 
| 34 | <script> | 58 | <script> | 
| 35 | import { addSysNotice } from "@/api/notice.js" | 59 | import { addSysNotice } from "@/api/notice.js" | 
| 36 | import { upload } from "@/api/system.js" | 60 | import { upload } from "@/api/system.js" | 
| 61 | import { quillEditor } from "vue-quill-editor"; | ||
| 37 | export default { | 62 | export default { | 
| 38 | props: { | 63 | props: { | 
| 39 | value: { type: Boolean, default: false }, | 64 | value: { type: Boolean, default: false }, | 
| 40 | }, | 65 | }, | 
| 66 | components: { quillEditor }, | ||
| 41 | data () { | 67 | data () { | 
| 42 | return { | 68 | return { | 
| 43 | ruleForm: { | 69 | ruleForm: { | 
| 44 | noticeTitle: '', | 70 | noticeTitle: '', | 
| 45 | noticeContent: '', | 71 | noticeContent: '', | 
| 46 | noticeFileUrl: '', | 72 | noticeFileUrl: '', | 
| 73 | noticeSource: '', | ||
| 47 | noticeType: '1' | 74 | noticeType: '1' | 
| 48 | }, | 75 | }, | 
| 49 | rules: { | 76 | rules: { | 
| ... | @@ -52,11 +79,69 @@ export default { | ... | @@ -52,11 +79,69 @@ export default { | 
| 52 | ], | 79 | ], | 
| 53 | noticeContent: [ | 80 | noticeContent: [ | 
| 54 | { required: true, message: '请输入通知内容', trigger: 'blur' } | 81 | { required: true, message: '请输入通知内容', trigger: 'blur' } | 
| 82 | ], | ||
| 83 | noticeSource: [ | ||
| 84 | { required: true, message: '请输入通知来源', trigger: 'blur' } | ||
| 55 | ] | 85 | ] | 
| 56 | }, | 86 | }, | 
| 87 | // 富文本编辑器配置 | ||
| 88 | editorOption: { | ||
| 89 | theme: "snow", // or 'bubble' | ||
| 90 | modules: { | ||
| 91 | toolbar: { | ||
| 92 | container: [ | ||
| 93 | ["bold", "italic", "underline", "strike"], // 加粗 斜体 下划线 删除线 | ||
| 94 | ["blockquote", "code-block"], // 引用 代码块 | ||
| 95 | [{ header: 1 }, { header: 2 }], // 1、2 级标题 | ||
| 96 | [{ list: "ordered" }, { list: "bullet" }], // 有序、无序列表 | ||
| 97 | [{ script: "sub" }, { script: "super" }], // 上标/下标 | ||
| 98 | [{ indent: "-1" }, { indent: "+1" }], // 缩进 | ||
| 99 | [{ direction: "rtl" }], // 文本方向 | ||
| 100 | [{ size: ['small', false, 'large', 'huge'] }], // 字体大小 | ||
| 101 | [{ header: [1, 2, 3, 4, 5, 6] }], // 标题 | ||
| 102 | [{ color: [] }, { background: [] }], // 字体颜色、字体背景颜色 | ||
| 103 | // [{ font: ['songti'] }], // 字体种类 | ||
| 104 | [{ align: [] }], // 对齐方式 | ||
| 105 | ["clean"], // 清除文本格式 | ||
| 106 | ["image", "video"], // 链接、图片、视频 | ||
| 107 | ], | ||
| 108 | handlers: { | ||
| 109 | image: function(value) { | ||
| 110 | if (value) { | ||
| 111 | // 用upload的点击事件代替文本编辑器的图片上传事件 | ||
| 112 | document.querySelector('.richUpload input').click(); | ||
| 113 | } else { | ||
| 114 | this.quill.format('image', false); | ||
| 115 | } | ||
| 116 | } | ||
| 117 | } | ||
| 118 | } | ||
| 119 | }, | ||
| 120 | placeholder: "请输入正文", | ||
| 121 | }, | ||
| 57 | } | 122 | } | 
| 58 | }, | 123 | }, | 
| 59 | 124 | mounted() { | |
| 125 | // 自定义粘贴图片功能 | ||
| 126 | let quill = this.$refs.myQuillEditor.quill; | ||
| 127 | quill.root.addEventListener("paste",evt => { | ||
| 128 | console.log(1111); | ||
| 129 | if (evt.clipboardData && evt.clipboardData.files &&evt.clipboardData.files.length) { | ||
| 130 | console.log(2222); | ||
| 131 | evt.preventDefault(); | ||
| 132 | [].forEach.call(evt.clipboardData.files, file => { | ||
| 133 | console.log(33333); | ||
| 134 | if (!file.type.match(/^image\/(gif|jpe?g|a?png|bmp)/i)) { | ||
| 135 | return; | ||
| 136 | } | ||
| 137 | console.log(4444); | ||
| 138 | this.RichTexthandleChange(File); | ||
| 139 | }); | ||
| 140 | } | ||
| 141 | }, | ||
| 142 | false | ||
| 143 | ); | ||
| 144 | }, | ||
| 60 | methods: { | 145 | methods: { | 
| 61 | submitForm () { | 146 | submitForm () { | 
| 62 | let that = this; | 147 | let that = this; | 
| ... | @@ -91,6 +176,7 @@ export default { | ... | @@ -91,6 +176,7 @@ export default { | 
| 91 | beforeUpload (file) { | 176 | beforeUpload (file) { | 
| 92 | return true | 177 | return true | 
| 93 | }, | 178 | }, | 
| 179 | //附件上传事件 | ||
| 94 | async handleChange (file) { | 180 | async handleChange (file) { | 
| 95 | var formdata = new FormData(); | 181 | var formdata = new FormData(); | 
| 96 | formdata.append("file", file.raw); | 182 | formdata.append("file", file.raw); | 
| ... | @@ -98,9 +184,53 @@ export default { | ... | @@ -98,9 +184,53 @@ export default { | 
| 98 | this.ruleForm.noticeFileUrl = res.message | 184 | this.ruleForm.noticeFileUrl = res.message | 
| 99 | }) | 185 | }) | 
| 100 | }, | 186 | }, | 
| 187 | //富文本图片上传事件 | ||
| 188 | async RichTexthandleChange (file) { | ||
| 189 | let that = this; | ||
| 190 | var formdata = new FormData(); | ||
| 191 | formdata.append("file", file.raw); | ||
| 192 | upload(formdata).then(res => { | ||
| 193 | //editor对象 | ||
| 194 | const quill = that.$refs.myQuillEditor.quill; | ||
| 195 | // 如果上传成功 | ||
| 196 | // 获取光标所在位置 | ||
| 197 | const length = quill.selection.savedRange.index; | ||
| 198 | // 插入图片 | ||
| 199 | quill.insertEmbed(length, 'image', res.message); | ||
| 200 | // 调整光标到最后 | ||
| 201 | quill.setSelection(length + 1); | ||
| 202 | //that.quillUpdateImg = false; | ||
| 203 | }) | ||
| 204 | }, | ||
| 205 | onSubmit() { | ||
| 206 | //console.log("submit!"); | ||
| 207 | }, | ||
| 208 | // 失去焦点事件 | ||
| 209 | onEditorBlur(quill) { | ||
| 210 | //console.log("editor blur!", quill); | ||
| 211 | }, | ||
| 212 | // 获得焦点事件 | ||
| 213 | onEditorFocus(quill) { | ||
| 214 | //console.log("editor focus!", quill); | ||
| 215 | }, | ||
| 216 | // 准备富文本编辑器 | ||
| 217 | onEditorReady(quill) { | ||
| 218 | //console.log("editor ready!", quill); | ||
| 219 | }, | ||
| 220 | // 内容改变事件 | ||
| 221 | onEditorChange({ quill, html, text }) { | ||
| 222 | //console.log("editor change!", quill, html, text); | ||
| 223 | //this.content = html; | ||
| 224 | }, | ||
| 101 | } | 225 | } | 
| 102 | } | 226 | } | 
| 103 | </script> | 227 | </script> | 
| 104 | <style scoped lang="scss"> | 228 | <style scoped lang="scss"> | 
| 105 | 229 | // .ql-editor{ | |
| 230 | // height:500px; | ||
| 231 | // } | ||
| 232 | /deep/.ql-editor { | ||
| 233 | padding: 0px; | ||
| 234 | height: 500px; | ||
| 235 | } | ||
| 106 | </style> | 236 | </style> | 
| ... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... | 
| ... | @@ -9,7 +9,14 @@ | ... | @@ -9,7 +9,14 @@ | 
| 9 | <el-row :gutter="8"> | 9 | <el-row :gutter="8"> | 
| 10 | <el-col :span="24" class="margin-top-middle"> | 10 | <el-col :span="24" class="margin-top-middle"> | 
| 11 | 通知内容: | 11 | 通知内容: | 
| 12 | <el-input type="textarea" :rows="20" v-model="formData.item.noticeContent"></el-input> | 12 | <!-- <span v-html="formData.item.noticeContent"></span> --> | 
| 13 | <quill-editor class="ql-editor" | ||
| 14 | v-model="formData.item.noticeContent" | ||
| 15 | ref="myQuillEditor" | ||
| 16 | :options="editorOption" | ||
| 17 | > | ||
| 18 | </quill-editor> | ||
| 19 | <!-- <el-input type="textarea" :rows="20" v-model="formData.item.noticeContent"></el-input> --> | ||
| 13 | </el-col> | 20 | </el-col> | 
| 14 | </el-row> | 21 | </el-row> | 
| 15 | <el-row :gutter="8"> | 22 | <el-row :gutter="8"> | 
| ... | @@ -21,9 +28,16 @@ | ... | @@ -21,9 +28,16 @@ | 
| 21 | </div> | 28 | </div> | 
| 22 | </template> | 29 | </template> | 
| 23 | <script> | 30 | <script> | 
| 31 | import { quillEditor } from "vue-quill-editor"; | ||
| 24 | export default { | 32 | export default { | 
| 33 | components: { quillEditor }, | ||
| 25 | data () { | 34 | data () { | 
| 26 | return { | 35 | return { | 
| 36 | // 富文本编辑器配置 | ||
| 37 | editorOption: { | ||
| 38 | theme: "snow", // or 'bubble' | ||
| 39 | placeholder: "请输入正文", | ||
| 40 | }, | ||
| 27 | }; | 41 | }; | 
| 28 | }, | 42 | }, | 
| 29 | components: {}, | 43 | components: {}, | 
| ... | @@ -49,4 +63,7 @@ export default { | ... | @@ -49,4 +63,7 @@ export default { | 
| 49 | .margin-top-middle { | 63 | .margin-top-middle { | 
| 50 | margin-top: 10px | 64 | margin-top: 10px | 
| 51 | } | 65 | } | 
| 66 | /deep/.ql-editor { | ||
| 67 | padding: 0px; | ||
| 68 | } | ||
| 52 | </style> | 69 | </style> | 
| ... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... | 
| ... | @@ -59,6 +59,11 @@ class data extends filter { | ... | @@ -59,6 +59,11 @@ class data extends filter { | 
| 59 | } | 59 | } | 
| 60 | }, | 60 | }, | 
| 61 | { | 61 | { | 
| 62 | prop: "creater", | ||
| 63 | label: "操作人", | ||
| 64 | width: '100' | ||
| 65 | }, | ||
| 66 | { | ||
| 62 | prop: "createtime", | 67 | prop: "createtime", | 
| 63 | label: "报错时间", | 68 | label: "报错时间", | 
| 64 | width: '200' | 69 | width: '200' | ... | ... | 
- 
Please register or sign in to post a comment