tinymce.vue 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. <template>
  2. <div style="width:100%;height:100%;" v-loading="loading">
  3. <TinymceVue
  4. class="myTinymceVue"
  5. v-model="myValue"
  6. :init="init"
  7. />
  8. <UploadPanel
  9. uploadType="importProject"
  10. ref="UploadPanelRef"
  11. accept="image/gif, image/jpeg, image/jpg, image/png"
  12. maxLength="1"
  13. @importProjectUrl="importProjectUrl"
  14. dir="brief/"
  15. />
  16. </div>
  17. </template>
  18. <script>
  19. // http://tinymce.ax-z.cn/more-plugins/axupimgs.php
  20. import { reactive,toRefs,onMounted, getCurrentInstance, watch } from 'vue';
  21. import tinymce from 'tinymce/tinymce';
  22. import TinymceVue from '@tinymce/tinymce-vue';
  23. import 'tinymce/themes/silver'
  24. import 'tinymce/themes/silver/theme'
  25. import 'tinymce/icons/default'; //引入编辑器图标icon,不引入则不显示对应图标
  26. import 'tinymce/models/dom' // 这里是个坑 一定要引入
  27. //在TinyMce.vue中接着引入相关插件
  28. import "tinymce/icons/default/icons"
  29. // import "tinymce/plugins/image" // 插入上传图片插件
  30. // import "tinymce/plugins/media" // 插入视频插件
  31. import "tinymce/plugins/table" // 插入表格插件
  32. import "tinymce/plugins/lists" // 列表插件
  33. import "tinymce/plugins/wordcount" // 字数统计插件
  34. // import "tinymce/plugins/code" // 源码
  35. // import 'tinymce/plugins/codesample' //代码示例
  36. import "tinymce/plugins/fullscreen" //全屏
  37. import 'tinymce/plugins/advlist' //高级列表
  38. import 'tinymce/plugins/anchor' //锚点
  39. import 'tinymce/plugins/autolink' //自动链接
  40. import 'tinymce/plugins/autoresize' //编辑器高度自适应,注:plugins里引入此插件时,Init里设置的height将失效
  41. import 'tinymce/plugins/autosave' //自动存稿
  42. import 'tinymce/plugins/charmap' //特殊字符
  43. import 'tinymce/plugins/directionality' //文字方向
  44. import 'tinymce/plugins/emoticons' //表情
  45. import 'tinymce/plugins/help' //帮助
  46. import 'tinymce/plugins/importcss' //引入css
  47. import 'tinymce/plugins/insertdatetime' //插入日期时间
  48. import 'tinymce/plugins/link' //超链接
  49. import 'tinymce/plugins/nonbreaking' //插入不间断空格
  50. import 'tinymce/plugins/pagebreak' //插入分页符
  51. import 'tinymce/plugins/preview'//预览
  52. import 'tinymce/plugins/quickbars' //快速工具栏
  53. import 'tinymce/plugins/save' //保存
  54. import 'tinymce/plugins/searchreplace' //查找替换
  55. import 'tinymce/plugins/table' //表格
  56. // import 'tinymce/plugins/template' //内容模板
  57. import 'tinymce/plugins/visualblocks' //显示元素范围
  58. import 'tinymce/plugins/visualchars' //显示不可见字符
  59. export default {
  60. name: '',
  61. components: {TinymceVue},
  62. props: {
  63. value: { // 绑定的值
  64. type: String,
  65. default: '',
  66. },
  67. disabled: { // 是否禁止编辑
  68. type: Boolean,
  69. default: false
  70. },
  71. plugins: {
  72. type: [String, Array],
  73. default: 'table lists wordcount fullscreen advlist anchor autolink charmap directionality emoticons insertdatetime link nonbreaking pagebreak preview save searchreplace table visualblocks visualchars',
  74. // [表格 列表 全屏]
  75. },
  76. toolbar: {
  77. type: [String, Array],
  78. default: 'codesample bold italic underline alignleft aligncenter alignright alignjustify | undo redo | formatselect | fontselect | fontsizeselect | forecolor backcolor | bullist numlist outdent indent | lists link table code | removeformat | assignment'
  79. },
  80. height: {
  81. type: [Number, String],
  82. default: 600
  83. }
  84. },
  85. setup(props) {
  86. const { proxy } = getCurrentInstance(); // 相当于之前的this
  87. onMounted(() => { //组件挂载到页面之后执行
  88. tinymce.init({}); // 初始化富文本
  89. });
  90. const data = reactive({
  91. loading: false,
  92. myValue: props.value,
  93. disabled: props.disabled,
  94. init: {
  95. language_url: "./js/tinymce/langs/zh_CN.js", // 语言包的路径
  96. language: "zh_CN", //语言
  97. skin_url: "./js/tinymce/skins/ui/oxide", // skin路径,
  98. emoticons_database_url: './js/tinymce/emojis.js', // 表情路径
  99. // height: '600px', //编辑器高度
  100. branding: false, //是否禁用“Powered by TinyMCE”
  101. menubar: true, //顶部菜单栏显示
  102. image_dimensions: false, //去除宽高属性
  103. plugins: props.plugins, // 插件
  104. toolbar: props.toolbar, // 工具栏
  105. promotion: false, // 隐藏右上角Upgrade 按钮
  106. font_formats: 'Arial=arial,helvetica,sans-serif; 宋体=SimSun; 微软雅黑=Microsoft Yahei; Impact=impact,chicago;', //字体
  107. fontsize_formats: '11px 12px 14px 16px 18px 24px 36px 48px 64px 72px', //文字大小
  108. // paste_convert_word_fake_lists: false, // 插入word文档需要该属性
  109. paste_data_images: false, //图片是否可粘贴
  110. paste_webkit_styles: "all", //此选项允许您指定在WebKit中粘贴时要保留的样式
  111. paste_merge_formats: true, //此选项启用粘贴插件的合并格式功能
  112. nonbreaking_force_tab: false, // 此选项允许您在用户按下键盘tab键时强制TinyMCE插入三个实体
  113. paste_auto_cleanup_on_paste: false,
  114. file_picker_types: 'file', // 此选项允许您通过空格或逗号分隔的类型名称列表指定所需的文件选取器类型。目前有三种有效类型:文件、图像和媒体
  115. content_css: '/tinymce/skins/content/default/content.css',
  116. setup: (editor) => {
  117. let _this = proxy;
  118. _this.myEditor = editor
  119. //定义一个名为 assignment 的toolbar
  120. editor.ui.registry.addButton('assignment', {
  121. icon: "image",
  122. tooltip: '上传图片',
  123. onAction: () => {
  124. _this.$refs.UploadPanelRef.selectFile();
  125. _this.Editor = editor;
  126. },
  127. })
  128. },
  129. imagetools_toolbar: 'editimage', // 图片控制的工具栏
  130. content_style:"img {max-width:100%;height:auto}", // 图片最大宽度
  131. },
  132. });
  133. watch(() => props.value,(newVal, oldValue) => {
  134. data.myValue = newVal;
  135. }
  136. );
  137. watch(()=>data.myValue,(newvalue,oldValue)=>{
  138. proxy.$emit('changeVal', newvalue);
  139. });
  140. const importProjectUrl = (url)=> {
  141. proxy.myEditor.execCommand('insertImage', false, `${proxy.$storage.getItem('ossDomain') + url}`, );
  142. };
  143. return {
  144. ...toRefs(data),
  145. importProjectUrl
  146. };
  147. }
  148. }
  149. </script>
  150. <style lang='scss' scoped>
  151. .components_Tinymce{
  152. width: 100%;
  153. height: 100%;
  154. overflow: hidden;
  155. }
  156. </style>
  157. <style>
  158. .tox{
  159. width: 100%;
  160. height: 100% !important;
  161. }
  162. </style>