menu.vue 3.2 KB

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