<template>
|
|
<div class="intimacy-ranking-container">
|
|
<div class="ranking-header">
|
|
<div class="header-title">
|
|
<img src="@/assets/images/读者榜单.png" alt="读者榜单" class="ranking-icon" />
|
|
<span>读者亲密榜单</span>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="ranking-tabs">
|
|
<div class="tab-list">
|
|
<div v-for="(tab, index) in tabs" :key="index"
|
|
:class="['tab-item', { active: activeTab === tab.value }]" @click="activeTab = tab.value">
|
|
{{ tab.label }}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="ranking-list">
|
|
<div v-for="(item, index) in currentRankingList" :key="index" class="ranking-item">
|
|
<div class="rank-num">
|
|
<template v-if="index < 3">
|
|
<div :class="['medal', `medal-${index + 1}`]">{{ index + 1 }}</div>
|
|
</template>
|
|
<template v-else>
|
|
<div class="normal-rank">{{ index + 1 }}</div>
|
|
</template>
|
|
</div>
|
|
|
|
<div class="user-avatar">
|
|
<img :src="item.avatar" :alt="item.username">
|
|
</div>
|
|
|
|
<div class="user-info">
|
|
<div class="username">{{ item.username }}</div>
|
|
<div class="level-tag">
|
|
{{ `护书者者 ${item.level}级` }}
|
|
</div>
|
|
</div>
|
|
|
|
<div class="intimacy-value">
|
|
<div class="value">{{ item.value }}</div>
|
|
<div class="label">亲密值</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
import { defineComponent, ref, computed } from 'vue';
|
|
|
|
export default defineComponent({
|
|
name: 'IntimacyRanking',
|
|
props: {
|
|
bookId: {
|
|
type: String,
|
|
default: ''
|
|
}
|
|
},
|
|
setup(props) {
|
|
const tabs = [
|
|
{ label: '总榜', value: 'all' },
|
|
{ label: '周榜', value: 'week' },
|
|
{ label: '月榜', value: 'month' }
|
|
];
|
|
|
|
const activeTab = ref('all');
|
|
|
|
const allRankingList = ref([
|
|
{
|
|
username: '周游',
|
|
avatar: 'https://picsum.photos/100/100?random=1',
|
|
level: '五',
|
|
value: '8783452',
|
|
},
|
|
{
|
|
username: '冯启明',
|
|
avatar: 'https://picsum.photos/100/100?random=2',
|
|
level: '五',
|
|
value: '890379',
|
|
},
|
|
{
|
|
username: '风静',
|
|
avatar: 'https://picsum.photos/100/100?random=3',
|
|
level: '四',
|
|
value: '605039',
|
|
},
|
|
{
|
|
username: '钱静',
|
|
avatar: 'https://picsum.photos/100/100?random=4',
|
|
level: '三',
|
|
value: '532524',
|
|
},
|
|
{
|
|
username: '线编码',
|
|
avatar: 'https://picsum.photos/100/100?random=5',
|
|
level: '三',
|
|
value: '525524',
|
|
},
|
|
{
|
|
username: '冯艾蓥',
|
|
avatar: 'https://picsum.photos/100/100?random=6',
|
|
level: '二',
|
|
value: '496064',
|
|
},
|
|
{
|
|
username: '李书琦',
|
|
avatar: 'https://picsum.photos/100/100?random=7',
|
|
level: '一',
|
|
value: '372525',
|
|
},
|
|
{
|
|
username: '李梅',
|
|
avatar: 'https://picsum.photos/100/100?random=8',
|
|
level: '一',
|
|
value: '267476',
|
|
},
|
|
{
|
|
username: '郑帆',
|
|
avatar: 'https://picsum.photos/100/100?random=9',
|
|
level: '一',
|
|
value: '248480',
|
|
},
|
|
{
|
|
username: '吴修德',
|
|
avatar: 'https://picsum.photos/100/100?random=10',
|
|
level: '一',
|
|
value: '59053',
|
|
}
|
|
]);
|
|
|
|
const weekRankingList = ref([
|
|
{
|
|
username: '周游',
|
|
avatar: 'https://picsum.photos/100/100?random=1',
|
|
level: '五',
|
|
value: '78452',
|
|
},
|
|
{
|
|
username: '冯启明',
|
|
avatar: 'https://picsum.photos/100/100?random=2',
|
|
level: '五',
|
|
value: '69037',
|
|
},
|
|
{
|
|
username: '风静',
|
|
avatar: 'https://picsum.photos/100/100?random=3',
|
|
level: '四',
|
|
value: '60509',
|
|
},
|
|
{
|
|
username: '钱静',
|
|
avatar: 'https://picsum.photos/100/100?random=4',
|
|
level: '三',
|
|
value: '53254',
|
|
},
|
|
{
|
|
username: '线编码',
|
|
avatar: 'https://picsum.photos/100/100?random=5',
|
|
level: '三',
|
|
value: '52554',
|
|
},
|
|
{
|
|
username: '冯艾蓥',
|
|
avatar: 'https://picsum.photos/100/100?random=6',
|
|
level: '二',
|
|
value: '49064',
|
|
},
|
|
{
|
|
username: '李书琦',
|
|
avatar: 'https://picsum.photos/100/100?random=7',
|
|
level: '一',
|
|
value: '37255',
|
|
},
|
|
{
|
|
username: '李梅',
|
|
avatar: 'https://picsum.photos/100/100?random=8',
|
|
level: '一',
|
|
value: '26747',
|
|
},
|
|
{
|
|
username: '郑帆',
|
|
avatar: 'https://picsum.photos/100/100?random=9',
|
|
level: '一',
|
|
value: '24848',
|
|
},
|
|
{
|
|
username: '吴修德',
|
|
avatar: 'https://picsum.photos/100/100?random=10',
|
|
level: '一',
|
|
value: '5953',
|
|
}
|
|
]);
|
|
|
|
const monthRankingList = ref([
|
|
{
|
|
username: '周游',
|
|
avatar: 'https://picsum.photos/100/100?random=1',
|
|
level: '五',
|
|
value: '178452',
|
|
},
|
|
{
|
|
username: '冯启明',
|
|
avatar: 'https://picsum.photos/100/100?random=2',
|
|
level: '五',
|
|
value: '169037',
|
|
},
|
|
{
|
|
username: '风静',
|
|
avatar: 'https://picsum.photos/100/100?random=3',
|
|
level: '四',
|
|
value: '160509',
|
|
},
|
|
{
|
|
username: '钱静',
|
|
avatar: 'https://picsum.photos/100/100?random=4',
|
|
level: '三',
|
|
value: '153254',
|
|
},
|
|
{
|
|
username: '线编码',
|
|
avatar: 'https://picsum.photos/100/100?random=5',
|
|
level: '三',
|
|
value: '152554',
|
|
},
|
|
{
|
|
username: '冯艾蓥',
|
|
avatar: 'https://picsum.photos/100/100?random=6',
|
|
level: '二',
|
|
value: '149064',
|
|
},
|
|
{
|
|
username: '李书琦',
|
|
avatar: 'https://picsum.photos/100/100?random=7',
|
|
level: '一',
|
|
value: '137255',
|
|
},
|
|
{
|
|
username: '李梅',
|
|
avatar: 'https://picsum.photos/100/100?random=8',
|
|
level: '一',
|
|
value: '126747',
|
|
},
|
|
{
|
|
username: '郑帆',
|
|
avatar: 'https://picsum.photos/100/100?random=9',
|
|
level: '一',
|
|
value: '124848',
|
|
},
|
|
{
|
|
username: '吴修德',
|
|
avatar: 'https://picsum.photos/100/100?random=10',
|
|
level: '一',
|
|
value: '105953',
|
|
}
|
|
]);
|
|
|
|
const currentRankingList = computed(() => {
|
|
if (activeTab.value === 'all') {
|
|
return allRankingList.value;
|
|
} else if (activeTab.value === 'week') {
|
|
return weekRankingList.value;
|
|
} else {
|
|
return monthRankingList.value;
|
|
}
|
|
});
|
|
|
|
return {
|
|
tabs,
|
|
activeTab,
|
|
currentRankingList
|
|
};
|
|
}
|
|
});
|
|
</script>
|
|
|
|
<style lang="scss" scoped>
|
|
.intimacy-ranking-container {
|
|
background-color: #fff;
|
|
border-radius: 6px;
|
|
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.03);
|
|
padding: 0 0 16px 0;
|
|
overflow: hidden;
|
|
margin-left: 0;
|
|
|
|
.ranking-header {
|
|
background-color: #0A2463;
|
|
color: #fff;
|
|
padding: 15px 20px;
|
|
|
|
.header-title {
|
|
display: flex;
|
|
align-items: center;
|
|
font-size: 18px;
|
|
font-weight: bold;
|
|
|
|
.ranking-icon {
|
|
width: 28px;
|
|
height: 28px;
|
|
margin-right: 10px;
|
|
}
|
|
}
|
|
}
|
|
|
|
.ranking-tabs {
|
|
padding: 12px 15px;
|
|
border-bottom: 1px solid #eee;
|
|
|
|
.tab-list {
|
|
display: flex;
|
|
|
|
.tab-item {
|
|
padding: 6px 16px;
|
|
font-size: 15px;
|
|
color: #666;
|
|
cursor: pointer;
|
|
border-radius: 4px;
|
|
transition: all 0.2s;
|
|
|
|
&.active {
|
|
background-color: #f0f5ff;
|
|
color: #0A2463;
|
|
font-weight: 500;
|
|
}
|
|
|
|
&:hover:not(.active) {
|
|
color: #0A2463;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
.ranking-list {
|
|
padding: 0 15px;
|
|
|
|
.ranking-item {
|
|
display: flex;
|
|
align-items: center;
|
|
padding: 12px 0;
|
|
border-bottom: 1px solid #f5f5f5;
|
|
|
|
&:last-child {
|
|
border-bottom: none;
|
|
}
|
|
|
|
.rank-num {
|
|
width: 30px;
|
|
display: flex;
|
|
justify-content: center;
|
|
|
|
.medal {
|
|
width: 22px;
|
|
height: 22px;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
border-radius: 50%;
|
|
font-size: 14px;
|
|
font-weight: bold;
|
|
color: #fff;
|
|
|
|
&.medal-1 {
|
|
background: linear-gradient(to bottom, #ffda44, #ff9c39);
|
|
}
|
|
|
|
&.medal-2 {
|
|
background: linear-gradient(to bottom, #d3d3d3, #a0a0a0);
|
|
}
|
|
|
|
&.medal-3 {
|
|
background: linear-gradient(to bottom, #ffc09f, #a15c20);
|
|
}
|
|
}
|
|
|
|
.normal-rank {
|
|
font-size: 16px;
|
|
color: #999;
|
|
}
|
|
}
|
|
|
|
.user-avatar {
|
|
width: 44px;
|
|
height: 44px;
|
|
border-radius: 50%;
|
|
overflow: hidden;
|
|
margin: 0 12px;
|
|
|
|
img {
|
|
width: 100%;
|
|
height: 100%;
|
|
object-fit: cover;
|
|
}
|
|
}
|
|
|
|
.user-info {
|
|
flex: 1;
|
|
min-width: 0;
|
|
|
|
.username {
|
|
font-size: 15px;
|
|
font-weight: 500;
|
|
color: #333;
|
|
margin-bottom: 4px;
|
|
white-space: nowrap;
|
|
overflow: hidden;
|
|
text-overflow: ellipsis;
|
|
}
|
|
|
|
.level-tag {
|
|
font-size: 13px;
|
|
color: #0A2463;
|
|
background-color: #f0f5ff;
|
|
display: inline-block;
|
|
padding: 2px 8px;
|
|
border-radius: 4px;
|
|
}
|
|
}
|
|
|
|
.intimacy-value {
|
|
text-align: right;
|
|
min-width: 80px;
|
|
|
|
.value {
|
|
font-size: 16px;
|
|
font-weight: bold;
|
|
color: #ff7c6a;
|
|
}
|
|
|
|
.label {
|
|
font-size: 12px;
|
|
color: #999;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
</style>
|