Quellcode durchsuchen

富文本编辑

PrinceLee vor 5 Jahren
Ursprung
Commit
9445456774

+ 1 - 1
package.json

@@ -25,6 +25,7 @@
     "@fullcalendar/vue": "^4.4.0",
     "@tinymce/tinymce-vue": "^3.2.2",
     "animate.css": "^3.7.2",
+    "ant-design-vue": "^1.6.2",
     "axios": "0.18.0",
     "core-js": "^2.6.11",
     "crypto-js": "^4.0.0",
@@ -49,7 +50,6 @@
     "sortablejs": "^1.10.2",
     "swiper": "^5.3.6",
     "tinymce": "^5.3.1",
-    "tinymce-vue": "^1.0.0",
     "v-jsoneditor": "^1.2.2",
     "vue": "2.6.10",
     "vue-awesome-swiper": "^4.1.0",

+ 64 - 24
src/components/input/textArea.vue

@@ -1,34 +1,45 @@
 <template>
   <div>
-    <div v-show="isEmpty && !edit" class="text-edit">
-      {{ emptyText }}
-      <el-button type="text" @click="ImmediateAddition">{{ inputButton }}</el-button>
-    </div>
-    <div v-show="edit">
-      <el-tooltip effect="dark" content="单击‘编辑’,失去焦点 ‘保存’" placement="bottom">
-        <my-tinymce ref="myTinymce" :tinymce-html="value" :tinymce-height="setHeight" />
-      </el-tooltip>
-    </div>
-    <div v-show="!isEmpty && !edit">
-      <pre class="text-pre" @click="ImmediateAddition">{{ value }}</pre>
-    </div>
+    <article :id="id">
+      <div v-show="isEmpty && !edit" class="text-edit">
+        {{ emptyText }}
+        <el-button type="text" @click="ImmediateAddition">{{ inputButton }}</el-button>
+      </div>
+      <div v-show="edit">
+        <el-tooltip effect="dark" content="单击‘编辑’,失去焦点 ‘保存’" placement="bottom">
+          <editor v-model="inputValue" :class="'tinymce_'+id" :init="init" @input="changeText" />
+        </el-tooltip>
+      </div>
+      <div v-show="!isEmpty && !edit">
+        <pre class="text-pre" @click="ImmediateAddition" v-html="value" />
+      </div>
+      <div :id="'inputUpload_'+id" style="display: none" @click.stop="blur_textarea" />
+    </article>
   </div>
 </template>
 <script>
