重命名前端项目目录:web-flowith -> web

- 将前端项目目录从 web-flowith 重命名为 web,使目录结构更简洁
- 保持所有前端代码和配置文件不变
- 统一项目目录命名规范
This commit is contained in:
2025-07-24 22:20:19 +08:00
parent ca42a7d9a4
commit bbe8fcd776
57 changed files with 0 additions and 0 deletions
+33
View File
@@ -0,0 +1,33 @@
<template>
<footer class="app-footer">
<div style="background: white; padding: 40px 20px; text-align: center; border-top: 1px solid #e8e8e8;">
<div style="max-width: 1200px; margin: 0 auto;">
<div style="margin-bottom: 20px;">
<h3 style="color: #4A90E2; font-size: 20px; margin-bottom: 8px;">开心APP</h3>
<p style="color: #888; margin: 0;">陪伴理解记录共同成长</p>
</div>
<div style="display: flex; justify-content: center; gap: 40px; margin-bottom: 20px; flex-wrap: wrap;">
<router-link to="/chat" style="color: #888; text-decoration: none;">聊天</router-link>
<router-link to="/diary" style="color: #888; text-decoration: none;">日记</router-link>
<router-link to="/dashboard" style="color: #888; text-decoration: none;">展板</router-link>
<router-link to="/settings" style="color: #888; text-decoration: none;">设置</router-link>
</div>
<p style="color: #888; font-size: 14px; margin: 0;">
© 2025 开心APP. All Rights Reserved. 来自"开心"星球的温柔科技
</p>
</div>
</div>
</footer>
</template>
<script setup lang="ts">
// 简化版Footer组件
</script>
<style scoped>
.app-footer {
margin-top: auto;
}
</style>
+231
View File
@@ -0,0 +1,231 @@
<template>
<header class="app-header">
<div class="header-content">
<!-- Logo -->
<router-link to="/" class="logo">
<span class="logo-text">开心APP</span>
</router-link>
<!-- 导航菜单 -->
<nav class="nav-menu">
<router-link to="/chat" class="nav-link">聊天</router-link>
<router-link to="/diary" class="nav-link">日记</router-link>
<router-link to="/dashboard" class="nav-link">展板</router-link>
</nav>
<!-- 右侧操作区 -->
<div class="header-actions">
<!-- 未登录状态 -->
<template v-if="!userStore.isLoggedIn">
<a-button type="text" @click="$router.push('/login')" class="login-btn">
登录
</a-button>
<a-button type="primary" @click="$router.push('/chat')" class="start-btn">
免费开始
</a-button>
</template>
<!-- 已登录状态 -->
<template v-else>
<a-dropdown>
<div class="user-info-section">
<a-avatar
:size="32"
:src="userStore.userInfo?.avatar"
class="user-avatar"
>
<template #icon v-if="!userStore.userInfo?.avatar">
<UserOutlined />
</template>
</a-avatar>
<span class="user-nickname">
{{ userStore.userInfo?.nickname || userStore.userInfo?.username || '用户' }}
</span>
<DownOutlined class="dropdown-icon" />
</div>
<template #overlay>
<a-menu>
<a-menu-item key="profile" @click="$router.push('/dashboard')">
<UserOutlined />
个人中心
</a-menu-item>
<a-menu-item key="settings" @click="$router.push('/settings')">
<SettingOutlined />
设置
</a-menu-item>
<a-menu-divider />
<a-menu-item key="logout" @click="handleLogout">
<LogoutOutlined />
退出登录
</a-menu-item>
</a-menu>
</template>
</a-dropdown>
</template>
</div>
</div>
</header>
</template>
<script setup lang="ts">
import { useRouter } from 'vue-router'
import { message } from 'ant-design-vue'
import {
UserOutlined,
DownOutlined,
SettingOutlined,
LogoutOutlined
} from '@ant-design/icons-vue'
import { useUserStore } from '@/stores/user'
const router = useRouter()
const userStore = useUserStore()
// 退出登录
const handleLogout = async () => {
try {
await userStore.logout()
message.success('退出登录成功')
router.push('/')
} catch (error) {
message.error('退出登录失败')
}
}
</script>
<style lang="scss" scoped>
.app-header {
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 1000;
background: rgba(255, 255, 255, 0.9);
backdrop-filter: blur(16px);
border-bottom: 1px solid #e8e8e8;
padding: 0;
height: 64px;
line-height: 64px;
}
.header-content {
max-width: 1280px;
margin: 0 auto;
padding: 0 24px;
display: flex;
align-items: center;
justify-content: space-between;
height: 100%;
}
.logo {
display: flex;
align-items: center;
text-decoration: none;
color: #4A90E2;
font-weight: bold;
font-size: 20px;
}
.nav-menu {
display: flex;
align-items: center;
gap: 32px;
}
.nav-link {
color: #888888;
text-decoration: none;
font-weight: 500;
transition: color 0.3s ease-in-out;
&:hover {
color: #4A90E2;
}
}
.header-actions {
display: flex;
align-items: center;
gap: 16px;
}
.login-btn {
color: #4A90E2;
font-weight: 500;
&:hover {
color: #4A90E2;
background: rgba(74, 144, 226, 0.1);
}
}
.user-info-section {
display: flex;
align-items: center;
gap: 8px;
padding: 6px 12px;
border-radius: 8px;
cursor: pointer;
transition: all 0.2s;
&:hover {
background: rgba(74, 144, 226, 0.1);
}
.user-avatar {
border: 2px solid #f0f0f0;
}
.user-nickname {
font-weight: 500;
color: #4A90E2;
max-width: 120px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.dropdown-icon {
font-size: 12px;
color: #8c8c8c;
margin-left: 4px;
}
}
.user-btn {
color: #4A90E2;
font-weight: 500;
&:hover {
color: #4A90E2;
background: rgba(74, 144, 226, 0.1);
}
}
.start-btn {
border-radius: 20px;
font-weight: 600;
}
// 响应式设计
@media (max-width: 768px) {
.header-content {
padding: 0 16px;
}
.nav-menu {
display: none;
}
.user-info-section {
.user-nickname {
display: none;
}
}
.header-actions {
gap: 8px;
}
}
</style>