Files
Yi.Admin/Yi.Bbs.Vue3/src/components/AvatarInfo.vue

194 lines
3.9 KiB
Vue
Raw Normal View History

2023-12-14 23:29:36 +08:00
<template>
<div class="avatar">
<div class="avatar-left">
<el-avatar :size="props.size" :src="iconUrl" />
2023-12-21 12:56:06 +08:00
<div v-if="props.isSelf" class="avatar-center">
2023-12-14 23:29:36 +08:00
<div class="nick">{{ userInfo.nick }}</div>
</div>
<div v-if="!props.isSelf">
<div class="nick" :class="{ mt_1: props.time != 'undefined' }">
<div class="text">{{ userInfo.nick }}</div>
<div class="level">
2023-12-23 18:47:28 +08:00
<el-tag round effect="light" type="success" v-if="userInfo.level">{{
userInfo.level
}}</el-tag>
</div>
2023-12-23 18:47:28 +08:00
<div class="status" v-if="userInfo.userLimit">
<el-tag round effect="light" :type="userInfo.userLimit.type">
{{ userInfo.userLimit.label }}
</el-tag>
</div>
2023-12-14 10:15:23 +08:00
</div>
2023-12-14 23:29:36 +08:00
<div class="remarks" v-if="props.time">{{ props.time }}</div>
<div class="remarks">
<slot name="bottom" />
</div>
</div>
<div class="info" v-if="!props.isSelf">
<el-tag class="ml-2" type="warning">V8</el-tag>
<el-tag class="ml-2" type="danger">会员</el-tag>
</div>
2023-12-21 12:56:06 +08:00
<el-button
v-if="props.showWatching"
type="primary"
size="small"
icon="Plus"
>关注</el-button
>
2023-12-14 10:15:23 +08:00
</div>
2023-12-14 23:29:36 +08:00
</div>
2023-12-14 10:15:23 +08:00
</template>
<script setup>
2023-12-14 23:29:36 +08:00
import useUserStore from "@/stores/user";
import { reactive, watch, onMounted, computed, ref } from "vue";
2023-12-24 21:26:04 +08:00
import { upload } from "@/apis/fileApi";
2023-12-14 10:15:23 +08:00
//userInfo
//{icon,name,role,id},根据判断userInfo是否等于未定义来觉得是当前登录用户信息还是其他人信息
2023-12-14 23:29:36 +08:00
const props = defineProps([
"size",
"showWatching",
"time",
"userInfo",
"isSelf",
]);
2023-12-14 10:15:23 +08:00
const userStore = useUserStore();
const userInfo = reactive({
2023-12-14 23:29:36 +08:00
icon: "",
nick: "",
role: [],
id: "",
2023-12-23 18:47:28 +08:00
level: "",
userLimit: "",
2023-12-14 10:15:23 +08:00
});
2023-12-15 00:56:23 +08:00
const iconUrl = ref("/favicon.ico");
2023-12-24 21:26:04 +08:00
const iconUrlHandler = (icon) => {
2023-12-14 23:29:36 +08:00
if (
userInfo.icon == null ||
userInfo.icon == undefined ||
userInfo.icon == ""
) {
2023-12-15 00:56:23 +08:00
return "/favicon.ico";
2023-12-24 21:26:04 +08:00
} else {
return import.meta.env.VITE_APP_BASEAPI + "/file/" + icon;
2023-12-14 23:29:36 +08:00
}
};
2023-12-14 10:15:23 +08:00
watch(userStore, (n) => {
2023-12-14 23:29:36 +08:00
if (props.userInfo == undefined) {
userInfo.nick = n.name;
}
});
2023-12-14 10:15:23 +08:00
2023-12-14 23:29:36 +08:00
watch(
() => props,
(n) => {
2023-12-14 10:15:23 +08:00
Init();
2023-12-14 23:29:36 +08:00
},
{ deep: true }
);
2023-12-14 10:15:23 +08:00
onMounted(() => {
2023-12-14 23:29:36 +08:00
Init();
});
2023-12-14 10:15:23 +08:00
const Init = () => {
2023-12-14 23:29:36 +08:00
//使用传入值
if (props.userInfo != undefined) {
userInfo.icon = props.userInfo.icon;
userInfo.nick = props.userInfo.nick;
userInfo.role = props.userInfo.role;
userInfo.id = props.userInfo.id;
userInfo.level = "等级" + props.userInfo.level;
2023-12-23 18:47:28 +08:00
userInfo.userLimit = getStatusInfo(props.userInfo.userLimit);
2023-12-14 23:29:36 +08:00
iconUrl.value = iconUrlHandler(userInfo.icon);
}
//使用当前登录用户
else {
userInfo.icon = userStore.icon;
userInfo.nick = userStore.name;
userInfo.role = userStore.role;
userInfo.id = userStore.id;
iconUrl.value = userInfo.icon;
2023-12-14 23:29:36 +08:00
}
};
const statusTypeList = [
{
label: "正常",
value: 0,
type: "success",
},
{
label: "危险",
value: 1,
type: "warning",
},
{
label: "已禁止",
value: 2,
type: "danger",
},
];
const getStatusInfo = (type) => {
return statusTypeList.filter((item) => item.value === type)[0];
};
2023-12-14 10:15:23 +08:00
</script>
<style scoped>
.mt_1 {
2023-12-14 23:29:36 +08:00
margin-top: 0.5rem;
2023-12-14 10:15:23 +08:00
}
.nick {
display: flex;
align-items: center;
justify-content: space-between;
2023-12-14 23:29:36 +08:00
font-weight: bold;
> div {
margin-right: 10px;
}
2023-12-14 10:15:23 +08:00
}
.info {
2023-12-21 12:56:06 +08:00
flex: 1;
2023-12-14 23:29:36 +08:00
margin-top: 0.6rem;
margin-left: 1rem;
2023-12-14 10:15:23 +08:00
}
.info .el-tag {
2023-12-14 23:29:36 +08:00
margin-right: 1rem;
2023-12-14 10:15:23 +08:00
}
.el-icon {
2023-12-14 23:29:36 +08:00
color: white;
2023-12-14 10:15:23 +08:00
}
.avatar {
2023-12-21 12:56:06 +08:00
flex: 1;
2023-12-14 23:29:36 +08:00
display: flex;
justify-content: space-between;
2023-12-14 10:15:23 +08:00
}
.avatar-left {
2023-12-14 23:29:36 +08:00
display: flex;
2023-12-21 12:56:06 +08:00
justify-content: space-between;
2023-12-14 23:29:36 +08:00
align-items: center;
2023-12-14 10:15:23 +08:00
}
2023-12-21 12:56:06 +08:00
.avatar-center {
flex: 2;
}
2023-12-14 10:15:23 +08:00
.el-avatar {
margin-right: 1rem;
--el-avatar-bg-color: none;
2023-12-14 10:15:23 +08:00
}
.remarks {
2023-12-14 23:29:36 +08:00
padding-top: 0.5rem;
color: #8c8c8c;
2023-12-14 10:15:23 +08:00
}
2023-12-14 23:29:36 +08:00
</style>