index.vue 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. <script setup lang="tsx">
  2. import avatar from "./avatar.png";
  3. import { ref, onBeforeUnmount } from "vue";
  4. import ReCropper from "@/components/ReCropper";
  5. import { formatBytes } from "@pureadmin/utils";
  6. defineOptions({
  7. name: "Cropping"
  8. });
  9. const infos = ref();
  10. const popoverRef = ref();
  11. const refCropper = ref();
  12. const showPopover = ref(false);
  13. const cropperImg = ref<string>("");
  14. function onCropper({ base64, blob, info }) {
  15. console.log(blob);
  16. infos.value = info;
  17. cropperImg.value = base64;
  18. }
  19. onBeforeUnmount(() => {
  20. popoverRef.value.hide();
  21. });
  22. </script>
  23. <template>
  24. <el-card shadow="never">
  25. <template #header>
  26. <div class="card-header">
  27. <span class="font-medium">
  28. 图片裁剪,基于开源的
  29. <el-link
  30. href="https://fengyuanchen.github.io/cropperjs/"
  31. target="_blank"
  32. style="margin: 0 4px 5px; font-size: 16px"
  33. >
  34. cropperjs
  35. </el-link>
  36. 进行二次封装(提示:右键下面左侧裁剪区可开启功能菜单)
  37. </span>
  38. </div>
  39. </template>
  40. <div v-loading="!showPopover" element-loading-background="transparent">
  41. <el-popover
  42. ref="popoverRef"
  43. :visible="showPopover"
  44. placement="right"
  45. width="300px"
  46. >
  47. <template #reference>
  48. <ReCropper
  49. ref="refCropper"
  50. class="w-[30vw]"
  51. :src="avatar"
  52. circled
  53. @cropper="onCropper"
  54. @readied="showPopover = true"
  55. />
  56. </template>
  57. <div class="flex flex-wrap justify-center items-center text-center">
  58. <el-image
  59. v-if="cropperImg"
  60. :src="cropperImg"
  61. :preview-src-list="Array.of(cropperImg)"
  62. fit="cover"
  63. />
  64. <div v-if="infos" class="mt-1">
  65. <p>
  66. 图像大小:{{ parseInt(infos.width) }} ×
  67. {{ parseInt(infos.height) }}像素
  68. </p>
  69. <p>
  70. 文件大小:{{ formatBytes(infos.size) }}({{ infos.size }} 字节)
  71. </p>
  72. </div>
  73. </div>
  74. </el-popover>
  75. </div>
  76. </el-card>
  77. </template>