150 lines
3.4 KiB
Vue
150 lines
3.4 KiB
Vue
|
|
<template>
|
||
|
|
<view :class="{'w-avatar': true, 'show-y': showY}">
|
||
|
|
<view class="w-avatar-it" :style="{height: _sizePx * 32 + 'rpx'}">
|
||
|
|
<image class="w-avatar-img" v-if="src || type !== 'user'" :src="source" mode="aspectFit" :style="{width: _sizePx * 32 + 'rpx', height: _sizePx * 32 + 'rpx'}"></image>
|
||
|
|
<view v-else class="w-avatar-t" :style="{width: _sizePx * 32 + 'rpx', height: _sizePx * 32 + 'rpx', fontSize: size / 42 * 32 + 'rpx'}">
|
||
|
|
{{getShortName(name)}}
|
||
|
|
</view>
|
||
|
|
<uni-icons v-if="closeable" class="w-avatar-close" type="clear" :size="size - 15" @click="emits('close')"></uni-icons>
|
||
|
|
<uni-icons class="w-avatar-status" :key="status" :type="statusIcon.icon" :color="statusIcon.color" :size="size - 22"></uni-icons>
|
||
|
|
</view>
|
||
|
|
<view class="w-avatar-name over-tip" :style="{width: (_sizePx + 0.6) * 32 + 'rpx', fontSize: size / 42 * 32 + 'rpx'}" v-show="showName">{{name}}</view>
|
||
|
|
</view>
|
||
|
|
|
||
|
|
</template>
|
||
|
|
|
||
|
|
<script setup>
|
||
|
|
import { computed } from 'vue';
|
||
|
|
const props = defineProps({
|
||
|
|
type: {
|
||
|
|
type: String,
|
||
|
|
default: 'user'
|
||
|
|
},
|
||
|
|
name: {
|
||
|
|
type: String,
|
||
|
|
default: '未知'
|
||
|
|
},
|
||
|
|
size: {
|
||
|
|
type: Number,
|
||
|
|
default: 40
|
||
|
|
},
|
||
|
|
src: {
|
||
|
|
type: String,
|
||
|
|
default: undefined
|
||
|
|
},
|
||
|
|
bgc: {
|
||
|
|
type: String,
|
||
|
|
default: '#1989fa'
|
||
|
|
},
|
||
|
|
square: {
|
||
|
|
type: Boolean,
|
||
|
|
default: false
|
||
|
|
},
|
||
|
|
showY: {
|
||
|
|
type: Boolean,
|
||
|
|
default: false
|
||
|
|
},
|
||
|
|
showName: {
|
||
|
|
type: Boolean,
|
||
|
|
default: true
|
||
|
|
},
|
||
|
|
closeable: {
|
||
|
|
type: Boolean,
|
||
|
|
default: false
|
||
|
|
},
|
||
|
|
status: {
|
||
|
|
type: String
|
||
|
|
}
|
||
|
|
})
|
||
|
|
|
||
|
|
const emits = defineEmits(['close'])
|
||
|
|
|
||
|
|
const _sizePx = computed(() => {
|
||
|
|
return props.size / 16
|
||
|
|
})
|
||
|
|
|
||
|
|
const source = computed(() => {
|
||
|
|
switch(props.type) {
|
||
|
|
case 'user': return props.src
|
||
|
|
case 'dept': return '/static/image/dept.png'
|
||
|
|
default: return null
|
||
|
|
}
|
||
|
|
})
|
||
|
|
|
||
|
|
const statusIcon = computed(() => {
|
||
|
|
switch (props.status){
|
||
|
|
case 'error': return {icon: 'clear', color: '#ce4345'};
|
||
|
|
case 'pending': return {icon: 'smallcircle', color: '#E79467'};
|
||
|
|
case 'success': return {icon: 'checkbox-filled', color: '#5FB685'};
|
||
|
|
case 'cc': return {icon: 'paperplane-filled', color: '#4C87F3'};
|
||
|
|
case 'comment': return {icon: 'chat-filled', color: '#4478F7'};
|
||
|
|
case 'transfer': return {icon: 'redo-filled', color: '#ce4345'};
|
||
|
|
case 'cancel': return {icon: 'close', color: '#CDCDCD'};
|
||
|
|
case 'recall': return {icon: 'undo-filled', color: '#ce4345'};
|
||
|
|
case 'leader': return {icon: 'person-filled', color: '#E79467'};
|
||
|
|
case 'waiting': return {icon: 'spinner-cycle', color: '#626D80'}
|
||
|
|
default: return {}
|
||
|
|
}
|
||
|
|
})
|
||
|
|
|
||
|
|
function getShortName(name){
|
||
|
|
return name.length > 2 ? name.slice(-2) : name
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
</script>
|
||
|
|
|
||
|
|
<style lang="less" scoped>
|
||
|
|
.w-avatar {
|
||
|
|
display: inline-flex;
|
||
|
|
align-items: center;
|
||
|
|
.w-avatar-it {
|
||
|
|
background-color: white;
|
||
|
|
position: relative;
|
||
|
|
border-radius: 50%;
|
||
|
|
}
|
||
|
|
|
||
|
|
.w-avatar-img {
|
||
|
|
border-radius: 50%;
|
||
|
|
border: 1px solid #f0f0f0;
|
||
|
|
}
|
||
|
|
|
||
|
|
.w-avatar-close {
|
||
|
|
position: absolute;
|
||
|
|
top: -10rpx;
|
||
|
|
right: -8rpx;
|
||
|
|
// background-color: white;
|
||
|
|
border-radius: 50%;
|
||
|
|
}
|
||
|
|
|
||
|
|
.w-avatar-status{
|
||
|
|
position: absolute;
|
||
|
|
bottom: -8rpx;
|
||
|
|
right: -13rpx;
|
||
|
|
background-color: white;
|
||
|
|
border-radius: 50%;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
.w-avatar-t {
|
||
|
|
background-color: #4C87F3;
|
||
|
|
border-radius: 50%;
|
||
|
|
color: white;
|
||
|
|
display: flex;
|
||
|
|
justify-content: center;
|
||
|
|
align-items: center;
|
||
|
|
}
|
||
|
|
|
||
|
|
.w-avatar-name {
|
||
|
|
text-align: center;
|
||
|
|
margin-left: 6rpx;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
.show-y {
|
||
|
|
flex-direction: column;
|
||
|
|
.w-avatar-name {
|
||
|
|
|
||
|
|
}
|
||
|
|
}
|
||
|
|
</style>
|