menu.vue 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. <script setup lang="ts">
  2. import { useCommonStoreHook } from "@/store";
  3. const { currentMenu, currentProjectId } = toRefs(useCommonStoreHook());
  4. interface MenuItem {
  5. name: string;
  6. icon: string;
  7. route: string;
  8. }
  9. const menus = ref<MenuItem[]>([
  10. {
  11. name: "首页",
  12. icon: "home",
  13. route: "/main/home",
  14. },
  15. {
  16. name: "测试执行",
  17. icon: "run-test",
  18. route: "/main/run-test",
  19. },
  20. {
  21. name: "数据管理",
  22. icon: "data-manager",
  23. route: "/main/data-manager",
  24. },
  25. {
  26. name: "工程配置",
  27. icon: "project-config",
  28. route: "/main/project-config",
  29. },
  30. {
  31. name: "报告模版",
  32. icon: "report-template",
  33. route: "/main/report-template",
  34. },
  35. {
  36. name: "人员管理",
  37. icon: "person-manager",
  38. route: "/main/person-manager",
  39. },
  40. ]);
  41. const router = useRouter();
  42. const handleMenuClick = (menu: MenuItem) => {
  43. if (menu.route != currentMenu.value.route) {
  44. // 如果工程配置没有值,就不跳转,并提示 && !currentProjectId.value
  45. if (menu.route === "/main/project-config" && !currentProjectId.value) {
  46. ElMessage.warning("请先在首页选择工程");
  47. return;
  48. }
  49. currentMenu.value = menu;
  50. router.push(menu.route);
  51. }
  52. };
  53. </script>
  54. <template>
  55. <div class="menu">
  56. <div
  57. class="menu-box"
  58. v-for="menu in menus"
  59. :key="menu.name"
  60. @click="handleMenuClick(menu)"
  61. >
  62. <!-- 这里的图标可以用可变色的svg 传过去一个color属性,然后根据当前路由的颜色来显示不同的颜色-->
  63. <svg-icon
  64. :icon-class="menu.icon"
  65. size="24"
  66. :style="{
  67. color: menu.route === currentMenu.route ? 'white' : '#AFB9D0',
  68. }"
  69. />
  70. <div
  71. class="name"
  72. :class="[menu.route === currentMenu.route ? 'selected' : 'normal']"
  73. >
  74. {{ menu.name }}
  75. </div>
  76. </div>
  77. </div>
  78. </template>
  79. <style scoped lang="scss">
  80. .menu {
  81. height: calc(100vh - $main-header-height);
  82. width: 79px;
  83. display: flex;
  84. flex-direction: column;
  85. justify-content: start;
  86. align-items: center;
  87. padding: 12px 6px;
  88. background-color: $hj-black-1;
  89. .menu-box {
  90. width: 64px;
  91. height: 64px;
  92. display: flex;
  93. flex-direction: column;
  94. justify-content: center;
  95. align-items: center;
  96. margin-bottom: 12px;
  97. .name {
  98. margin-top: 10px;
  99. font-weight: bold;
  100. font-size: 12px;
  101. line-height: 19px;
  102. text-align: center;
  103. }
  104. .normal {
  105. color: #afb9d0;
  106. }
  107. .selected {
  108. color: $hj-white-1;
  109. }
  110. }
  111. }
  112. </style>