类型文件生成配置
笑笑 authored at 2023-03-16 11:47:22
4.26 KiB
NewLife.CubeVue
<template>
  <pro-layout
    :locale="locale"
    v-bind="layoutConf"
    v-model:openKeys="state.openKeys"
    v-model:collapsed="state.collapsed"
    v-model:selectedKeys="state.selectedKeys"
  >
    <template #rightContentRender>
      <div style="margin-right: 12px; display: flex; align-items: center">
        <el-dropdown class="avatar-container right-menu-item" trigger="hover">
          <div class="avatar-wrapper">
            <span>
              <img
                :src="myAvatar"
                style="
                  cursor: pointer;
                  width: 35px;
                  height: 35px;
                  border-radius: 10px;
                "
              />
            </span>
            <span class="user-info">
              {{ userInfo && userInfo.displayName }}
              <!-- <br />
              [{{ userInfo && userInfo.roleNames }}] -->
            </span>
          </div>
          <template #dropdown>
            <el-dropdown-menu class="avatar-dropdown">
              <router-link to="/">
                <el-dropdown-item>
                  <span style="display: inline-block">首页</span>
                </el-dropdown-item>
              </router-link>

              <router-link to="/Admin/User/Info">
                <el-dropdown-item divided>
                  <span style="display: inline-block">个人信息</span>
                </el-dropdown-item>
              </router-link>

              <el-dropdown-item divided>
                <span style="display: block" @click="logout">退出登录</span>
              </el-dropdown-item>
            </el-dropdown-menu>
          </template>
        </el-dropdown>
      </div>
    </template>

    <template #breadcrumbRender="{ route, params, routes }">
      <span v-if="routes.indexOf(route) === routes.length - 1">
        {{ 1111 }}
      </span>
      <router-link v-else :to="{ path: route.path, params }">
        {{ 2222 }}
      </router-link>
    </template>

    <router-view />
  </pro-layout>
</template>

<script setup lang="ts">
import ProLayout from '@ant-design-vue/pro-layout';
import { computed, reactive, ref } from 'vue';
import { useStore } from 'vuex';

const store = useStore();
const locale = (i18n: string) => i18n;

function getMenu(routers: any) {
  // 不展示的菜单过滤掉,部分菜单传进去后渲染报错
  const list = routers.filter((item: any) => item.visible === true);
  return list.map((item: any) => {
    if (item.children) {
      return {
        ...item,
        meta: {
          ...item.meta,
          title: item.displayName,
        },
        children: getMenu(item.children),
      };
    }

    return {
      ...item,
      meta: {
        ...item.meta,
        title: item.displayName,
      },
    };
  });
}

const menus = computed(() => {
  return getMenu(store.getters.menuRouters);
  //   return [
  //     {
  //       path: '/Admin',
  //       name: 'Admin',
  //       meta: {
  //         title: 'menu.result.success',
  //       },
  //       children: [
  //         {
  //           path: '/Admin/User/Info',
  //           name: 'UserInfo',
  //           meta: {
  //             title: 'menu.result.success',
  //           },
  //         },
  //         {
  //           path: '/Admin/User',
  //           name: 'AdminUser',
  //           meta: {
  //             title: 'menu.result.success',
  //           },
  //         },
  //       ],
  //     },
  //   ];
});

const state = reactive({
  collapsed: false, // default value
  openKeys: ['/dashboard'],
  selectedKeys: ['/welcome'],
});

const layoutConf = reactive({
  title: '魔方',
  logo: '/leaf.png',
  menuData: menus,
  navTheme: 'light',
  headerTheme: 'light',
  layout: 'mix',
});

const userInfo = computed(() => {
  return store.getters.userInfo;
});

const myAvatar = computed(() => {
  let avatar = userInfo.value && userInfo.value.avatar;
  if (avatar) {
    if (avatar.indexOf('http') !== 0) {
      avatar = store.getters.urls.baseUrl + avatar;
    }
    return avatar;
  }

  return '/leaf.png';
});

function logout() {
  store.dispatch('logout');
  location.reload(); // 为了重新实例化vue-router对象 避免bug
}
</script>

<style>
.ant-pro-basicLayout-content {
  height: -moz-calc(100vh - 96px);
  height: -webkit-calc(100vh - 96px);
  height: calc(100vh - 96px);
}
</style>