This commit is contained in:
2026-04-16 15:19:48 +08:00
commit 1c892259a9
127 changed files with 17390 additions and 0 deletions
@@ -0,0 +1,237 @@
<script setup lang="ts">
import { computed } from "vue";
import { useRouter, useRoute } from "vue-router";
import { useAuthStore } from "@/stores/auth";
import {
House,
VideoCamera,
Tickets,
Setting,
SwitchButton
} from "@element-plus/icons-vue";
const router = useRouter();
const route = useRoute();
const authStore = useAuthStore();
const displayName = computed(() => authStore.user?.displayName ?? "Operator");
async function handleLogout() {
await authStore.logout();
await router.push({ name: "login" });
}
</script>
<template>
<el-container class="shell">
<el-aside width="240px" class="sidebar">
<div class="brand">
<div class="brand__mark">LR</div>
<div>
<div class="brand__title">Live Recorder</div>
<div class="brand__subtitle">录制控制台</div>
</div>
</div>
<el-menu :default-active="route.path" router class="menu">
<el-menu-item index="/live-rooms">
<el-icon><House /></el-icon>
<span>直播间管理</span>
</el-menu-item>
<el-menu-item index="/record-tasks">
<el-icon><VideoCamera /></el-icon>
<span>录制任务</span>
</el-menu-item>
<el-menu-item index="/logs">
<el-icon><Tickets /></el-icon>
<span>系统日志</span>
</el-menu-item>
<el-menu-item index="/settings">
<el-icon><Setting /></el-icon>
<span>系统设置</span>
</el-menu-item>
</el-menu>
<div class="sidebar-footer">
<div class="sidebar-footer__label">当前账户</div>
<div class="sidebar-footer__name">{{ displayName }}</div>
<el-button :icon="SwitchButton" text @click="handleLogout">退出登录</el-button>
</div>
</el-aside>
<el-container>
<el-header class="header">
<div>
<div class="header__title">直播录制控制台</div>
<div class="header__subtitle">平台适配巡检录制和结果统一管理</div>
</div>
</el-header>
<el-main class="main">
<router-view />
</el-main>
</el-container>
</el-container>
</template>
<style scoped>
.shell {
min-height: 100vh;
background: transparent;
}
.sidebar {
display: flex;
flex-direction: column;
padding: 20px 16px 20px 20px;
background: transparent;
}
.brand {
display: flex;
align-items: center;
gap: 12px;
margin-bottom: 20px;
padding: 8px 10px 16px;
border-bottom: 1px solid rgba(82, 74, 63, 0.08);
}
.brand__mark {
width: 42px;
height: 42px;
display: grid;
place-items: center;
border-radius: 12px;
background:
linear-gradient(135deg, rgba(62, 95, 124, 0.96), rgba(47, 76, 102, 0.96));
color: #f8fcfb;
font-weight: 800;
letter-spacing: 0.02em;
box-shadow: 0 18px 30px rgba(62, 95, 124, 0.22);
}
.brand__title {
font-size: 17px;
font-weight: 700;
letter-spacing: -0.02em;
color: #171614;
}
.brand__subtitle {
margin-top: 4px;
font-size: 12px;
color: #8a8379;
}
.menu {
padding: 8px;
border-radius: 18px;
border-right: none;
background: linear-gradient(180deg, rgba(255, 255, 255, 0.74), rgba(251, 248, 243, 0.9));
border: 1px solid rgba(82, 74, 63, 0.08);
box-shadow: 0 14px 28px rgba(31, 24, 18, 0.05);
}
.menu :deep(.el-menu-item) {
height: 46px;
margin-bottom: 6px;
border-radius: 12px;
color: #504941;
transition:
transform 0.18s ease,
background-color 0.18s ease,
color 0.18s ease,
box-shadow 0.18s ease;
}
.menu :deep(.el-menu-item:hover) {
background: rgba(62, 95, 124, 0.08);
transform: translateX(2px);
}
.menu :deep(.el-menu-item.is-active) {
background: linear-gradient(135deg, #4a6984, #2f4c66);
color: #f8fcfb;
box-shadow: 0 12px 22px rgba(62, 95, 124, 0.22);
}
.sidebar-footer {
margin-top: auto;
padding: 18px 14px 6px;
border-radius: 18px;
border: 1px solid rgba(82, 74, 63, 0.08);
background: rgba(255, 255, 255, 0.66);
box-shadow: 0 12px 24px rgba(31, 24, 18, 0.04);
}
.sidebar-footer__label {
font-size: 12px;
letter-spacing: 0.08em;
text-transform: uppercase;
color: #91897f;
}
.sidebar-footer__name {
margin: 10px 0 8px;
font-size: 15px;
font-weight: 700;
color: #171614;
}
.header {
padding: 22px 32px 0;
}
.header > div {
display: flex;
align-items: center;
justify-content: space-between;
gap: 20px;
padding: 18px 22px;
border-radius: 14px;
border: 1px solid rgba(82, 74, 63, 0.08);
background: linear-gradient(180deg, rgba(255, 255, 255, 0.78), rgba(251, 248, 243, 0.86));
box-shadow: 0 16px 34px rgba(31, 24, 18, 0.05);
}
.header__title {
font-size: 22px;
font-weight: 700;
letter-spacing: -0.03em;
color: #171614;
}
.header__subtitle {
margin-top: 4px;
color: #716b63;
font-size: 13px;
}
.main {
padding: 28px 32px 36px;
}
@media (max-width: 960px) {
.shell {
flex-direction: column;
}
.sidebar {
width: 100% !important;
padding: 18px;
}
.header {
padding: 8px 18px 0;
}
.header > div {
align-items: flex-start;
flex-direction: column;
}
.main {
padding: 22px 18px 24px;
}
}
</style>