<template>
<div class="user-avatar-info">
<a-popover title="" :overlayStyle="{width: '250px'}">
<template #content>
<div style="display: flex;flex-direction: row;align-items: center">
<div style="width: 60px;text-align: center">
<a-avatar v-if="userAvatar" :src="userAvatar" :size="47"/>
<a-avatar v-else :size="47">{{ getAvatarText() }}</a-avatar>
</div>
<div style="flex: 1;display: flex;flex-direction: column;margin-left: 12px">
<div style="color: #000;display: inline-block;font-size: 15px;font-weight: 700;margin-top: 3px;vertical-align: top;width: 170px;">
{{ userLabel }}
</div>
<div style="color: #757575;display: block;margin-top: 4px;">
{{ phone }}
</div>
</div>
</div>
</template>
<span style="cursor: pointer">
<a-avatar v-if="userAvatar" :src="userAvatar" :loadError="loadError"/>
<a-avatar v-else>{{ getAvatarText() }}</a-avatar>
</span>
</a-popover>
<span class="realname-ellipsis">
{{ userLabel }}
</span>
</div>
</template>
<script lang="ts">
import { ref, watchEffect, defineComponent } from 'vue';
import { defHttp } from '/@/utils/http/axios';
import { getFileAccessHttpUrl } from '/@/utils/common/compUtils';
export default defineComponent({
name: 'UserAvatar',
props: {
username: {
type: String,
default: '',
},
detail:{
type: Object,
default: ()=>{},
}
},
setup(props) {
const userAvatar = ref('');
const userLabel = ref('');
const phone = ref('');
watchEffect(async ()=>{
userAvatar.value = '';
userLabel.value = '';
phone.value = '';
let username = props.username;
if(username){
await initUserInfo(username);
}
let userInfo = props.detail;
if(userInfo){
if(userInfo.avatar){
userAvatar.value = getFileAccessHttpUrl(userInfo.avatar);
}
if(userInfo.realname){
userLabel.value = userInfo.realname;
}
if(userInfo.phone){
phone.value = userInfo.phone;
}
}
});
async function initUserInfo(val) {
const params = {
username: val,
};
const url = '/sys/user/getMultiUser';
const data = await defHttp.get({ url, params }, {isTransformResponse: false});
if(data && data.length > 0){
let temp = data[0].avatar;
if (temp) {
userAvatar.value = getFileAccessHttpUrl(temp)
}
userLabel.value = data[0].realname;
phone.value = data[0].phone;
}else{
console.log(data)
}
}
function getAvatarText() {
let text = userLabel.value;
if (!text) {
text = props.username;
}
if (text) {
if (text.length > 2) {
return text.substr(0, 2);
} else {
return text;
}
}
return '';
}
function loadError() {
userAvatar.value = '';
return true;
}
return {
userAvatar,
userLabel,
getAvatarText,
phone,
loadError
};
},
});
</script>
<style scoped lang="less">
.user-avatar-info{
.ant-avatar-image{
cursor: pointer;
}
.realname-ellipsis {
overflow: hidden;
text-overflow: ellipsis;
vertical-align: top;
white-space: nowrap;
height: 32px;
line-height: 32px;
display: inline-block;
margin-left: 10px;
}
}
</style>