| <template> | 
|   <div :class="['flexJob-card-top-wrapper', size]"> | 
|     <Avatar | 
|       :src="setOSSLink(avatar)" | 
|       :size="size === 'small' ? 50 : 60" | 
|       class="flexJob-card-top-avatar" | 
|     /> | 
|     <div class="flexJob-card-top-info"> | 
|       <div class="flexJob-card-top-info-item"> | 
|         <div class="flexJob-card-top-info-name">{{ name }}</div> | 
|         <div class="flexJob-card-top-info-gender"> | 
|           <img | 
|             v-if="gender === EnumUserGender.Male" | 
|             :src="IconMale" | 
|             class="flexJob-card-top-info-gender-icon" | 
|           /> | 
|           <img v-else :src="IconFemale" class="flexJob-card-top-info-gender-icon" /> | 
|         </div> | 
|         <div class="flexJob-card-top-info-auth" :class="{ 'is-real-name': isReal }"> | 
|           {{ isReal ? '已实名' : '未实名' }} | 
|         </div> | 
|       </div> | 
|       <slot name="detail"> | 
|         <div class="flexJob-card-top-info-detail"> | 
|           {{ infoDetail }} | 
|         </div> | 
|       </slot> | 
|     </div> | 
|   </div> | 
| </template> | 
|   | 
| <script setup lang="ts"> | 
| import IconMale from '@/assets/mine/icon-male.png'; | 
| import IconFemale from '@/assets/mine/icon-female.png'; | 
| import { AvatarImage, EnumUserGender } from '@12333/constants'; | 
| import { Avatar } from '@12333/components'; | 
| import { computed } from 'vue'; | 
| import { setOSSLink } from '@12333/utils'; | 
|   | 
| defineOptions({ | 
|   name: 'FlexJobTopView', | 
| }); | 
|   | 
| type Props = { | 
|   size?: 'normal' | 'small'; | 
|   | 
|   avatar?: string; | 
|   name?: string; | 
|   gender?: EnumUserGender; | 
|   age?: number; | 
|   isReal?: boolean; | 
|   personalIdentityContent?: string; | 
|   educationalBackgroundContent?: string; | 
|   taskCount?: number; | 
| }; | 
|   | 
| const props = withDefaults(defineProps<Props>(), { | 
|   size: 'normal', | 
|   avatar: AvatarImage, | 
|   personalIdentityContent: '', | 
|   educationalBackgroundContent: '', | 
| }); | 
|   | 
| const infoDetail = computed(() => | 
|   [ | 
|     props.age > 0 ? `${props.age}岁` : '', | 
|     props.personalIdentityContent, | 
|     props.educationalBackgroundContent, | 
|     props.taskCount > 0 ? `上岗${props.taskCount ?? 0}次` : '', | 
|   ] | 
|     .filter(Boolean) | 
|     .join('|') | 
| ); | 
| </script> | 
|   | 
| <style lang="scss"> | 
| @import '@/styles/common.scss'; | 
|   | 
| .flexJob-card-top-wrapper { | 
|   display: flex; | 
|   align-items: center; | 
|   | 
|   .flexJob-card-top-avatar { | 
|     margin-right: 30px; | 
|   } | 
|   | 
|   .flexJob-card-top-info { | 
|     display: flex; | 
|     flex-direction: column; | 
|     flex: 1; | 
|     min-width: 0; | 
|   | 
|     .flexJob-card-top-info-item { | 
|       display: flex; | 
|       align-items: center; | 
|   | 
|       .flexJob-card-top-info-name { | 
|         font-size: 34px; | 
|         line-height: 34px; | 
|         font-weight: bold; | 
|         color: boleGetCssVar('text-color', 'primary'); | 
|         @include ellipsis; | 
|       } | 
|   | 
|       .flexJob-card-top-info-gender { | 
|         display: inline-flex; | 
|         align-items: center; | 
|         height: 34px; | 
|         margin: 0 10px; | 
|         flex-shrink: 0; | 
|   | 
|         .flexJob-card-top-info-gender-icon { | 
|           width: 24px; | 
|           height: 24px; | 
|         } | 
|       } | 
|   | 
|       .flexJob-card-top-info-auth { | 
|         font-size: 28px; | 
|         line-height: 34px; | 
|         flex-shrink: 0; | 
|   | 
|         &.is-real-name { | 
|           color: #2a9e1b; | 
|         } | 
|       } | 
|     } | 
|   | 
|     .flexJob-card-top-info-detail { | 
|       font-size: 24px; | 
|       font-weight: 400; | 
|       line-height: 28px; | 
|       margin-top: 12px; | 
|       color: boleGetCssVar('text-color', 'secondary'); | 
|     } | 
|   } | 
| } | 
| </style> |