FlowNodeAvatar.vue 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. <template>
  2. <div class="avatar" :style="AvatarStyle">
  3. <el-avatar v-if="avatar && !useSlots().avatar" :size="size" class="icon" :src="avatar" />
  4. <!-- <el-avatar v-if="user && user.avatar" :size="size" class="icon" :src="user.avatar" /> -->
  5. <!-- <el-avatar v-else :size="size" class="icon" :icon="UserFilled" /> -->
  6. <el-avatar v-if="!avatar && !useSlots().avatar" :size="size" class="icon">
  7. <template v-if="name">
  8. {{ name?.charAt(0) || '-' }}
  9. </template>
  10. <UserFilled v-else />
  11. </el-avatar>
  12. <el-avatar v-if="useSlots().avatar" :size="size" class="icon" style="background-color: #2a5eff">
  13. <slot name="avatar"></slot>
  14. </el-avatar>
  15. <!-- <div v-if="showName && user && user.name" class="name" :style="NameStyle">{{ user.name }}</div> -->
  16. <div v-if="showName" class="name" :style="NameStyle">{{ name }}</div>
  17. </div>
  18. </template>
  19. <script setup>
  20. import { computed, ref, watch, onBeforeMount, useSlots } from 'vue'
  21. // import { UserFilled } from '@element-plus/icons-vue'
  22. const user = ref({})
  23. const props = defineProps({
  24. size: { type: Number, default: 24 },
  25. id: { type: String, default: '' },
  26. name: { type: String, default: '' },
  27. avatar: { type: String, default: '' },
  28. showName: { type: Boolean, default: true }
  29. })
  30. watch(
  31. () => props.id,
  32. () => loadUserDetail()
  33. )
  34. const loadUserDetail = () => {
  35. user.value = {
  36. name: '艾斯'
  37. }
  38. }
  39. const AvatarStyle = computed(() => {
  40. const padding = props.showName ? 4 : 0
  41. return {
  42. height: props.size + padding * 2 + 'px',
  43. borderRadius: (props.size + padding * 2) / 2 + 'px',
  44. padding: padding + 'px'
  45. }
  46. })
  47. const NameStyle = computed(() => {
  48. return {
  49. fontSize: props.size / 2 + 1 + 'px'
  50. }
  51. })
  52. onBeforeMount(() => {
  53. loadUserDetail()
  54. })
  55. </script>
  56. <style lang="scss" scoped>
  57. .avatar {
  58. background: #f2f4f5;
  59. display: flex;
  60. align-items: center;
  61. width: fit-content;
  62. .el-avatar {
  63. background: var(--el-color-primary);
  64. }
  65. .icon {
  66. overflow: hidden;
  67. flex-shrink: 0;
  68. }
  69. .name {
  70. user-select: none;
  71. font-family: PingFangSC-Regular, PingFang SC;
  72. color: #34383e;
  73. margin: 0 4px;
  74. overflow: hidden;
  75. white-space: nowrap;
  76. text-overflow: ellipsis;
  77. max-width: 64px;
  78. }
  79. }
  80. </style>