150 lines
3.8 KiB
Vue
150 lines
3.8 KiB
Vue
<template>
|
|
<a-list :bordered="false">
|
|
<a-list-item
|
|
v-for="item in renderList"
|
|
:key="item.id"
|
|
action-layout="vertical"
|
|
:style="{
|
|
opacity: item.status ? 0.5 : 1,
|
|
}"
|
|
>
|
|
<template #extra>
|
|
<a-tag v-if="item.messageType === 0" color="gray">未开始</a-tag>
|
|
<a-tag v-else-if="item.messageType === 1" color="green">已开通</a-tag>
|
|
<a-tag v-else-if="item.messageType === 2" color="blue">进行中</a-tag>
|
|
<a-tag v-else-if="item.messageType === 3" color="red">即将到期</a-tag>
|
|
</template>
|
|
<div class="item-wrap" @click="onItemClick(item)">
|
|
<a-list-item-meta>
|
|
<template v-if="item.avatar" #avatar>
|
|
<a-avatar shape="circle">
|
|
<img v-if="item.avatar" :src="item.avatar" />
|
|
<icon-desktop v-else />
|
|
</a-avatar>
|
|
</template>
|
|
<template #title>
|
|
<a-space :size="4">
|
|
<span>{{ item.title }}</span>
|
|
<a-typography-text type="secondary">
|
|
{{ item.subTitle }}
|
|
</a-typography-text>
|
|
</a-space>
|
|
</template>
|
|
<template #description>
|
|
<div>
|
|
<a-typography-paragraph
|
|
:ellipsis="{
|
|
rows: 1,
|
|
}"
|
|
>{{ item.content }}</a-typography-paragraph
|
|
>
|
|
<a-typography-text
|
|
v-if="item.type === 'message'"
|
|
class="time-text"
|
|
>
|
|
{{ item.time }}
|
|
</a-typography-text>
|
|
</div>
|
|
</template>
|
|
</a-list-item-meta>
|
|
</div>
|
|
</a-list-item>
|
|
<template #footer>
|
|
<a-space
|
|
fill
|
|
:size="0"
|
|
:class="{ 'add-border-top': renderList.length < showMax }"
|
|
>
|
|
<div class="footer-wrap">
|
|
<a-link @click="allRead">{{ $t('messageBox.allRead') }}</a-link>
|
|
</div>
|
|
<div class="footer-wrap">
|
|
<a-link>{{ $t('messageBox.viewMore') }}</a-link>
|
|
</div>
|
|
</a-space>
|
|
</template>
|
|
<div
|
|
v-if="renderList.length && renderList.length < 3"
|
|
:style="{ height: (showMax - renderList.length) * 86 + 'px' }"
|
|
></div>
|
|
</a-list>
|
|
</template>
|
|
|
|
<script lang="ts" setup>
|
|
import { PropType } from 'vue';
|
|
import { MessageRecord, MessageListType } from '@/api/demo/message';
|
|
|
|
const props = defineProps({
|
|
renderList: {
|
|
type: Array as PropType<MessageListType>,
|
|
required: true,
|
|
},
|
|
unreadCount: {
|
|
type: Number,
|
|
default: 0,
|
|
},
|
|
});
|
|
const emit = defineEmits(['itemClick']);
|
|
const allRead = () => {
|
|
emit('itemClick', [...props.renderList]);
|
|
};
|
|
|
|
const onItemClick = (item: MessageRecord) => {
|
|
if (!item.status) {
|
|
emit('itemClick', [item]);
|
|
}
|
|
};
|
|
const showMax = 3;
|
|
</script>
|
|
|
|
<style scoped lang="less">
|
|
:deep(.arco-list) {
|
|
.arco-list-item {
|
|
min-height: 86px;
|
|
border-bottom: 1px solid rgb(var(--gray-3));
|
|
}
|
|
.arco-list-item-extra {
|
|
position: absolute;
|
|
right: 20px;
|
|
}
|
|
.arco-list-item-meta-content {
|
|
flex: 1;
|
|
}
|
|
.item-wrap {
|
|
cursor: pointer;
|
|
}
|
|
.time-text {
|
|
font-size: 12px;
|
|
color: rgb(var(--gray-6));
|
|
}
|
|
.arco-empty {
|
|
display: none;
|
|
}
|
|
.arco-list-footer {
|
|
padding: 0;
|
|
height: 50px;
|
|
line-height: 50px;
|
|
border-top: none;
|
|
.arco-space-item {
|
|
width: 100%;
|
|
border-right: 1px solid rgb(var(--gray-3));
|
|
&:last-child {
|
|
border-right: none;
|
|
}
|
|
}
|
|
.add-border-top {
|
|
border-top: 1px solid rgb(var(--gray-3));
|
|
}
|
|
}
|
|
.footer-wrap {
|
|
text-align: center;
|
|
}
|
|
.arco-typography {
|
|
margin-bottom: 0;
|
|
}
|
|
.add-border {
|
|
border-top: 1px solid rgb(var(--gray-3));
|
|
}
|
|
}
|
|
</style>
|