NavMenu.vue 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330
  1. <template v-if="menuList && menuList.length > 0">
  2. <el-menu
  3. :default-active="activeMenuIndex"
  4. :unique-opened="true"
  5. :router="true"
  6. class="nav-menu"
  7. @open="handleOpen"
  8. @close="handleClose"
  9. @select="handleSelect"
  10. >
  11. <template v-for="(item, index) in menuList">
  12. <el-submenu
  13. :index="item.index"
  14. :key="index"
  15. v-if="item.node && item.node.length > 0"
  16. >
  17. <template slot="title">
  18. <svg-icon :icon-class="item.icon"></svg-icon>
  19. <span>{{ item.title }}</span>
  20. </template>
  21. <template v-for="(items, indexs) in item.node">
  22. <el-submenu
  23. :index="items.index"
  24. :key="indexs"
  25. v-if="items.node && items.node.length > 0"
  26. class="nav-item1"
  27. >
  28. <span slot="title" class="nav-item4">{{ items.title }}</span>
  29. <el-menu-item
  30. :index="itemss.index"
  31. :key="indexss"
  32. v-for="(itemss, indexss) in items.node"
  33. class="nav-item3"
  34. >{{ itemss.title }}</el-menu-item
  35. >
  36. </el-submenu>
  37. <el-menu-item
  38. :index="items.index"
  39. :key="indexs"
  40. v-else
  41. class="nav-item2"
  42. >{{ items.title }}</el-menu-item
  43. >
  44. </template>
  45. </el-submenu>
  46. <el-menu-item :index="item.index" v-else :key="index">
  47. <svg-icon :icon-class="item.icon"></svg-icon>
  48. <span slot="title">{{ item.title }}</span>
  49. </el-menu-item>
  50. </template>
  51. </el-menu>
  52. </template>
  53. <script>
  54. import { getToken } from "@/utils/auth";
  55. export default {
  56. components: {},
  57. name: "navMenu",
  58. props: ["activeMenuIndex"],
  59. data() {
  60. return {
  61. menuList: [],
  62. codeList:
  63. getToken() && JSON.parse(getToken())
  64. ? JSON.parse(getToken()).popedom_code_list
  65. : [],
  66. };
  67. },
  68. watch: {},
  69. computed: {},
  70. methods: {
  71. handleOpen(key, keyPath) {
  72. // console.log(key, keyPath);
  73. },
  74. handleClose(key, keyPath) {
  75. // console.log(key, keyPath);
  76. },
  77. handleSelect(key) {
  78. // this.$emit("handleSelectNav",key)
  79. window.localStorage.removeItem("pageSize");
  80. window.localStorage.removeItem("pageNumber");
  81. window.localStorage.removeItem("pageSizes");
  82. window.localStorage.removeItem("pageNumbers");
  83. window.localStorage.removeItem("tabsIndex");
  84. },
  85. // 处理菜单权限
  86. handleMenu() {
  87. this.menuList = [];
  88. let menuList = [
  89. {
  90. title: "数据中心",
  91. icon: "numbers-line",
  92. index: "data_center",
  93. showFlag: true,
  94. },
  95. {
  96. title: "内容管理",
  97. icon: "file-list-line",
  98. index: "content_manage",
  99. node: [
  100. {
  101. title: "报纸管理",
  102. index: "newspaper_manage",
  103. code: 20001,
  104. },
  105. {
  106. title: "画刊管理",
  107. index: "pictorial_manage",
  108. code: 20002,
  109. },
  110. // {
  111. // title: "练习册管理",
  112. // index: "workbook_manage",
  113. // code: 20005,
  114. // },
  115. {
  116. title: "评测管理",
  117. index: "evaluation_manage",
  118. code: 20004,
  119. },
  120. {
  121. title: "课程管理",
  122. index: "course_manage",
  123. code: 20006,
  124. node: [
  125. {
  126. title: "录播课",
  127. index: "recorded_course",
  128. },
  129. {
  130. title: "直播课",
  131. index: "live_course",
  132. },
  133. ],
  134. },
  135. {
  136. title: "专辑管理",
  137. index: "album_manage",
  138. code: 20003,
  139. },
  140. {
  141. title: "广告管理",
  142. index: "advertise_manage",
  143. code: 20007,
  144. },
  145. ],
  146. },
  147. {
  148. title: "机构管理",
  149. icon: "school-line",
  150. index: "organize_manage",
  151. code: 10002,
  152. },
  153. {
  154. title: "系统用户",
  155. icon: "contacts-line",
  156. index: "people_manage",
  157. code: 10001,
  158. },
  159. {
  160. title: "兑换码管理",
  161. icon: "barcode-line",
  162. index: "cdkey_manage",
  163. code: 30001,
  164. },
  165. {
  166. title: "财务中心",
  167. icon: "money-cny-box-line",
  168. index: "finance_manage",
  169. code: 40001,
  170. node: [
  171. {
  172. title: "流水管理",
  173. index: "flow_manage",
  174. },
  175. ],
  176. },
  177. {
  178. title: "系统配置",
  179. icon: "setting",
  180. index: "system_config",
  181. code: 50001,
  182. node: [
  183. {
  184. title: "邮箱配置",
  185. index: "email_setting",
  186. },
  187. {
  188. title: "导入配置",
  189. index: "export_setting",
  190. },
  191. {
  192. title: "折扣规则",
  193. index: "discount_setting",
  194. },
  195. {
  196. title: "分享配置",
  197. index: "share_setting",
  198. },
  199. {
  200. title: "订阅价格管理",
  201. index: "order_setting",
  202. },
  203. {
  204. title: "支付配置",
  205. index: "pay_setting",
  206. },
  207. {
  208. title: "预览配置",
  209. index: "preview_setting",
  210. },
  211. {
  212. title: "精读订阅包年价格",
  213. index: "reservation_setting",
  214. },
  215. {
  216. title: "测评价格",
  217. index: "test_setting",
  218. },
  219. {
  220. title: "短信资源",
  221. index: "SMS_resources",
  222. },
  223. ],
  224. },
  225. ];
  226. menuList.forEach((item) => {
  227. if (item.showFlag) {
  228. this.menuList.push(item);
  229. } else {
  230. if (
  231. this.codeList.indexOf(item.code) > -1 ||
  232. (getToken() && JSON.parse(getToken()).is_inner === "true")
  233. ) {
  234. this.menuList.push(item);
  235. } else if (item.hasOwnProperty("node")) {
  236. let obj = {
  237. title: item.title,
  238. icon: item.icon,
  239. index: item.index,
  240. node: [],
  241. };
  242. item.node.forEach((items) => {
  243. if (
  244. this.codeList.indexOf(items.code) > -1 ||
  245. (getToken() && JSON.parse(getToken()).is_inner === "true")
  246. ) {
  247. obj.node.push(items);
  248. }
  249. });
  250. if (obj.node.length > 0) {
  251. this.menuList.push(obj);
  252. }
  253. }
  254. }
  255. });
  256. },
  257. },
  258. created() {
  259. this.handleMenu();
  260. },
  261. mounted() {},
  262. beforeDestroy() {},
  263. };
  264. </script>
  265. <style lang="scss" scoped>
  266. .nav-menu {
  267. }
  268. </style>
  269. <style lang="scss">
  270. .nav-menu {
  271. .el-menu-item,
  272. .el-submenu__title {
  273. color: #4e5969;
  274. padding: 9px 12px !important;
  275. height: 40px;
  276. border-radius: 2px;
  277. font-size: 14px;
  278. line-height: 22px;
  279. margin: 2px 0;
  280. display: flex;
  281. width: 100%;
  282. align-items: center;
  283. &:hover,
  284. &:focus {
  285. background: #f2f3f5;
  286. }
  287. &.is-active {
  288. color: #165dff;
  289. font-weight: 500;
  290. background: #f2f3f5;
  291. }
  292. .svg-icon {
  293. width: 14px;
  294. height: 14px;
  295. margin-right: 16px;
  296. }
  297. .el-submenu__icon-arrow {
  298. right: 12px;
  299. color: #4e5969;
  300. }
  301. }
  302. .nav-item2 {
  303. padding-left: 42px !important;
  304. color: #1d2129;
  305. span {
  306. overflow: hidden;
  307. text-overflow: ellipsis;
  308. white-space: nowrap;
  309. }
  310. }
  311. .nav-item3 {
  312. padding-left: 50px !important;
  313. color: #1d2129;
  314. }
  315. .nav-item4 {
  316. padding-left: 30px !important;
  317. color: #1d2129;
  318. }
  319. .el-submenu.is-active {
  320. > .el-submenu__title {
  321. color: #165dff;
  322. span {
  323. color: #165dff;
  324. }
  325. }
  326. }
  327. }
  328. </style>