index.vue 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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. <el-link
  40. class="mt-2"
  41. href="https://github.com/pure-admin/vue-pure-admin/blob/main/src/views/components/cropping"
  42. target="_blank"
  43. >
  44. 代码位置 src/views/components/cropping
  45. </el-link>
  46. </template>
  47. <div v-loading="!showPopover" element-loading-background="transparent">
  48. <el-popover
  49. ref="popoverRef"
  50. :visible="showPopover"
  51. placement="right"
  52. width="300px"
  53. >
  54. <template #reference>
  55. <ReCropper
  56. ref="refCropper"
  57. class="w-[30vw]"
  58. :src="avatar"
  59. circled
  60. @cropper="onCropper"
  61. @readied="showPopover = true"
  62. />
  63. </template>
  64. <div class="flex flex-wrap justify-center items-center text-center">
  65. <el-image
  66. v-if="cropperImg"
  67. :src="cropperImg"
  68. :preview-src-list="Array.of(cropperImg)"
  69. fit="cover"
  70. />
  71. <div v-if="infos" class="mt-1">
  72. <p>
  73. 图像大小:{{ parseInt(infos.width) }} ×
  74. {{ parseInt(infos.height) }}像素
  75. </p>
  76. <p>
  77. 文件大小:{{ formatBytes(infos.size) }}({{ infos.size }} 字节)
  78. </p>
  79. </div>
  80. </div>
  81. </el-popover>
  82. </div>
  83. </el-card>
  84. </template>