WxEditor.vue 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. <script setup>
  2. import { ref, reactive } from 'vue'
  3. import { getAccessToken } from '@/utils/auth'
  4. import { Editor } from '@/components/Editor'
  5. const BASE_URL = import.meta.env.VITE_BASE_URL
  6. const actionUrl = BASE_URL + '/admin-api/mp/material/upload-news-image' // 这里写你要上传的图片服务器地址
  7. const headers = { Authorization: 'Bearer ' + getAccessToken() } // 设置上传的请求头部
  8. const message = useMessage()
  9. const props = defineProps({
  10. /* 公众号账号编号 */
  11. accountId: {
  12. type: Number,
  13. required: true
  14. },
  15. /* 编辑器的内容 */
  16. value: {
  17. type: String,
  18. default: ''
  19. },
  20. /* 图片大小 */
  21. maxSize: {
  22. type: Number,
  23. default: 4000 // kb
  24. }
  25. })
  26. const emit = defineEmits(['input'])
  27. const myQuillEditorRef = ref()
  28. const content = ref(props.value.replace(/data-src/g, 'src'))
  29. const loading = ref(false) // 根据图片上传状态来确定是否显示loading动画,刚开始是false,不显示
  30. const uploadData = reactive({
  31. type: 'image', // TODO 芋艿:试试要不要换成 thumb
  32. accountId: props.accountId
  33. })
  34. const onEditorChange = (text) => {
  35. //内容改变事件
  36. emit('input', text)
  37. }
  38. // 富文本图片上传前
  39. const beforeUpload = () => {
  40. // 显示 loading 动画
  41. loading.value = true
  42. }
  43. // 图片上传成功
  44. // 注意!由于微信公众号的图片有访问限制,所以会显示“此图片来自微信公众号,未经允许不可引用”
  45. const uploadSuccess = (res) => {
  46. // res为图片服务器返回的数据
  47. // 获取富文本组件实例
  48. const quill = myQuillEditorRef.value.quill
  49. // 如果上传成功
  50. const link = res.data
  51. if (link) {
  52. // 获取光标所在位置
  53. let length = quill.getSelection().index
  54. // 插入图片 res.info为服务器返回的图片地址
  55. quill.insertEmbed(length, 'image', link)
  56. // 调整光标到最后
  57. quill.setSelection(length + 1)
  58. } else {
  59. message.error('图片插入失败')
  60. }
  61. // loading 动画消失
  62. loading.value = false
  63. }
  64. // 富文本图片上传失败
  65. const uploadError = () => {
  66. // loading 动画消失
  67. loading.value = false
  68. message.error('图片插入失败')
  69. }
  70. </script>
  71. <template>
  72. <div id="wxEditor">
  73. <div v-loading="loading" element-loading-text="请稍等,图片上传中">
  74. <!-- 图片上传组件辅助-->
  75. <el-upload
  76. class="avatar-uploader"
  77. name="file"
  78. :action="actionUrl"
  79. :headers="headers"
  80. :show-file-list="false"
  81. :data="uploadData"
  82. :on-success="uploadSuccess"
  83. :on-error="uploadError"
  84. :before-upload="beforeUpload"
  85. />
  86. <Editor
  87. editor-id="wxEditor"
  88. ref="quillEditorRef"
  89. :modelValue="content"
  90. @change="(editor) => onEditorChange(editor.getText())"
  91. />
  92. </div>
  93. </div>
  94. </template>
  95. <style></style>