疯狂的狮子li
2020-08-24 184bb04bc2ca9991eacb88ab1709f6284db71075
Merge branch 'master' of https://gitee.com/y_project/RuoYi-Vue

 Conflicts:
 ruoyi-ui/src/components/Editor/index.vue
 ruoyi-ui/src/views/system/notice/index.vue
 sql/ry_20200822.sql
已修改2个文件
已重命名1个文件
213 ■■■■■ 文件已修改
ruoyi-ui/src/components/Editor/index.vue 207 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-ui/src/views/system/notice/index.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sql/ry_20200822.sql 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-ui/src/components/Editor/index.vue
@@ -1,153 +1,122 @@
<template>
  <div>
    <!-- å›¾ç‰‡ä¸Šä¼ ç»„件辅助 -->
    <el-upload
      class="avatar-uploader quill-img"
      :action="uploadImgUrl"
      name="file"
      :headers="headers"
      :show-file-list="false"
      :on-success="quillImgSuccess"
      :on-error="uploadError"
      :before-upload="quillImgBefore"
      accept='.jpg,.jpeg,.png,.gif'
    ></el-upload>
    <!-- å¯Œæ–‡æœ¬ç»„ä»¶ -->
    <quill-editor
      class="editor"
      v-model="content"
      ref="quillEditor"
      :options="editorOption"
      @blur="onEditorBlur($event)"
      @focus="onEditorFocus($event)"
      @change="onEditorChange($event)"
    ></quill-editor>
  </div>
    <div class="editor" ref="editor" :style="styles"></div>
