upload.vue 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. <script setup lang="tsx">
  2. import { ref } from "vue";
  3. import ReCropper from "@/components/ReCropper";
  4. import { formatBytes } from "@pureadmin/utils";
  5. const props = defineProps({
  6. imgSrc: String
  7. });
  8. const emit = defineEmits(["cropper"]);
  9. const infos = ref();
  10. const refCropper = ref();
  11. const showPopover = ref(false);
  12. const cropperImg = ref<string>("");
  13. function onCropper({ base64, blob, info }) {
  14. infos.value = info;
  15. cropperImg.value = base64;
  16. emit("cropper", { base64, blob, info });
  17. }
  18. </script>
  19. <template>
  20. <div v-loading="!showPopover" element-loading-background="transparent">
  21. <el-popover :visible="showPopover" placement="right" width="18vw">
  22. <template #reference>
  23. <div class="w-[18vw]">
  24. <ReCropper
  25. ref="refCropper"
  26. :src="props.imgSrc"
  27. circled
  28. @cropper="onCropper"
  29. @readied="showPopover = true"
  30. />
  31. <p v-show="showPopover" class="mt-1 text-center">
  32. 温馨提示:右键上方裁剪区可开启功能菜单
  33. </p>
  34. </div>
  35. </template>
  36. <div class="flex flex-wrap justify-center items-center text-center">
  37. <el-image
  38. v-if="cropperImg"
  39. :src="cropperImg"
  40. :preview-src-list="Array.of(cropperImg)"
  41. fit="cover"
  42. />
  43. <div v-if="infos" class="mt-1">
  44. <p>
  45. 图像大小:{{ parseInt(infos.width) }} ×
  46. {{ parseInt(infos.height) }}像素
  47. </p>
  48. <p>
  49. 文件大小:{{ formatBytes(infos.size) }}({{ infos.size }} 字节)
  50. </p>
  51. </div>
  52. </div>
  53. </el-popover>
  54. </div>
  55. </template>