index.vue 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. <template>
  2. <div class="basic-image">
  3. <template v-for="(image,index) in fileList" :key="index">
  4. <img-row :file="image"
  5. :config="config"
  6. :remove-code="config.removeCode"
  7. :removable="true"
  8. @preview="handlePictureCardPreview"
  9. @after-remove="removeFile"></img-row>
  10. </template>
  11. <cip-upload action="uploadUrl"
  12. listType="picture-card"
  13. :itemStyle="{width: config.itemWidth, height: config.itemHeight}"
  14. :accept="accept"
  15. :before-upload="beforeUpload"
  16. :uploadFile="uploadFile"
  17. :show-file-list="false"
  18. :disabled="uploadDisabled"
  19. multiple>
  20. </cip-upload>
  21. <div class="el-upload__tip" style="width: 100%">{{limitTip}}</div>
  22. <cip-dialog :title="(config.mediaType === 'video' ?'视频': '图片') +'预览'" v-model="dialogVisible" :show-only="true">
  23. <Media style="width:100%" :type="config.mediaType" :src="dialogImageUrl" alt=""/>
  24. </cip-dialog>
  25. </div>
  26. </template>
  27. <script>
  28. import { computed, ref } from 'vue'
  29. import CipDialog from '@cip/components/cip-dialog'
  30. import Media from './media'
  31. import ImgRow from './img-row'
  32. import { formInputProps, fromInputEmits } from '../../form-input-props'
  33. import { uploadProps } from '../file/upload'
  34. import CipUpload from '@cip/components/cip-upload'
  35. export default {
  36. props: formInputProps,
  37. components: { CipDialog, ImgRow, Media, CipUpload },
  38. emits: [...fromInputEmits],
  39. setup (props, context) {
  40. const { fileList, mainMessage, countLimit, typeLimit, sizeLimit, ...uploadUtils } = uploadProps(props, context)
  41. const dialogImageUrl = ref('')
  42. const dialogVisible = ref(false)
  43. // 验证文件是否可以上传
  44. const beforeUpload = (file) => {
  45. if (mainMessage(typeLimit(file), '图片上传类型超出限制') ||
  46. mainMessage(countLimit(file), '图片上传数量超出限制') ||
  47. mainMessage(sizeLimit(file), '图片上传大小超出限制')) {
  48. return false
  49. }
  50. }
  51. const handlePictureCardPreview = (file) => {
  52. dialogImageUrl.value = props.config.imgTemplate ? props.config.imgTemplate(file.url) : file.url
  53. dialogVisible.value = true
  54. }
  55. // 限制提示语
  56. const limitTip = computed(() => {
  57. const { fileType, size, limitTip: configLimitTip } = props.config
  58. if (configLimitTip) return configLimitTip
  59. if (!!fileType && !!size) return `只能上传${fileType}文件,且不超过${size}MB`
  60. if (!!fileType && !size) return `只能上传${fileType}文件`
  61. if (!fileType && !!size) return `只能上传不超过${props.config.size}MB的文件`
  62. return ''
  63. })
  64. const accept = computed(() => {
  65. const fileType = props.config.fileType
  66. if (fileType) {
  67. return '.' + fileType.replace(/,\s?/g, ',.')
  68. }
  69. return 'image/*'
  70. })
  71. return {
  72. ...uploadUtils,
  73. fileList,
  74. beforeUpload,
  75. handlePictureCardPreview,
  76. dialogVisible,
  77. dialogImageUrl,
  78. limitTip,
  79. accept
  80. }
  81. }
  82. }
  83. </script>
  84. <style lang="less">
  85. .basic-image{
  86. display: flex;
  87. flex-wrap: wrap;
  88. .cip-upload{
  89. margin: 0 8px 8px 0;
  90. }
  91. .image-plus{
  92. background-color: #fbfdff;
  93. border: 1px dashed #c0ccda;
  94. border-radius: 6px;
  95. box-sizing: border-box;
  96. width: 148px;
  97. height: 148px;
  98. cursor: pointer;
  99. line-height: 146px;
  100. vertical-align: top;
  101. text-align: center;
  102. i{
  103. font-size: 28px;
  104. color: #8c939d;
  105. }
  106. &:hover{
  107. border: 1px dashed #409eff;
  108. }
  109. }
  110. }
  111. </style>