NavMenu.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439
  1. <template v-if="menuList && menuList.length > 0">
  2. <div :class="[isPhone ? 'nav-menu-box-phone' : 'nav-menu-box']">
  3. <svg-icon
  4. icon-class="menu"
  5. class="nav-menu-btn"
  6. @click="showMenu = !showMenu"
  7. v-if="isPhone"
  8. ></svg-icon>
  9. <el-menu
  10. :default-active="activeMenuIndex"
  11. :unique-opened="true"
  12. :router="true"
  13. class="nav-menu"
  14. :class="[isPhone ? 'nav-menu-phone' : '']"
  15. @open="handleOpen"
  16. @close="handleClose"
  17. @select="handleSelect"
  18. v-show="showMenu"
  19. >
  20. <template v-for="(item, index) in menuList">
  21. <el-submenu
  22. :index="item.index"
  23. :key="index"
  24. v-if="item.node && item.node.length > 0"
  25. >
  26. <template slot="title">
  27. <svg-icon :icon-class="item.icon"></svg-icon>
  28. <span>{{ item.title }}</span>
  29. </template>
  30. <template v-for="(items, indexs) in item.node">
  31. <el-submenu
  32. :index="items.index"
  33. :key="indexs"
  34. v-if="items.node && items.node.length > 0"
  35. class="nav-item1"
  36. >
  37. <span slot="title" class="nav-item4">{{ items.title }}</span>
  38. <el-menu-item
  39. :index="itemss.index"
  40. :key="indexss"
  41. v-for="(itemss, indexss) in items.node"
  42. class="nav-item3"
  43. >{{ itemss.title }}</el-menu-item
  44. >
  45. </el-submenu>
  46. <el-menu-item
  47. :index="items.index"
  48. :key="indexs"
  49. v-else
  50. class="nav-item2"
  51. >{{ items.title }}</el-menu-item
  52. >
  53. </template>
  54. </el-submenu>
  55. <el-menu-item :index="item.index" v-else :key="index">
  56. <svg-icon :icon-class="item.icon"></svg-icon>
  57. <span slot="title">{{ item.title }}</span>
  58. </el-menu-item>
  59. </template>
  60. </el-menu>
  61. </div>
  62. </template>
  63. <script>
  64. import { getToken } from "@/utils/auth";
  65. export default {
  66. components: {},
  67. name: "navMenu",
  68. props: ["activeMenuIndex"],
  69. data() {
  70. return {
  71. menuList: [],
  72. codeList:
  73. getToken() && JSON.parse(getToken())
  74. ? JSON.parse(getToken()).popedom_code_list
  75. : [],
  76. isPhone: false,
  77. showMenu: true,
  78. };
  79. },
  80. watch: {},
  81. computed: {},
  82. methods: {
  83. handleOpen(key, keyPath) {
  84. // console.log(key, keyPath);
  85. },
  86. handleClose(key, keyPath) {
  87. // console.log(key, keyPath);
  88. },
  89. handleSelect(key) {
  90. // this.$emit("handleSelectNav",key)
  91. window.localStorage.removeItem("pageSize");
  92. window.localStorage.removeItem("pageNumber");
  93. window.localStorage.removeItem("pageSizes");
  94. window.localStorage.removeItem("pageNumbers");
  95. window.localStorage.removeItem("tabsIndex");
  96. if (this.isPhone) {
  97. this.showMenu = false;
  98. }
  99. },
  100. // 处理菜单权限
  101. handleMenu() {
  102. this.menuList = [];
  103. let menuList = [
  104. {
  105. title: "数据中心",
  106. icon: "numbers-line",
  107. index: "data_center",
  108. showFlag: true,
  109. },
  110. {
  111. title: "内容管理",
  112. icon: "file-list-line",
  113. index: "content_manage",
  114. node: [
  115. {
  116. title: "报纸管理",
  117. index: "newspaper_manage",
  118. code: 20001,
  119. },
  120. {
  121. title: "画刊管理",
  122. index: "pictorial_manage",
  123. code: 20002,
  124. },
  125. // {
  126. // title: "练习册管理",
  127. // index: "workbook_manage",
  128. // code: 20005,
  129. // },
  130. {
  131. title: "评测管理",
  132. index: "evaluation_manage",
  133. code: 20004,
  134. },
  135. {
  136. title: "课程管理",
  137. index: "course_manage",
  138. code: 20006,
  139. node: [
  140. {
  141. title: "录播课",
  142. index: "recorded_course",
  143. },
  144. {
  145. title: "直播课",
  146. index: "live_course",
  147. },
  148. ],
  149. },
  150. {
  151. title: "专辑管理",
  152. index: "album_manage",
  153. code: 20003,
  154. },
  155. {
  156. title: "广告管理",
  157. index: "advertise_manage",
  158. code: 20007,
  159. },
  160. ],
  161. },
  162. {
  163. title: "机构管理",
  164. icon: "school-line",
  165. index: "organize_manage",
  166. node: [
  167. {
  168. title: "机构列表",
  169. index: "organize_manage",
  170. code: 10002,
  171. },
  172. {
  173. title: "全部人员",
  174. index: "organize_people_manage",
  175. code: 10002,
  176. },
  177. ],
  178. },
  179. {
  180. title: "系统用户",
  181. icon: "contacts-line",
  182. index: "people_manage",
  183. code: 10001,
  184. },
  185. {
  186. title: "兑换码管理",
  187. icon: "barcode-line",
  188. index: "cdkey_manage",
  189. code: 30001,
  190. },
  191. {
  192. title: "财务中心",
  193. icon: "money-cny-box-line",
  194. index: "finance_manage",
  195. node: [
  196. {
  197. title: "流水管理",
  198. index: "flow_manage",
  199. code: 40001,
  200. },
  201. {
  202. title: "退款管理",
  203. index: "refund_manage",
  204. code: 40003,
  205. },
  206. {
  207. title: "发票管理",
  208. index: "invoice_manage",
  209. code: 40004,
  210. },
  211. ],
  212. },
  213. {
  214. title: "系统配置",
  215. icon: "setting",
  216. index: "system_config",
  217. code: 50001,
  218. node: [
  219. {
  220. title: "邮箱配置",
  221. index: "email_setting",
  222. },
  223. {
  224. title: "导入配置",
  225. index: "export_setting",
  226. },
  227. {
  228. title: "折扣规则",
  229. index: "discount_setting",
  230. },
  231. {
  232. title: "分享配置",
  233. index: "share_setting",
  234. },
  235. {
  236. title: "订阅价格管理",
  237. index: "order_setting",
  238. },
  239. {
  240. title: "支付配置",
  241. index: "pay_setting",
  242. },
  243. {
  244. title: "预览配置",
  245. index: "preview_setting",
  246. },
  247. {
  248. title: "精读订阅包年价格",
  249. index: "reservation_setting",
  250. },
  251. {
  252. title: "测评价格",
  253. index: "test_setting",
  254. },
  255. {
  256. title: "短信资源",
  257. index: "SMS_resources",
  258. },
  259. {
  260. title: "聚水潭对接配置",
  261. index: "jst_setting",
  262. },
  263. {
  264. title: "企信对接配置",
  265. index: "qx_setting",
  266. },
  267. ],
  268. },
  269. ];
  270. if (this.isPhone) {
  271. menuList = [
  272. {
  273. title: "机构管理",
  274. icon: "school-line",
  275. index: "organize_manage",
  276. node: [
  277. {
  278. title: "全部人员",
  279. index: "organize_people_manage",
  280. code: 10002,
  281. },
  282. ],
  283. },
  284. {
  285. title: "财务中心",
  286. icon: "money-cny-box-line",
  287. index: "finance_manage",
  288. node: [
  289. {
  290. title: "流水管理",
  291. index: "flow_manage",
  292. code: 40001,
  293. },
  294. {
  295. title: "退款管理",
  296. index: "refund_manage",
  297. code: 40003,
  298. },
  299. ],
  300. },
  301. ];
  302. }
  303. menuList.forEach((item) => {
  304. if (item.showFlag) {
  305. this.menuList.push(item);
  306. } else {
  307. if (
  308. this.codeList.indexOf(item.code) > -1 ||
  309. (getToken() && JSON.parse(getToken()).is_inner === "true")
  310. ) {
  311. this.menuList.push(item);
  312. } else if (item.hasOwnProperty("node")) {
  313. let obj = {
  314. title: item.title,
  315. icon: item.icon,
  316. index: item.index,
  317. node: [],
  318. };
  319. item.node.forEach((items) => {
  320. if (
  321. this.codeList.indexOf(items.code) > -1 ||
  322. (getToken() && JSON.parse(getToken()).is_inner === "true")
  323. ) {
  324. obj.node.push(items);
  325. }
  326. });
  327. if (obj.node.length > 0) {
  328. this.menuList.push(obj);
  329. }
  330. }
  331. }
  332. });
  333. },
  334. },
  335. created() {
  336. const regExp = /Android|webOS|iPhone|BlackBerry|IEMobile|Opera Mini/i;
  337. this.isPhone = regExp.test(navigator.userAgent) && window.innerWidth < 860;
  338. if (this.isPhone) {
  339. this.showMenu = false;
  340. }
  341. this.handleMenu();
  342. },
  343. mounted() {},
  344. beforeDestroy() {},
  345. };
  346. </script>
  347. <style lang="scss" scoped>
  348. .nav-menu-box-phone {
  349. position: fixed;
  350. left: 0;
  351. top: 52px;
  352. z-index: 1001;
  353. box-shadow: 0 2px 2px rgba(0, 0, 0, 8%);
  354. padding: 0;
  355. }
  356. .nav-menu-box {
  357. background-color: #fff;
  358. border-right: solid 1px #e6e6e6;
  359. }
  360. :deep .el-menu {
  361. border-right: none;
  362. width: 100% !important;
  363. }
  364. .nav-menu-btn {
  365. position: fixed;
  366. padding: 17px;
  367. top: 0;
  368. left: 0;
  369. z-index: 1000;
  370. width: 52px !important;
  371. height: 52px !important;
  372. }
  373. </style>
  374. <style lang="scss">
  375. .nav-menu {
  376. .el-menu-item,
  377. .el-submenu__title {
  378. color: #4e5969;
  379. padding: 9px 12px !important;
  380. height: 40px;
  381. border-radius: 2px;
  382. font-size: 14px;
  383. line-height: 22px;
  384. margin: 2px 0;
  385. display: flex;
  386. width: 100%;
  387. align-items: center;
  388. &:hover,
  389. &:focus {
  390. background: #f2f3f5;
  391. }
  392. &.is-active {
  393. color: #165dff;
  394. font-weight: 500;
  395. background: #f2f3f5;
  396. }
  397. .svg-icon {
  398. width: 14px;
  399. height: 14px;
  400. margin-right: 16px;
  401. }
  402. .el-submenu__icon-arrow {
  403. right: 12px;
  404. color: #4e5969;
  405. }
  406. }
  407. .nav-item2 {
  408. padding-left: 42px !important;
  409. color: #1d2129;
  410. span {
  411. overflow: hidden;
  412. text-overflow: ellipsis;
  413. white-space: nowrap;
  414. }
  415. }
  416. .nav-item3 {
  417. padding-left: 50px !important;
  418. color: #1d2129;
  419. }
  420. .nav-item4 {
  421. padding-left: 30px !important;
  422. color: #1d2129;
  423. }
  424. .el-submenu.is-active {
  425. > .el-submenu__title {
  426. color: #165dff;
  427. span {
  428. color: #165dff;
  429. }
  430. }
  431. }
  432. }
  433. </style>