-import myTinymce from '@/views/Platform/MyTinymce/MyTinymce.vue'
+import tinymce from 'tinymce/tinymce'
+import Editor from '@tinymce/tinymce-vue'
+import 'tinymce/themes/silver/theme'
+
 export default {
   components: {
-    myTinymce
+    Editor
   },
   props: {
+    id: {
+      type: String,
+      default: '',
+      required: true
+    },
     value: {
       type: String,
       default: '',
       required: false
     },
-    size: {
-      type: String,
-      default: 'small',
+    height: {
+      type: Number,
+      default: 200,
       required: false
     },
     emptyText: {
@@ -46,7 +57,24 @@ export default {
     return {
       inputValue: '',
       edit: false,
-      setHeight: 200
+      init: {
+        selector: '#tinymce',
+        language_url: '/tinymce/langs/zh_CN.js',
+        language: 'zh_CN',
+        skin_url: '/tinymce/skins/ui/oxide', // 编辑器需要一个skin才能正常工作,所以要设置一个skin_url指向之前复制出来的skin文件
+        height: this.height,
+        browser_spellcheck: true, // 拼写检查
+        branding: false, // 去水印
+        elementpath: false, // 禁用编辑器底部的状态栏
+        statusbar: false, // 隐藏编辑器底部的状态栏
+        paste_data_images: true, // 允许粘贴图像
+        menubar: false, // 隐藏最上方menu
+        fontsize_formats: '14px 16px 18px 20px 24px 26px 28px 30px 32px 36px', // 字体大小
+        file_picker_types: 'image',
+        images_upload_credentials: true,
+        plugins: 'lists table textcolor wordcount contextmenu', // 引入插件
+        toolbar: 'bold italic underline strikethrough | fontsizeselect | forecolor backcolor | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent table | undo redo | removeformat formatselect'
+      }
     }
   },
   computed: {
@@ -62,16 +90,28 @@ export default {
       immediate: true
     }
   },
+  mounted() {
+    document.body.addEventListener('click', e => {
+      const isContain = document.getElementById(this.id).contains(e.target)
+      if (!isContain) {
+        document.getElementById(`inputUpload_${this.id}`).click()
+      }
+    })
+    tinymce.init({ selector: `.tinymce_${this.id}` })
+  },
   methods: {
-    ImmediateAddition() {
-      // 立即添加(编辑)
+    ImmediateAddition() { // 立即添加(编辑)
       this.edit = true
-      // this.$refs.textarea.focus()
+    },
+    changeText(e) { // 富文本内容改变
+      this.inputValue = e
     },
     blur_textarea() {
-      this.edit = false
-      this.$emit('update:value', this.inputValue)
-      this.$emit('change', this.inputValue)
+      if (this.edit) {
+        this.edit = false
+        this.$emit('update:value', this.inputValue)
+        this.$emit('change', this.inputValue)
+      }
     }
   }
 }

+ 3 - 3
src/views/Platform/MyTinymce/MyTinymce.vue

@@ -37,9 +37,9 @@ export default {
       value: this.tinymceHtml, // 父组件通过ref拿到该组件的值
       init: {
         selector: '#tinymce',
-        language_url: 'public/tinymce/langs/zh_CN.js',
+        language_url: '/tinymce/langs/zh_CN.js',
         language: 'zh_CN',
-        skin_url: 'public/tinymce/skins/ui/oxide', // 编辑器需要一个skin才能正常工作,所以要设置一个skin_url指向之前复制出来的skin文件
+        skin_url: '/tinymce/skins/ui/oxide', // 编辑器需要一个skin才能正常工作,所以要设置一个skin_url指向之前复制出来的skin文件
         height: this.tinymceHeight,
         browser_spellcheck: true, // 拼写检查
         branding: false, // 去水印
@@ -52,7 +52,6 @@ export default {
         images_upload_credentials: true,
         plugins: 'lists table textcolor wordcount contextmenu', // 引入插件
         toolbar: 'bold italic underline strikethrough | fontsizeselect | forecolor backcolor | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent table | undo redo | removeformat formatselect'
-
       }
     }
   },
@@ -73,6 +72,7 @@ export default {
   methods: {
     getEditor(e) {
       this.value = e
+      this.$emit('change', e)
       this.$store.state.data.RichText = e
     }
   }

+ 10 - 10
src/views/projectManage/projectList/projectViewDetails.vue

@@ -53,7 +53,7 @@
             <div class="title-left-icon" />
             <div class="title-left-name">基础信息</div>
           </div>
-          <article class="detail-info">
+          <div class="detail-info">
             <el-form :inline="true" :model="form_query" class="demo-form-inline" label-position="right" label-width="100px">
               <el-form-item label="项目负责人:">
                 <search-people :value.sync="form_query.projectOwner" @change="changeArea" />
@@ -83,34 +83,34 @@
                 </el-select>
               </el-form-item>
             </el-form>
-          </article>
+          </div>
         </section>
         <section class="main-section">
           <div class="el-main-title">
             <div class="title-left-icon" />
             <div class="title-left-name">项目描述</div>
           </div>
-          <article>
-            <text-area :value.sync="form_query.description" :empty-text="'请输入'" :input-button="'需求描述'" @change="changeArea" />
-          </article>
+          <div>
+            <text-area :id="'pro-desc'" :value.sync="form_query.description" :empty-text="'请输入'" :input-button="'需求描述'" @change="changeArea" />
+          </div>
         </section>
         <section class="main-section">
           <div class="el-main-title">
             <div class="title-left-icon" />
             <div class="title-left-name">项目总目标</div>
           </div>
-          <article>
-            <text-area :value.sync="form_query.target" :empty-text="'您还没有设定目标请'" :input-button="'立即添加'" @change="changeArea" />
-          </article>
+          <div>
+            <text-area :id="'pro-target'" :value.sync="form_query.target" :empty-text="'您还没有设定目标请'" :input-button="'立即添加'" @change="changeArea" />
+          </div>
         </section>
         <section class="main-section">
           <div class="el-main-title">
             <div class="title-left-icon" />
             <div class="title-left-name">项目里程碑</div>
           </div>
-          <article>
+          <div>
             <mile-stone :values-list.sync="project_Milepost" @change="get_list" />
-          </article>
+          </div>
         </section>
       </el-container>
       <!-- 概览 -->