MainLayout.vue 3.15 KB
<template>
  <a-layout style="min-height: 100vh">
    <a-layout-sider v-model:collapsed="collapsed" collapsible>
      <div class="logo">{{ collapsed ? '地利' : '地利外卖管理' }}</div>
      <a-menu
        v-model:selectedKeys="selectedKeys"
        theme="dark"
        mode="inline"
        @click="onMenuClick"
      >
        <a-menu-item key="/city">
          <template #icon><global-outlined /></template>
          城市管理
        </a-menu-item>
        <a-menu-item key="/substation">
          <template #icon><apartment-outlined /></template>
          分站管理
        </a-menu-item>
        <a-sub-menu key="merchant">
          <template #icon><shop-outlined /></template>
          <template #title>商家管理</template>
          <a-menu-item key="/merchant/enter">入驻申请</a-menu-item>
          <a-menu-item key="/merchant/store">店铺管理</a-menu-item>
        </a-sub-menu>
        <a-menu-item key="/rider">
          <template #icon><user-outlined /></template>
          骑手管理
        </a-menu-item>
        <a-menu-item key="/rider/evaluate">
          <template #icon><star-outlined /></template>
          骑手评价
        </a-menu-item>
        <a-sub-menu key="orders">
          <template #icon><unordered-list-outlined /></template>
          <template #title>订单管理</template>
          <a-menu-item key="/order">订单列表</a-menu-item>
          <a-menu-item key="/refund">退款管理</a-menu-item>
          <a-menu-item key="/delivery/order">配送订单</a-menu-item>
        </a-sub-menu>
        <a-menu-item key="/open">
          <template #icon><api-outlined /></template>
          开放平台
        </a-menu-item>
      </a-menu>
    </a-layout-sider>
    <a-layout>
      <a-layout-header style="background:#fff;padding:0 16px;display:flex;align-items:center;justify-content:flex-end">
        <a-dropdown>
          <a-button type="text">管理员 <down-outlined /></a-button>
          <template #overlay>
            <a-menu>
              <a-menu-item @click="handleLogout">退出登录</a-menu-item>
            </a-menu>
          </template>
        </a-dropdown>
      </a-layout-header>
      <a-layout-content style="margin:16px">
        <router-view />
      </a-layout-content>
    </a-layout>
  </a-layout>
</template>

<script setup lang="ts">
import { ref, watch } from 'vue'
import { useRouter, useRoute } from 'vue-router'
import { useAuthStore } from '@/stores/auth'
import {
  GlobalOutlined, ApartmentOutlined, ShopOutlined,
  UserOutlined, UnorderedListOutlined, ApiOutlined, DownOutlined, StarOutlined
} from '@ant-design/icons-vue'

const router = useRouter()
const route = useRoute()
const auth = useAuthStore()
const collapsed = ref(false)
const selectedKeys = ref([route.path])

watch(() => route.path, (p) => { selectedKeys.value = [p] })

function onMenuClick({ key }: { key: string }) {
  router.push(key)
}

function handleLogout() {
  auth.logout()
  router.push('/login')
}
</script>

<style scoped>
.logo {
  height: 64px;
  color: #fff;
  font-size: 16px;
  font-weight: bold;
  display: flex;
  align-items: center;
  justify-content: center;
  overflow: hidden;
  white-space: nowrap;
}
</style>