index.vue 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. <template>
  2. <span class="headerAvatar">
  3. <template v-if="picType === 'avatar'">
  4. <el-avatar v-if="userStore.userInfo.headerImg" :size="30" :src="avatar" />
  5. <el-avatar v-else :size="30" :src="noAvatar" />
  6. </template>
  7. <template v-if="picType === 'img'">
  8. <img v-if="userStore.userInfo.headerImg" :src="avatar" class="avatar" />
  9. <img v-else :src="noAvatar" class="avatar" />
  10. </template>
  11. <template v-if="picType === 'file'">
  12. <el-image
  13. :preview-src-list="previewSrcList"
  14. :preview-teleported="true"
  15. :src="file"
  16. class="file"
  17. />
  18. </template>
  19. </span>
  20. </template>
  21. <script setup>
  22. import noAvatarPng from '@/assets/noBody.png'
  23. import { useUserStore } from '@/pinia/modules/user'
  24. import { computed, ref, defineProps } from 'vue'
  25. defineOptions({
  26. name: 'CustomPic'
  27. })
  28. const props = defineProps({
  29. picType: {
  30. type: String,
  31. required: false,
  32. default: 'avatar'
  33. },
  34. picSrc: {
  35. type: String,
  36. required: false,
  37. default: ''
  38. },
  39. preview: {
  40. type: Boolean,
  41. default: false
  42. }
  43. })
  44. const path = ref(import.meta.env.VITE_BASE_API + '/')
  45. const noAvatar = ref(noAvatarPng)
  46. const userStore = useUserStore()
  47. const avatar = computed(() => {
  48. if (props.picSrc === '') {
  49. if (
  50. userStore.userInfo.headerImg !== '' &&
  51. userStore.userInfo.headerImg.slice(0, 4) === 'http'
  52. ) {
  53. return userStore.userInfo.headerImg
  54. }
  55. return path.value + userStore.userInfo.headerImg
  56. } else {
  57. if (props.picSrc !== '' && props.picSrc.slice(0, 4) === 'http') {
  58. return props.picSrc
  59. }
  60. return path.value + props.picSrc
  61. }
  62. })
  63. const file = computed(() => {
  64. if (props.picSrc && props.picSrc.slice(0, 4) !== 'http') {
  65. return path.value + props.picSrc
  66. }
  67. return props.picSrc
  68. })
  69. const previewSrcList = computed(() => (props.preview ? [file.value] : []))
  70. </script>
  71. <style scoped>
  72. .headerAvatar {
  73. display: flex;
  74. justify-content: center;
  75. align-items: center;
  76. margin-right: 8px;
  77. }
  78. .file {
  79. width: 80px;
  80. height: 80px;
  81. position: relative;
  82. }
  83. </style>