MyEdit.vue 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. <script setup>
  2. import {AiEditor} from "aieditor";
  3. import "aieditor/dist/style.css"
  4. import {onMounted, onUnmounted, ref} from "vue";
  5. const divRef = ref();
  6. const baseUrl = import.meta.env.VITE_APP_BASE_API;
  7. const minioUrl = import.meta.env.VITE_MINIO_BASE_API;
  8. let aiEditor = null;
  9. onMounted(() => {
  10. aiEditor = new AiEditor({
  11. element: divRef.value,
  12. placeholder: "点击输入内容...",
  13. content: '',
  14. toolbarKeys: ["undo", "redo", "brush", "eraser",
  15. "|", "heading", "font-family", "font-size",
  16. "|", "bold", "italic", "underline", "strike", "link", "code", "subscript", "superscript", "hr", "todo", "emoji",
  17. "|", "highlight", "font-color",
  18. "|", "align", "line-height",
  19. "|", "bullet-list", "ordered-list", "indent-decrease", "indent-increase", "break",
  20. "|", "image", "video", "attachment",
  21. "|", "source-code", "fullscreen"
  22. ],
  23. textSelectionBubbleMenu:{
  24. enable: true,
  25. items: ["Bold", "Italic", "Underline", "Strike", "code", "comment"],
  26. },
  27. image: {
  28. allowBase64: true,
  29. defaultSize: 350,
  30. uploadUrl: baseUrl+"/xcrFile/save",
  31. uploadFormName: "file",
  32. uploader: (file, uploadUrl, headers, formName) => {
  33. const formData = new FormData();
  34. formData.append(formName, file);
  35. formData.append('moduleName', '性与暴力');
  36. return new Promise((resolve, reject) => {
  37. fetch(uploadUrl, {
  38. method: "post",
  39. headers: {'Accept': 'application/json', ...headers},
  40. body: formData,
  41. }).then((resp) => resp.json())
  42. .then(json => {
  43. resolve(json);
  44. }).catch((error) => {
  45. reject(error);
  46. })
  47. });
  48. },
  49. uploaderEvent:{
  50. onSuccess(file, res){
  51. if(res.code !== 200){
  52. Elmessage({ message: res.msg, type: 'warning' });
  53. return false;
  54. }
  55. return {
  56. "errorCode": 0,
  57. "data": {
  58. "src": minioUrl+res.data.fileUrl,
  59. "alt": "富文本图片",
  60. "id": res.data.id
  61. }
  62. }
  63. },
  64. },
  65. bubbleMenuItems: ["AlignLeft", "AlignCenter", "AlignRight","delete"]
  66. },
  67. })
  68. })
  69. defineExpose({
  70. getContent() {
  71. return aiEditor.getHtml()
  72. },
  73. setContent(content) {
  74. aiEditor.setContent(content)
  75. }
  76. })
  77. onUnmounted(() => {
  78. aiEditor && aiEditor.destroy();
  79. })
  80. </script>
  81. <template>
  82. <div ref="divRef" style="height: 600px"></div>
  83. </template>