2025-05-09 06:58:59 +00:00
|
|
|
|
<template>
|
2025-05-19 05:52:41 +00:00
|
|
|
|
<div class="relative">
|
2025-05-09 06:58:59 +00:00
|
|
|
|
<div class="avatar-module" :style="[customStyle, { background: avatar ? '#fff' : '' }]">
|
|
|
|
|
<img :src="avatar" v-if="avatar" />
|
|
|
|
|
<span v-else :style="customTextStyle">{{ text_avatar }}</span>
|
|
|
|
|
</div>
|
2025-05-19 05:52:41 +00:00
|
|
|
|
<div
|
|
|
|
|
v-if="[2,3,4].includes(groupType)&&showGroupType"
|
|
|
|
|
class="absolute border-2px border-solid rounded-3px bg-#fff flex justify-center items-center leading-none"
|
|
|
|
|
:style="[
|
|
|
|
|
groupLabelStyle,
|
|
|
|
|
`color:${labelColor.find(x=>x.group_type===groupType)?.color};border-color:${labelColor.find(x=>x.group_type===groupType)?.color}`
|
|
|
|
|
]"
|
|
|
|
|
>
|
|
|
|
|
{{ labelColor.find(x=>x.group_type===groupType)?.label }}
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
2025-05-09 06:58:59 +00:00
|
|
|
|
</template>
|
|
|
|
|
<script setup>
|
|
|
|
|
//群聊默认头像
|
|
|
|
|
import groupNormal from '@/assets/image/groupNormal.png'
|
|
|
|
|
import groupDepartment from '@/assets/image/groupDepartment.png'
|
|
|
|
|
import groupProject from '@/assets/image/groupProject.png'
|
|
|
|
|
import groupCompany from '@/assets/image/groupCompany.png'
|
|
|
|
|
import { computed, defineProps } from 'vue'
|
2025-05-19 05:52:41 +00:00
|
|
|
|
//群类型:1=普通群;2=部门群;3=项目群;4=总群/公司群
|
|
|
|
|
const labelColor=[
|
|
|
|
|
{group_type:2,color:'#377EC6',label:'部门'},
|
|
|
|
|
{group_type:3,color:'#C1691C',label:'项目'},
|
|
|
|
|
{group_type:4,color:'#7A58DE',label:'公司'},
|
|
|
|
|
]
|
2025-05-09 06:58:59 +00:00
|
|
|
|
const props = defineProps({
|
|
|
|
|
mode: {
|
|
|
|
|
//模式:1=人;2=群
|
|
|
|
|
type: Number,
|
|
|
|
|
default: 0,
|
|
|
|
|
},
|
2025-05-19 05:52:41 +00:00
|
|
|
|
showGroupType:{
|
|
|
|
|
type:Boolean,
|
|
|
|
|
default:false
|
|
|
|
|
},
|
2025-05-09 06:58:59 +00:00
|
|
|
|
avatar: {
|
|
|
|
|
//头像
|
|
|
|
|
type: String,
|
|
|
|
|
default: '',
|
|
|
|
|
},
|
|
|
|
|
userName: {
|
|
|
|
|
//用户名称
|
|
|
|
|
type: String,
|
|
|
|
|
default: '',
|
|
|
|
|
},
|
|
|
|
|
groupType: {
|
|
|
|
|
//群类型:1=普通群;2=部门群;3=项目群;4=总群/公司群
|
|
|
|
|
type: Number,
|
|
|
|
|
default: 0,
|
|
|
|
|
},
|
|
|
|
|
customStyle: {
|
|
|
|
|
//自定义样式
|
|
|
|
|
type: Object,
|
|
|
|
|
default() {
|
|
|
|
|
return {}
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
customTextStyle: {
|
|
|
|
|
//自定义文字样式
|
|
|
|
|
type: Object,
|
|
|
|
|
default() {
|
|
|
|
|
return {}
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
//头像
|
|
|
|
|
const avatar = computed(() => {
|
|
|
|
|
let avatar_img = props?.avatar
|
|
|
|
|
if (!avatar_img) {
|
|
|
|
|
if (props?.mode === 1) {
|
|
|
|
|
} else if (props?.mode === 2) {
|
|
|
|
|
if (props?.groupType === 1) {
|
|
|
|
|
avatar_img = groupNormal
|
|
|
|
|
} else if (props?.groupType === 2) {
|
|
|
|
|
avatar_img = groupDepartment
|
|
|
|
|
} else if (props?.groupType === 3) {
|
|
|
|
|
avatar_img = groupProject
|
|
|
|
|
} else if (props?.groupType === 4) {
|
|
|
|
|
avatar_img = groupCompany
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return avatar_img
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
//文字头像
|
|
|
|
|
const text_avatar = computed(() => {
|
|
|
|
|
return props?.userName.length >= 2
|
|
|
|
|
? props?.userName.slice(-2)
|
|
|
|
|
: props?.userName
|
|
|
|
|
})
|
2025-05-19 05:52:41 +00:00
|
|
|
|
|
|
|
|
|
// 计算群标签的动态样式
|
|
|
|
|
const groupLabelStyle = computed(() => {
|
|
|
|
|
// 获取头像的宽高
|
|
|
|
|
const avatarWidth = parseInt(props.customStyle.width) || 42
|
|
|
|
|
const avatarHeight = parseInt(props.customStyle.height) || 42
|
|
|
|
|
|
|
|
|
|
// 计算标签的尺寸比例(基于原始尺寸:头像42px,标签宽32px高18px,文字10px)
|
|
|
|
|
const widthRatio = avatarWidth / 42
|
|
|
|
|
const heightRatio = avatarHeight / 42
|
|
|
|
|
|
|
|
|
|
// 计算标签的尺寸
|
|
|
|
|
const labelWidth = Math.round(32 * widthRatio)
|
|
|
|
|
const labelHeight = Math.round(18 * heightRatio)
|
|
|
|
|
const fontSize = Math.round(10 * widthRatio)
|
|
|
|
|
|
|
|
|
|
// 计算标签的位置(基于原始位置:top-28px)
|
|
|
|
|
const topPosition = Math.round(28 * heightRatio)
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
width: `${labelWidth}px`,
|
|
|
|
|
height: `${labelHeight}px`,
|
|
|
|
|
fontSize: `${fontSize}px`,
|
|
|
|
|
top: `${topPosition}px`,
|
|
|
|
|
left: '50%',
|
|
|
|
|
transform: 'translateX(-50%)'
|
|
|
|
|
}
|
|
|
|
|
})
|
2025-05-09 06:58:59 +00:00
|
|
|
|
</script>
|
|
|
|
|
<style lang="less" scoped>
|
|
|
|
|
.avatar-module {
|
|
|
|
|
border-radius: 50%;
|
|
|
|
|
overflow: hidden;
|
|
|
|
|
display: flex;
|
|
|
|
|
flex-direction: row;
|
|
|
|
|
align-items: center;
|
|
|
|
|
justify-content: center;
|
|
|
|
|
background: linear-gradient(to right, #674bbc, #46299d);
|
|
|
|
|
flex-shrink: 0;
|
|
|
|
|
img {
|
2025-05-12 05:44:13 +00:00
|
|
|
|
width: 42px;
|
|
|
|
|
height: 42px;
|
2025-05-09 06:58:59 +00:00
|
|
|
|
object-fit: cover;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
</style>
|