1.header菜单栏格式统一

2.修复未登录的情况下邀请链接状态错误
This commit is contained in:
smallclover
2025-10-11 10:13:03 +09:00
parent cf7b667f30
commit 160570574c
2 changed files with 110 additions and 41 deletions

View File

@@ -26,43 +26,59 @@
<ClientOnly> <ClientOnly>
<div class="header-content-right"> <div class="header-content-right">
<div v-if="isMobile" class="search-icon" @click="search"> <!-- 搜索 -->
<search-icon /> <ToolTip v-if="isMobile" content="搜索" placement="bottom">
<div class="header-icon-item" @click="search">
<search-icon class="header-icon" />
<span class="header-label">搜索</span>
</div> </div>
</ToolTip>
<div v-if="isMobile" class="theme-icon" @click="cycleTheme"> <!-- 主题切换 -->
<component :is="iconClass" /> <ToolTip v-if="isMobile" content="切换主题" placement="bottom">
<div class="header-icon-item" @click="cycleTheme">
<component :is="iconClass" class="header-icon" />
<span class="header-label">主题</span>
</div> </div>
</ToolTip>
<div v-if="!isMobile" class="invite_text" @click="copyInviteLink"> <!-- 邀请 -->
<copy /> <ToolTip v-if="!isMobile" content="邀请好友" placement="bottom">
邀请 <div class="header-icon-item" @click="copyInviteLink">
<loading v-if="isCopying" /> <template v-if="!isCopying">
<copy-link class="header-icon" />
<span class="header-label">邀请</span>
</template>
<loading v-else />
</div> </div>
</ToolTip>
<!-- 在线人数 -->
<ToolTip v-if="!isMobile" content="当前在线人数" placement="bottom"> <ToolTip v-if="!isMobile" content="当前在线人数" placement="bottom">
<div class="online-count"> <div class="header-icon-item">
<peoples-two /> <peoples-two class="header-icon" />
<span>{{ onlineCount }}</span> <span class="header-label">在线</span>
<span class="header-badge">{{ onlineCount }}</span>
</div> </div>
</ToolTip> </ToolTip>
<!-- RSS -->
<ToolTip content="复制RSS链接" placement="bottom"> <ToolTip content="复制RSS链接" placement="bottom">
<div class="rss-icon" @click="copyRssLink"> <div class="header-icon-item" @click="copyRssLink">
<rss /> <rss class="header-icon" />
<span class="header-label">RSS</span>
</div> </div>
</ToolTip> </ToolTip>
<!-- 发帖 -->
<ToolTip v-if="!isMobile && isLogin" content="发帖" placement="bottom"> <ToolTip v-if="!isMobile && isLogin" content="发帖" placement="bottom">
<div class="new-post-icon" @click="goToNewPost"> <div class="header-icon-item" @click="goToNewPost">
<edit /> <edit class="header-icon" />
<span class="header-label">发帖</span>
</div> </div>
</ToolTip> </ToolTip>
<!-- 消息 -->
<ToolTip v-if="isLogin" content="站内信和频道" placement="bottom"> <ToolTip v-if="isLogin" content="站内信和频道" placement="bottom">
<div class="messages-icon" @click="goToMessages"> <div class="header-icon-item" @click="goToMessages">
<message-emoji /> <message-emoji class="header-icon" />
<span v-if="unreadMessageCount > 0" class="unread-badge">{{ <span class="header-label">消息</span>
unreadMessageCount <span v-if="unreadMessageCount > 0" class="unread-badge">{{ unreadMessageCount }}</span>
}}</span>
<span v-else-if="hasChannelUnread" class="unread-dot"></span> <span v-else-if="hasChannelUnread" class="unread-dot"></span>
</div> </div>
</ToolTip> </ToolTip>
@@ -192,6 +208,7 @@ const copyInviteLink = async () => {
const token = getToken() const token = getToken()
if (!token) { if (!token) {
toast.error('请先登录') toast.error('请先登录')
isCopying.value = false // 🔥 修复:未登录时立即复原状态
return return
} }
try { try {
@@ -333,7 +350,7 @@ onMounted(async () => {
height: var(--header-height); height: var(--header-height);
background-color: var(--background-color-blur); background-color: var(--background-color-blur);
backdrop-filter: var(--blur-10); backdrop-filter: var(--blur-10);
color: var(--header-text-color); color: var(--primary-color);
border-bottom: 1px solid var(--header-border-color); border-bottom: 1px solid var(--header-border-color);
} }
@@ -376,6 +393,7 @@ onMounted(async () => {
flex-direction: row; flex-direction: row;
align-items: center; align-items: center;
gap: 20px; gap: 20px;
padding-right: 15px;
} }
.micon { .micon {
@@ -464,16 +482,14 @@ onMounted(async () => {
cursor: pointer; cursor: pointer;
} }
.invite_text {
font-size: 12px;
cursor: pointer;
color: var(--primary-color);
}
.invite_text:hover { .invite_text:hover {
opacity: 0.8;
text-decoration: underline; text-decoration: underline;
} }
.invite_text,
.online-count,
.rss-icon, .rss-icon,
.new-post-icon, .new-post-icon,
.messages-icon { .messages-icon {
@@ -484,8 +500,8 @@ onMounted(async () => {
.unread-badge { .unread-badge {
position: absolute; position: absolute;
top: -5px; top: -4px;
right: -10px; right: -6px;
background-color: #ff4d4f; background-color: #ff4d4f;
color: white; color: white;
border-radius: 50%; border-radius: 50%;
@@ -500,8 +516,8 @@ onMounted(async () => {
.unread-dot { .unread-dot {
position: absolute; position: absolute;
top: -2px; top: 0;
right: -4px; right: -1px;
width: 8px; width: 8px;
height: 8px; height: 8px;
border-radius: 50%; border-radius: 50%;
@@ -513,14 +529,58 @@ onMounted(async () => {
} }
.online-count { .online-count {
font-size: 14px;
display: flex;
align-items: center;
gap: 5px;
color: var(--primary-color);
cursor: default; cursor: default;
} }
/* === 统一图标按钮风格 === */
.header-icon-item {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 4px;
font-size: 14px;
color: var(--primary-color);
cursor: pointer;
position: relative;
transition: color 0.25s ease, transform 0.15s ease, opacity 0.2s ease;
}
.header-icon-item:hover {
opacity: 0.8;
transform: translateY(-1px);
}
/* 点击时瞬间高亮 + 轻微缩放 */
.header-icon-item:active {
color: var(--primary-color-hover);
transform: scale(0.92);
}
.header-icon {
font-size: 20px;
line-height: 1;
}
.header-label {
font-size: 12px;
line-height: 1;
}
/* 在线人数的数字文字样式(无背景) */
.header-badge {
position: absolute;
top: -4px;
right: -6px;
color: var(--primary-color); /* 🔹 使用主题主色 */
background: none; /* 🔹 去掉背景 */
font-size: 11px; /* 字体稍微大一点以便清晰 */
font-weight: 600; /* 加一点权重让数字更醒目 */
line-height: 1;
padding: 0; /* 去掉内边距 */
}
@keyframes rss-glow { @keyframes rss-glow {
0% { 0% {
text-shadow: 0 0 0px var(--primary-color); text-shadow: 0 0 0px var(--primary-color);
@@ -556,5 +616,12 @@ onMounted(async () => {
.header-content-right { .header-content-right {
gap: 15px; gap: 15px;
} }
/* 手机不显示文字 */
.header-label {
display: none;
}
.header-badge {
display: none;
}
} }
</style> </style>

View File

@@ -29,6 +29,7 @@ import {
ApplicationMenu, ApplicationMenu,
Search, Search,
Copy, Copy,
CopyLink,
Loading, Loading,
Rss, Rss,
MessageEmoji, MessageEmoji,
@@ -111,6 +112,7 @@ export default defineNuxtPlugin((nuxtApp) => {
nuxtApp.vueApp.component('ApplicationMenu', ApplicationMenu) nuxtApp.vueApp.component('ApplicationMenu', ApplicationMenu)
nuxtApp.vueApp.component('SearchIcon', Search) nuxtApp.vueApp.component('SearchIcon', Search)
nuxtApp.vueApp.component('Copy', Copy) nuxtApp.vueApp.component('Copy', Copy)
nuxtApp.vueApp.component('CopyLink', CopyLink)
nuxtApp.vueApp.component('Loading', Loading) nuxtApp.vueApp.component('Loading', Loading)
nuxtApp.vueApp.component('Rss', Rss) nuxtApp.vueApp.component('Rss', Rss)
nuxtApp.vueApp.component('MessageEmoji', MessageEmoji) nuxtApp.vueApp.component('MessageEmoji', MessageEmoji)