index.tsx 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. import { Icon, Image, Toast, Uploader } from "vant";
  2. import { defineComponent } from "vue";
  3. import styles from "./index.module.less";
  4. import ColCropper from "../col-cropper";
  5. import iconUploader from '@common/images/icon_uploader.png';
  6. import request from "@/helpers/request";
  7. export default defineComponent({
  8. name: 'col-upload',
  9. props: {
  10. modelValue: String,
  11. tips: {
  12. type: String,
  13. default: '点击上传'
  14. },
  15. deletable: {
  16. type: Boolean,
  17. default: true
  18. },
  19. cropper: { // 是否进行裁切
  20. type: Boolean,
  21. default: false
  22. },
  23. options: { // 裁切需要参数
  24. type: Object,
  25. default: {}
  26. }
  27. },
  28. mounted() {
  29. // console.log(this.modelValue, 'uploader');
  30. },
  31. methods: {
  32. beforeRead(file: any) {
  33. const isLt2M = file.size / 1024 / 1024 < 5
  34. if (!isLt2M) {
  35. Toast('上传文件大小不能超过 5MB')
  36. return false
  37. }
  38. return true
  39. },
  40. beforeDelete(file: any, detail: { index: any; }) {
  41. // this.dataModel.splice(detail.index, 1)
  42. return true
  43. },
  44. async afterRead(file: any, detail: any) {
  45. try {
  46. file.status = 'uploading';
  47. file.message = '上传中...';
  48. let formData = new FormData();
  49. formData.append('file', file.file);
  50. let res = await request.post('/api-teacher/uploadFile', {
  51. data: formData
  52. })
  53. this.$emit('update:modelValue', res.data.url);
  54. } catch (error) {
  55. //
  56. }
  57. },
  58. onClose(e: any) {
  59. this.$emit('update:modelValue', null);
  60. e.stopPropagation();
  61. },
  62. async getFile(file: any) {
  63. // 上传文件
  64. try {
  65. let formData = new FormData();
  66. formData.append('file', file);
  67. let res = await request.post('/api-teacher/uploadFile', {
  68. data: formData
  69. })
  70. this.$emit('update:modelValue', res.data.url);
  71. } catch {
  72. //
  73. }
  74. }
  75. },
  76. render() {
  77. return (
  78. <div class={styles['uploader-section']}>
  79. {this.modelValue && this.deletable ? <Icon name="cross" onClick={this.onClose} class={styles["img-close"]} /> : null}
  80. {this.cropper ? <div class={styles['col-uploader']}>
  81. {this.modelValue ? <Image fit="cover" position="center" class={styles.uploadImg} src={this.modelValue} /> : <div class={styles.uploader}>
  82. <Icon name={iconUploader} size="32" />
  83. <p class={styles.uploaderText}>{this.tips}</p>
  84. </div>}
  85. <ColCropper option={this.options} getFile={this.getFile} />
  86. </div> : (
  87. // @ts-ignore
  88. <Uploader afterRead={this.afterRead} beforeRead={this.beforeRead} beforeDelete={this.beforeDelete}
  89. v-slots={{
  90. default: () => (this.modelValue ? <Image fit="cover" position="center" class={styles.uploadImg} src={this.modelValue} /> : <div class={styles.uploader}>
  91. <Icon name={iconUploader} size="32" />
  92. <p class={styles.uploaderText}>{this.tips}</p>
  93. </div>)
  94. }}
  95. />
  96. )}
  97. </div>
  98. )
  99. }
  100. })