</template>
<script>
import { getToken } from '@/utils/auth'
// å·¥å…·æ é…ç½®
const toolbarOptions = [
  ["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"]                       // é“¾æŽ¥ã€å›¾ç‰‡ã€è§†é¢‘
];
import { quillEditor } from "vue-quill-editor";
import Quill from "quill";
import "quill/dist/quill.core.css";
import "quill/dist/quill.snow.css";
import "quill/dist/quill.bubble.css";
export default {
  name: "Editor",
  props: {
    /* ç¼–辑器的内容 */
    value: {
      type: String
      type: String,
      default: "",
    },
    /* å›¾ç‰‡å¤§å° */
    maxSize: {
    /* é«˜åº¦ */
    height: {
      type: Number,
      default: 4000 //kb
    }
      default: null,
    },
    /* æœ€å°é«˜åº¦ */
    minHeight: {
      type: Number,
      default: null,
    },
  },
  components: { quillEditor },
  data() {
    return {
      content: this.value,
      uploadImgUrl: "",
      editorOption: {
        theme: "snow", // or 'bubble'
        placeholder: "请输入内容",
      Quill: null,
      currentValue: "",
      options: {
        theme: "snow",
        bounds: document.body,
        debug: "warn",
        modules: {
          toolbar: {
            container: toolbarOptions,
            handlers: {
              image: function(value) {
                if (value) {
                  // è§¦å‘input框选择图片文件
                  document.querySelector(".quill-img input").click();
                } else {
                  this.quill.format("image", false);
                }
              }
            }
          // å·¥å…·æ é…ç½®
          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: false,
      },
    };
  },
  computed: {
    styles() {
      let style = {};
      if (this.minHeight) {
        style.minHeight = `${this.minHeight}px`;
      }
      if (this.height) {
        style.height = `${this.height}px`;
      }
      return style;
    },
  },
  watch: {
    value: {
      handler(val) {
        if (val !== this.currentValue) {
          this.currentValue = val;
          if (this.Quill) {
            this.Quill.pasteHTML(this.value);
          }
        }
      },
      uploadImgUrl: process.env.VUE_APP_BASE_API + "/common/upload", // ä¸Šä¼ çš„图片服务器地址
      headers: {
        Authorization: 'Bearer ' + getToken()
      }
    };
      immediate: true,
    },
  },
  watch: {
    value: function() {
      this.content = this.value;
    }
  mounted() {
    this.init();
  },
  beforeDestroy() {
    this.Quill = null;
  },
  methods: {
    onEditorBlur() {
      //失去焦点事件
    init() {
      const editor = this.$refs.editor;
      this.Quill = new Quill(editor, this.options);
      this.Quill.pasteHTML(this.currentValue);
      this.Quill.on("text-change", (delta, oldDelta, source) => {
        const html = this.$refs.editor.children[0].innerHTML;
        const text = this.Quill.getText();
        const quill = this.Quill;
        this.currentValue = html;
        this.$emit("input", html);
        this.$emit("on-change", { html, text, quill });
      });
      this.Quill.on("text-change", (delta, oldDelta, source) => {
        this.$emit("on-text-change", delta, oldDelta, source);
      });
      this.Quill.on("selection-change", (range, oldRange, source) => {
        this.$emit("on-selection-change", range, oldRange, source);
      });
      this.Quill.on("editor-change", (eventName, ...args) => {
        this.$emit("on-editor-change", eventName, ...args);
      });
    },
    onEditorFocus() {
      //获得焦点事件
    },
    onEditorChange() {
      //内容改变事件
      this.$emit("input", this.content);
    },
    // å¯Œæ–‡æœ¬å›¾ç‰‡ä¸Šä¼ å‰
    quillImgBefore(file) {
      let fileType = file.type;
            if(fileType === 'image/jpeg' || fileType === 'image/png'){
                return true;
            }else {
                this.$message.error('请插入图片类型文件(jpg/jpeg/png)');
                return false;
            }
    },
    quillImgSuccess(res, file) {
      // res为图片服务器返回的数据
      // èŽ·å–å¯Œæ–‡æœ¬ç»„ä»¶å®žä¾‹
      let quill = this.$refs.quillEditor.quill;
      // å¦‚果上传成功
      if (res.code == 200) {
        // èŽ·å–å…‰æ ‡æ‰€åœ¨ä½ç½®
        let length = quill.getSelection().index;
        // æ’入图片  res.url为服务器返回的图片地址
        quill.insertEmbed(length, "image", res.url);
        // è°ƒæ•´å…‰æ ‡åˆ°æœ€åŽ
        quill.setSelection(length + 1);
      } else {
        this.$message.error("图片插入失败");
      }
    },
    // å¯Œæ–‡æœ¬å›¾ç‰‡ä¸Šä¼ å¤±è´¥
    uploadError() {
      // loading动画消失
      this.$message.error("图片插入失败");
    }
  }
  },
};
</script>
</script>
<style>
.editor {
  white-space: pre-wrap!important;
  line-height: normal !important;
  height: 192px;
}
.quill-img {
  display: none;
ruoyi-ui/src/views/system/notice/index.vue
@@ -159,12 +159,12 @@
          </el-col>
          <el-col :span="24">
            <el-form-item label="内容">
              <Editor v-model="form.noticeContent" />
              <editor v-model="form.noticeContent" :min-height="192"/>
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
      <div slot="footer" class="dialog-footer" style="padding-top:30px">
      <div slot="footer" class="dialog-footer">
        <el-button type="primary" @click="submitForm">ç¡® å®š</el-button>
        <el-button @click="cancel">取 æ¶ˆ</el-button>
      </div>
sql/ry_20200822.sql
ÎļþÃû´Ó sql/ry_20200724.sql ÐÞ¸Ä
@@ -603,7 +603,7 @@
  notice_id         int(4)          not null auto_increment    comment '公告ID',
  notice_title      varchar(50)     not null                   comment '公告标题',
  notice_type       char(1)         not null                   comment '公告类型(1通知 2公告)',
  notice_content    varchar(2000)   default null               comment '公告内容',
  notice_content    blob            default null               comment '公告内容',
  status            char(1)         default '0'                comment '公告状态(0正常 1关闭)',
  create_by         varchar(64)     default ''                 comment '创建者',
  create_time       datetime                                   comment '创建时间',