parent
8469cd6ff3
commit
610e72d667
@ -0,0 +1,190 @@
|
||||
<!-- src/components/AdminSidebar.vue -->
|
||||
<template>
|
||||
<aside class="admin-sidebar" :class="{ 'sidebar-collapsed': isCollapsed }">
|
||||
<div class="sidebar-header">
|
||||
<h3>管理菜单</h3>
|
||||
<button class="toggle-sidebar" @click="toggleSidebar">
|
||||
{{ isCollapsed ? '▶' : '◀' }}
|
||||
</button>
|
||||
</div>
|
||||
<nav class="sidebar-nav">
|
||||
<ul>
|
||||
<li>
|
||||
<router-link to="/admin" class="nav-item" active-class="active">
|
||||
<span class="icon">🏠</span>
|
||||
<span class="text">首页</span>
|
||||
</router-link>
|
||||
</li>
|
||||
<li>
|
||||
<router-link to="/admin/user" class="nav-item" active-class="active">
|
||||
<span class="icon">👤</span>
|
||||
<span class="text">用户管理</span>
|
||||
</router-link>
|
||||
</li>
|
||||
<li>
|
||||
<router-link to="/admin/feedback" class="nav-item" active-class="active">
|
||||
<span class="icon">💬</span>
|
||||
<span class="text">反馈管理</span>
|
||||
</router-link>
|
||||
</li>
|
||||
<li>
|
||||
<router-link to="/admin/log" class="nav-item" active-class="active">
|
||||
<span class="icon">📋</span>
|
||||
<span class="text">系统日志</span>
|
||||
</router-link>
|
||||
</li>
|
||||
<li>
|
||||
<router-link to="/admin/notice" class="nav-item" active-class="active">
|
||||
<span class="icon">📢</span>
|
||||
<span class="text">通知管理</span>
|
||||
</router-link>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
</aside>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: 'AdminSidebar',
|
||||
props: {
|
||||
collapsed: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
isCollapsed: this.collapsed
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
collapsed(newVal) {
|
||||
this.isCollapsed = newVal;
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
toggleSidebar() {
|
||||
this.isCollapsed = !this.isCollapsed;
|
||||
this.$emit('toggle', this.isCollapsed);
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.admin-sidebar {
|
||||
width: 250px;
|
||||
background: white;
|
||||
border-radius: 8px;
|
||||
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
|
||||
padding: 20px;
|
||||
transition: width 0.3s ease;
|
||||
flex-shrink: 0;
|
||||
margin-right: 20px;
|
||||
}
|
||||
|
||||
.sidebar-collapsed {
|
||||
width: 90px;
|
||||
}
|
||||
|
||||
.sidebar-header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
margin-bottom: 20px;
|
||||
padding-bottom: 15px;
|
||||
border-bottom: 1px solid #eee;
|
||||
}
|
||||
|
||||
.sidebar-header h3 {
|
||||
color: #333;
|
||||
font-size: 18px;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.sidebar-collapsed .sidebar-header h3 {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.toggle-sidebar {
|
||||
background: none;
|
||||
border: none;
|
||||
cursor: pointer;
|
||||
font-size: 16px;
|
||||
color: #666;
|
||||
padding: 5px;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.toggle-sidebar:hover {
|
||||
background: #f0f0f0;
|
||||
}
|
||||
|
||||
.sidebar-nav ul {
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
.sidebar-nav li {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.nav-item {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding: 12px 15px;
|
||||
text-decoration: none;
|
||||
color: #555;
|
||||
border-radius: 6px;
|
||||
transition: all 0.2s;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.nav-item:hover {
|
||||
background: #f0f7ff;
|
||||
color: #3498db;
|
||||
}
|
||||
|
||||
.nav-item.active {
|
||||
background: #3498db;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.nav-item .icon {
|
||||
margin-right: 12px;
|
||||
font-size: 18px;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.sidebar-collapsed .nav-item .text {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.sidebar-collapsed .nav-item .icon {
|
||||
margin-right: 0;
|
||||
}
|
||||
|
||||
/* 响应式设计 */
|
||||
@media (max-width: 768px) {
|
||||
.admin-sidebar {
|
||||
width: 100%;
|
||||
margin-right: 0;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.sidebar-collapsed {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.sidebar-collapsed .sidebar-header h3,
|
||||
.sidebar-collapsed .nav-item .text {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.toggle-sidebar {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Loading…
Reference in new issue