SidevarItem.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465
  1. <template>
  2. <div class="box-item">
  3. <el-menu
  4. class="el-menu-vertical-demo"
  5. text-color="rgba(88, 109, 133, 1)"
  6. active-color="#fff"
  7. :default-active="activeIndex"
  8. :collapse="menuClose"
  9. @select="handleSelect"
  10. :router="true"
  11. >
  12. <!-- :default-openeds="[34]" -->
  13. <div class="logo el-menu-item">
  14. <el-icon :size="20"
  15. ><img src="@/assets/logo.png" style="width: 30px; height: 24px"
  16. /></el-icon>
  17. </div>
  18. <!-- 菜单项 -->
  19. <div v-for="item in roles" class="items">
  20. <!-- 系统首页 -->
  21. <el-menu-item
  22. v-if="item.name == 'home'"
  23. :index="`/wanzai/${item.name}`"
  24. >
  25. <svg-icon
  26. v-if="activeIndex == '/wanzai/home'"
  27. iconName="home_s"
  28. class="iconClass"
  29. ></svg-icon>
  30. <svg-icon v-else iconName="home" class="iconClass"></svg-icon>
  31. <span>{{ item.meta.title }}</span>
  32. </el-menu-item>
  33. <!-- 用户管理 -->
  34. <el-menu-item
  35. :index="`/wanzai/${item.name}`"
  36. v-if="item.name == 'user'"
  37. >
  38. <svg-icon
  39. v-if="activeIndex == '/wanzai/user'"
  40. iconName="user_s"
  41. class="iconClass"
  42. ></svg-icon>
  43. <svg-icon v-else iconName="user" class="iconClass"></svg-icon>
  44. <span>{{ item.meta.title }}</span>
  45. </el-menu-item>
  46. <!-- 身份管理 -->
  47. <el-menu-item
  48. v-if="item.name == 'identity'"
  49. :index="`/wanzai/${item.name}`"
  50. >
  51. <svg-icon
  52. v-if="activeIndex == '/wanzai/identity'"
  53. iconName="identity_s"
  54. class="iconClass"
  55. ></svg-icon>
  56. <svg-icon v-else iconName="identity" class="iconClass"></svg-icon>
  57. <span>{{ item.meta.title }}</span>
  58. </el-menu-item>
  59. <!-- 年级管理 -->
  60. <el-sub-menu :index="item.name" v-if="item.name == 'classGrade'">
  61. <template #title>
  62. <svg-icon
  63. v-if="
  64. activeIndex == '/wanzai/class' ||
  65. activeIndex == '/wanzai/grades' ||
  66. activeIndex == '/wanzai/post' ||
  67. activeIndex == '/wanzai/subject' ||
  68. activeIndex == '/wanzai/semester'
  69. "
  70. iconName="classGrade_s"
  71. class="iconClass"
  72. ></svg-icon>
  73. <svg-icon v-else iconName="classGrade" class="iconClass"></svg-icon>
  74. <span>{{ item.meta.title }}</span>
  75. </template>
  76. <el-menu-item v-for="i in item.children" :index="`/wanzai/${i.name}`">
  77. <template #title>
  78. <span>{{ i.meta.title }}</span>
  79. </template>
  80. </el-menu-item>
  81. </el-sub-menu>
  82. <!-- 应用管理 -->
  83. <el-menu-item
  84. :index="`/wanzai/${item.name}`"
  85. v-if="item.name == 'apply'"
  86. >
  87. <svg-icon
  88. v-if="activeIndex == '/wanzai/apply'"
  89. iconName="apply_s"
  90. class="iconClass"
  91. ></svg-icon>
  92. <svg-icon v-else iconName="apply" class="iconClass"></svg-icon>
  93. <span>{{ item.meta.title }}</span>
  94. </el-menu-item>
  95. <!-- 能耗管理 -->
  96. <el-menu-item
  97. v-if="item.name == 'energy'"
  98. :index="`/wanzai/${item.name}`"
  99. >
  100. <svg-icon
  101. v-if="activeIndex == '/wanzai/energy'"
  102. iconName="energy_s"
  103. class="iconClass"
  104. ></svg-icon>
  105. <svg-icon v-else iconName="energy" class="iconClass"></svg-icon>
  106. <span>{{ item.meta.title }}</span>
  107. </el-menu-item>
  108. <!-- 校园安全 -->
  109. <el-menu-item
  110. :index="`/wanzai/${item.name}`"
  111. v-if="item.name == 'safety'"
  112. >
  113. <svg-icon
  114. v-if="activeIndex == '/wanzai/safety'"
  115. iconName="safety_s"
  116. class="iconClass"
  117. ></svg-icon>
  118. <svg-icon v-else iconName="safety" class="iconClass"></svg-icon>
  119. <span>{{ item.meta.title }}</span>
  120. </el-menu-item>
  121. <!-- 访客预约 -->
  122. <el-menu-item
  123. :index="`/wanzai/${item.name}`"
  124. v-if="item.name == 'caller'"
  125. >
  126. <svg-icon
  127. v-if="activeIndex == '/wanzai/caller'"
  128. iconName="caller_s"
  129. class="iconClass"
  130. ></svg-icon>
  131. <svg-icon v-else iconName="caller" class="iconClass"></svg-icon>
  132. <span>{{ item.meta.title }}</span>
  133. </el-menu-item>
  134. <!-- 成绩管理 -->
  135. <el-menu-item
  136. :index="`/wanzai/${item.name}`"
  137. v-if="item.name == 'grade'"
  138. >
  139. <svg-icon
  140. v-if="activeIndex == '/wanzai/grade'"
  141. iconName="grade_s"
  142. class="iconClass"
  143. ></svg-icon>
  144. <svg-icon v-else iconName="grade" class="iconClass"></svg-icon>
  145. <span>{{ item.meta.title }}</span>
  146. </el-menu-item>
  147. <!-- 综合素质评价 -->
  148. <el-sub-menu :index="item.name" v-if="item.name == 'evaluate'">
  149. <template #title>
  150. <svg-icon
  151. v-if="
  152. activeIndex == '/wanzai/teacher' ||
  153. activeIndex == '/wanzai/student'
  154. "
  155. iconName="evaluate_s"
  156. class="iconClass"
  157. ></svg-icon>
  158. <svg-icon v-else iconName="evaluate" class="iconClass"></svg-icon>
  159. <span>{{ item.meta.title }}</span>
  160. </template>
  161. <el-menu-item v-for="i in item.children" :index="`/wanzai/${i.name}`">
  162. <template #title>
  163. <span>{{ i.meta.title }}</span>
  164. </template>
  165. </el-menu-item>
  166. </el-sub-menu>
  167. <!-- 数据交换 -->
  168. <el-sub-menu :index="item.name" v-if="item.name == 'dataExchange'">
  169. <template #title>
  170. <svg-icon
  171. v-if="
  172. activeIndex == '/wanzai/source' ||
  173. activeIndex == '/wanzai/task' ||
  174. activeIndex == '/wanzai/log'
  175. "
  176. iconName="data_s"
  177. class="iconClass"
  178. ></svg-icon>
  179. <svg-icon v-else iconName="data" class="iconClass"></svg-icon>
  180. <span>{{ item.meta.title }}</span>
  181. </template>
  182. <el-menu-item v-for="i in item.children" :index="`/wanzai/${i.name}`">
  183. <template #title>
  184. <span>{{ i.meta.title }}</span>
  185. </template>
  186. </el-menu-item>
  187. </el-sub-menu>
  188. <!-- 系统通知 -->
  189. <el-sub-menu :index="item.name" v-if="item.name == 'system'">
  190. <template #title>
  191. <svg-icon
  192. v-if="
  193. activeIndex == '/wanzai/info' ||
  194. activeIndex == '/wanzai/screenShot' ||
  195. activeIndex == '/wanzai/roles'
  196. "
  197. iconName="system_s"
  198. class="iconClass"
  199. ></svg-icon>
  200. <svg-icon v-else iconName="system" class="iconClass"></svg-icon>
  201. <span>{{ item.meta.title }}</span>
  202. </template>
  203. <el-menu-item v-for="i in item.children" :index="`/wanzai/${i.name}`">
  204. <template #title>
  205. <span>{{ i.meta.title }}</span>
  206. </template>
  207. </el-menu-item>
  208. </el-sub-menu>
  209. </div>
  210. </el-menu>
  211. </div>
  212. </template>
  213. <script setup>
  214. import { ref, onBeforeMount, onMounted, watch, reactive } from "vue";
  215. import { useStore } from "vuex";
  216. import { useRouter } from "vue-router";
  217. const store = useStore();
  218. const router = useRouter();
  219. const menuClose = ref(false);
  220. const activeIndex = ref(1);
  221. const acitveItems = reactive({ list: [] });
  222. const roles = ref();
  223. const roleList = ref();
  224. watch(
  225. () => store.state.user.collapse,
  226. (newValue, oldValue) => {
  227. menuClose.value = newValue;
  228. }
  229. );
  230. // watch(
  231. // () => store.state.user.activeIndex,
  232. // (newValue, oldValue) => {
  233. // console.log(newValue);
  234. // activeIndex.value = newValue;
  235. // }
  236. // );
  237. watch(
  238. () => router.currentRoute.value.fullPath,
  239. (newValue, oldValue) => {
  240. console.log(newValue);
  241. store.commit("indexUp", newValue);
  242. activeIndex.value = newValue;
  243. }
  244. );
  245. const handleSelect = (key, keyPath) => {
  246. // store.commit("indexUp", key);
  247. // activeIndex.value = key;
  248. // sessionStorage.setItem("sidevarItem", key);
  249. console.log(key, keyPath);
  250. router.push({
  251. path: `${key}`,
  252. });
  253. activeIndex.value = key;
  254. store.commit("indexUp", key);
  255. sessionStorage.setItem("sidevarItem", key);
  256. // if (activeIndex.value == 1) {
  257. // router.push({
  258. // path: `/seniorCelebrity/order`,
  259. // });
  260. // }
  261. };
  262. onBeforeMount(() => {
  263. activeIndex.value = sessionStorage.getItem("sidevarItem");
  264. roleList.value = JSON.parse(sessionStorage.getItem("roleList"));
  265. let classArr = [];
  266. let evaluateArr = [];
  267. let dataExchangeArr = [];
  268. let systemArr = [];
  269. let arr = [];
  270. roleList.value.forEach((item) => {
  271. if (
  272. item.routeName == "class" ||
  273. item.routeName == "grades" ||
  274. item.routeName == "post" ||
  275. item.routeName == "subject" ||
  276. item.routeName == "semester" ||
  277. item.routeName == "exam"
  278. ) {
  279. classArr.push({
  280. name: item.routeName,
  281. meta: { isAuth: true, title: item.name },
  282. });
  283. } else if (item.routeName == "teacher" || item.routeName == "student") {
  284. evaluateArr.push({
  285. name: item.routeName,
  286. meta: { isAuth: true, title: item.name },
  287. });
  288. } else if (
  289. item.routeName == "source" ||
  290. item.routeName == "task" ||
  291. item.routeName == "log"
  292. ) {
  293. dataExchangeArr.push({
  294. name: item.routeName,
  295. meta: { isAuth: true, title: item.name },
  296. });
  297. } else if (
  298. item.routeName == "info" ||
  299. item.routeName == "screenShot" ||
  300. item.routeName == "roles"
  301. ) {
  302. systemArr.push({
  303. name: item.routeName,
  304. meta: { isAuth: true, title: item.name },
  305. });
  306. } else {
  307. arr.push({
  308. name: item.routeName,
  309. meta: { isAuth: true, title: item.name },
  310. });
  311. }
  312. });
  313. console.log(classArr, "年级管理");
  314. console.log(evaluateArr, "综合素质评价");
  315. console.log(dataExchangeArr, "数据交换");
  316. console.log(systemArr, "系统设置");
  317. if (classArr.length != 0) {
  318. // arr.push({
  319. // name: "classGrade",
  320. // meta: { isAuth: true, title: "年级管理" },
  321. // children: classArr,
  322. // });
  323. arr.splice(3, 0, {
  324. name: "classGrade",
  325. meta: { isAuth: true, title: "年级管理" },
  326. children: classArr,
  327. });
  328. }
  329. if (evaluateArr.length != 0) {
  330. arr.push({
  331. name: "evaluate",
  332. meta: { isAuth: true, title: "综合素质评价" },
  333. children: evaluateArr,
  334. });
  335. }
  336. if (dataExchangeArr.length != 0) {
  337. arr.push({
  338. name: "dataExchange",
  339. meta: { isAuth: true, title: "数据交换" },
  340. children: dataExchangeArr,
  341. });
  342. }
  343. if (systemArr.length != 0) {
  344. arr.push({
  345. name: "system",
  346. meta: { isAuth: true, title: "系统设置" },
  347. children: systemArr,
  348. });
  349. }
  350. roles.value = arr;
  351. // roles.value = store.state.user.roles;
  352. console.log(roles.value);
  353. });
  354. </script>
  355. <style lang="scss" scoped>
  356. .iconClass {
  357. width: 1.5em;
  358. height: 1.5em;
  359. margin: 0 20px !important;
  360. }
  361. .el-menu-vertical-demo:not(.el-menu--collapse) {
  362. // width: 220px;
  363. // min-height: 400px;
  364. }
  365. .box-item {
  366. width: 220px !important;
  367. height: calc(100vh);
  368. }
  369. .el-menu {
  370. width: 220px;
  371. height: 100%;
  372. background: rgba(24, 51, 82, 1);
  373. box-shadow: 0px 0px 20px 0px rgba(0, 0, 0, 0.16);
  374. // background: rgba(24, 51, 82, 1);
  375. overflow: auto;
  376. .logo {
  377. height: 65px;
  378. color: rgb(255, 255, 255);
  379. cursor: default;
  380. display: flex;
  381. justify-content: space-around;
  382. align-items: center;
  383. }
  384. .logo:hover {
  385. background-color: transparent !important;
  386. }
  387. .el-sub-menu {
  388. .el-menu-item {
  389. // background-color: rgba(255, 255, 255, 1);
  390. color: rgba(88, 109, 133, 1);
  391. padding: 0 20px 0 78px;
  392. }
  393. :deep(.el-tooltip__trigger) {
  394. padding: 0 20px;
  395. }
  396. :deep(.el-sub-menu__title):hover {
  397. color: rgba(18, 38, 61, 1);
  398. background-color: rgba(18, 38, 61, 1);
  399. span {
  400. color: #fff;
  401. }
  402. }
  403. .el-menu--inline {
  404. background-color: rgba(9, 101, 98, 1);
  405. }
  406. }
  407. .el-menu {
  408. .el-menu-item {
  409. background-color: rgba(24, 51, 82, 1);
  410. // padding-left: 30px;
  411. }
  412. .el-menu-item:hover {
  413. color: #fff;
  414. background-color: rgba(18, 38, 61, 1);
  415. }
  416. }
  417. .el-sub-menu:hover {
  418. color: #fff;
  419. }
  420. .el-menu-item:hover {
  421. background-color: rgba(18, 38, 61, 1);
  422. color: #fff;
  423. }
  424. .el-menu-item.is-active {
  425. background-color: rgba(18, 38, 61, 1);
  426. color: #fff;
  427. }
  428. }
  429. // .el-menu-item.is-active {
  430. // box-sizing: border-box;
  431. // // background-color: #fff;
  432. // background-color: rgba(111, 182, 184, 1);
  433. // color: #fff;
  434. // }
  435. .el-sub-menu.is-active {
  436. :deep(.el-sub-menu__title) {
  437. // border: 1px solid red;
  438. color: #fff !important;
  439. background-color: rgba(18, 38, 61, 1);
  440. }
  441. }
  442. </style>