top-menu.vue 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. <template lang="html">
  2. <div id="menus">
  3. <el-row :style="`background:${backColor}`">
  4. <div class="w_1200">
  5. <el-col :span="24" class="menu">
  6. <el-menu :default-active="activeIndex" mode="horizontal" background-color="#850000" text-color="#fff" active-text-color="#fff" :router="true">
  7. <el-menu-item index="/">首页</el-menu-item>
  8. <template>
  9. <el-submenu index="/jobs">
  10. <template slot="title">
  11. {{ jobs.title }}
  12. </template>
  13. <el-menu-item v-for="(sub, subIndex) in jobs.children" :key="subIndex" :index="sub.path">{{ sub.title }}</el-menu-item>
  14. </el-submenu>
  15. </template>
  16. <template v-for="(item, index) in menu">
  17. <el-submenu :index="`${index}`" :key="index" v-if="item.type !== 'url' && item.type !== 'content'">
  18. <template slot="title">
  19. {{ item.title }}
  20. </template>
  21. <template v-for="(sub, subIndex) in item.children">
  22. <el-menu-item :index="sub.path" :key="subIndex" v-if="sub.type !== 'url'">{{ sub.title }}</el-menu-item>
  23. <el-menu-item :index="``" :key="subIndex" @click="turnTo(sub.url)" v-else> {{ sub.title }}</el-menu-item>
  24. </template>
  25. </el-submenu>
  26. <el-menu-item v-else-if="item.type === 'content'" :index="item.path" :key="index">{{ item.title }}</el-menu-item>
  27. <el-menu-item v-else :index="``" :key="index" @click="turnTo(item.url)">{{ item.title }}</el-menu-item>
  28. </template>
  29. </el-menu>
  30. </el-col>
  31. </div>
  32. </el-row>
  33. </div>
  34. </template>
  35. <script>
  36. import { jobMenu } from '@/config/jobs-menu';
  37. import { mapActions, mapState } from 'vuex';
  38. import _ from 'lodash';
  39. export default {
  40. name: 'menus',
  41. components: {},
  42. data: () => ({
  43. activeIndex: '1',
  44. jobs: jobMenu,
  45. menu: [],
  46. backColor: '#850000',
  47. }),
  48. created() {
  49. this.loadMenu();
  50. },
  51. methods: {
  52. ...mapActions(['menuOperation', 'newsOperation', 'columnOperation']),
  53. async loadMenu() {
  54. let menu = sessionStorage.getItem('menu');
  55. if (menu) {
  56. this.$set(this, `menu`, JSON.parse(menu));
  57. return;
  58. } else this.getMenu();
  59. },
  60. async getMenu() {
  61. //获取菜单
  62. let result = await this.menuOperation({ type: 'list', data: { site: this.$site } });
  63. if (`${result.errcode}` === '0') {
  64. //获取菜单的栏目
  65. let allMenu = result.data;
  66. for (let item of allMenu) {
  67. if (item.type === 'content') {
  68. item.path = `/info/detail?id=${item.content_id}`;
  69. } else if (item.type !== 'url') {
  70. let res = await this.completeMenu(item);
  71. item.children = res;
  72. }
  73. }
  74. sessionStorage.setItem('menu', JSON.stringify(allMenu));
  75. this.$set(this, `menu`, allMenu);
  76. }
  77. },
  78. async completeMenu(item) {
  79. let res = await this.columnOperation({ type: 'list', data: { parent_id: item.id, site: item.site } });
  80. if (`${res.errcode}` === '0') {
  81. //组合path:res.data内容都为栏目.所以,点击这些栏目显示的列表应该是信息列表,需要用栏目的id作为查询信息的parten_id查出不同栏目的信息
  82. for (const col of res.data) {
  83. if (col.type === 'content') col.path = `/info/detail?id=${col.content_id}`;
  84. else if (item.type !== 'url') col.path = `/info/list/${col.id}`;
  85. }
  86. return res.data;
  87. }
  88. },
  89. turnTo(url) {
  90. window.open(url);
  91. },
  92. },
  93. };
  94. </script>
  95. <style lang="less" scoped>
  96. .w_1200 {
  97. width: 1200px;
  98. margin: 0 auto;
  99. }
  100. .menu {
  101. position: relative;
  102. height: 40px;
  103. }
  104. /deep/.el-menu--horizontal > .el-menu-item {
  105. height: 40px;
  106. line-height: 40px;
  107. width: 110px;
  108. text-align: center;
  109. }
  110. .el-submenu {
  111. width: 110px;
  112. text-align: center;
  113. }
  114. /deep/.el-menu--horizontal > .el-submenu .el-submenu__icon-arrow {
  115. display: none;
  116. }
  117. /deep/.el-menu--horizontal > .el-submenu .el-submenu__title {
  118. height: 40px;
  119. line-height: 40px;
  120. }
  121. /deep/.el-menu--popup {
  122. min-width: 110px !important;
  123. }
  124. /deep/.el-menu--popup-bottom-start {
  125. margin-top: 0px;
  126. }
  127. /deep/.menu .el-menu.el-menu--horizontal {
  128. border-bottom: none;
  129. }
  130. /deep/.el-menu--horizontal > .el-menu-item.is-active {
  131. color: #fff;
  132. border-bottom: none;
  133. }
  134. </style>