BaseLayout.vue 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735
  1. <template>
  2. <div class="layout">
  3. <!-- 头部菜单栏 -->
  4. <Header class="header">
  5. <div class="logo-wrap">
  6. <img src="../assets/ies5.png" :class="isCollapsed ? 'collapsed-logo-width unit-logo':'collapsed-logo-width unit-logo'" v-show="isShowLogo" />
  7. </div>
  8. <div class="school-wrap">
  9. <BaseSelectSchool></BaseSelectSchool>
  10. </div>
  11. <slot name="header-content"></slot>
  12. </Header>
  13. <!-- 侧边菜单栏 -->
  14. <Sider class="biz-menu" ref="side1" hide-trigger collapsible width="190" :collapsed-width="78" v-model="isCollapsed">
  15. <div class="collapse-icon-box" @click="changeMenuStatus">
  16. <Icon :class="rotateIcon" custom="iconfont icon-arrow" style="color:var(--primary-text-color)" @click.stop="changeMenuStatus" size="12" />
  17. </div>
  18. <Menu width="auto" :class="['menu-item', isCollapsed ? 'collapsed-menu' : '']" accordion :active-name="activeName" :open-names="openNames">
  19. <vuescroll :ops="ops">
  20. <MenuGroup :title="$t('system.menu.school')">
  21. <!-- 暂未提供判断是否购买服务的字段 -->
  22. <p class="school-menu-tips" v-if="$store.state.userInfo.schoolPay && !isCollapsed">{{$t('system.menu.noSchool1')}}</p>
  23. <p class="school-menu-tips" v-else-if="!$store.state.userInfo.hasSchool && !isCollapsed">{{$t('system.menu.noSchool2')}}</p>
  24. <div v-else-if="!$store.state.userInfo.schoolPay && $store.state.userInfo.hasSchool">
  25. <div v-for="(item,index) in schoolMenu" :key="index">
  26. <Submenu :name="item.subName" v-if="$access.ability(item.role,item.permission).validateAll && item.child.length" v-show="(index == 0 && $store.state.userInfo.hasSchool) || index > 0">
  27. <template slot="title">
  28. <Tooltip :content="item.name" placement="right" transfer v-show="isCollapsed">
  29. <Icon :custom="item.icon" style="width:55px;text-align:left;" :class="isCollapsed ? 'collapse-icon-size':''" size="16" />
  30. </Tooltip>
  31. <Icon v-show="!isCollapsed" :custom="item.icon" :class="isCollapsed ? 'collapse-icon-size':''" size="16" />
  32. <span>{{item.name}}</span>
  33. </template>
  34. <MenuItem :name="menuItem.menuName" :to="menuItem.router" v-for="(menuItem,i) in item.child" :key="i" v-show="$access.ability(menuItem.role,menuItem.permission).validateAll">
  35. <Tooltip :content="menuItem.name" placement="right" transfer v-show="isCollapsed">
  36. <Icon class="sub-menu-icon" :custom="menuItem.icon" size="16" />
  37. </Tooltip>
  38. <Icon v-show="!isCollapsed" class="sub-menu-icon" :custom="menuItem.icon" size="16" />
  39. <span>
  40. {{menuItem.name}}
  41. <span style="color: aqua;margin-left: 2px;font-size: 12px;vertical-align: text-top;">
  42. {{menuItem.tag}}
  43. </span>
  44. </span>
  45. </MenuItem>
  46. </Submenu>
  47. <MenuItem :name="item.menuName" v-else-if="$access.ability(item.role,item.permission).validateAll" :to="item.router">
  48. <Tooltip :content="item.name" placement="right" transfer v-show="isCollapsed">
  49. <Icon :custom="item.icon" style="width:55px;text-align:left;" :class="isCollapsed ? 'collapse-icon-size':''" size="16" />
  50. </Tooltip>
  51. <Icon v-show="!isCollapsed" :custom="item.icon" :class="isCollapsed ? 'collapse-icon-size':''" size="16" />
  52. <span>
  53. {{item.name}}
  54. <span style="color: aqua;margin-left: 2px;font-size: 12px;vertical-align: text-top;">
  55. {{item.tag}}
  56. </span>
  57. </span>
  58. </MenuItem>
  59. </div>
  60. </div>
  61. </MenuGroup>
  62. <MenuGroup :title="$t('system.menu.private')">
  63. <div v-for="(item,index) in teacherMenu" :key="index">
  64. <Submenu :name="item.subName" v-if="$access.ability(item.role,item.permission).validateAll && item.child.length" v-show="(index == 0 && $store.state.userInfo.hasSchool) || index > 0">
  65. <template slot="title">
  66. <Tooltip :content="item.name" placement="right" transfer v-show="isCollapsed">
  67. <Icon :custom="item.icon" style="width:55px;text-align:left;" :class="isCollapsed ? 'collapse-icon-size':''" size="16" />
  68. </Tooltip>
  69. <Icon v-show="!isCollapsed" :custom="item.icon" :class="isCollapsed ? 'collapse-icon-size':''" size="16" />
  70. <span>{{item.name}}</span>
  71. </template>
  72. <MenuItem :name="menuItem.menuName" :to="menuItem.router" v-for="(menuItem,i) in item.child" :key="i" v-show="$access.ability(menuItem.role,menuItem.permission).validateAll && menuItem.isShow">
  73. <Tooltip :content="menuItem.name" placement="right" transfer v-show="isCollapsed">
  74. <Icon class="sub-menu-icon" :custom="menuItem.icon" size="18" />
  75. </Tooltip>
  76. <Icon v-show="!isCollapsed" class="sub-menu-icon" :custom="menuItem.icon" size="16" />
  77. <span>
  78. {{menuItem.name}}
  79. <span style="color: aqua;margin-left: 2px;font-size: 12px;vertical-align: text-top;">
  80. {{menuItem.tag}}
  81. </span>
  82. </span>
  83. </MenuItem>
  84. </Submenu>
  85. <MenuItem :name="item.menuName" v-else-if="$access.ability(item.role,item.permission).validateAll && item.isShow" :to="item.router">
  86. <Tooltip :content="item.name" placement="right" transfer v-show="isCollapsed">
  87. <Icon :custom="item.icon" style="width:55px;text-align:left;" :class="isCollapsed ? 'collapse-icon-size':''" size="16" />
  88. </Tooltip>
  89. <Icon v-show="!isCollapsed" :custom="item.icon" :class="isCollapsed ? 'collapse-icon-size':''" size="16" />
  90. <span>
  91. {{item.name}}
  92. <span style="color: aqua;margin-left: 2px;font-size: 12px;margin-top:3px">
  93. {{item.tag}}
  94. </span>
  95. </span>
  96. </MenuItem>
  97. </div>
  98. </MenuGroup>
  99. </vuescroll>
  100. </Menu>
  101. <p class="copyright-info" v-show="!isCollapsed">
  102. {{$t('system.menu.copyright')}}
  103. </p>
  104. </Sider>
  105. <!-- Body内容部分 -->
  106. <Layout :class="isCollapsed ?'collapsed-padding content-wrap':'content-wrap'">
  107. <slot name="content"></slot>
  108. </Layout>
  109. </div>
  110. </template>
  111. <script>
  112. export default {
  113. data() {
  114. return {
  115. openNames: [],
  116. activeName: '',
  117. tipsOpt: {
  118. offset: [0, 20]
  119. },
  120. ops: {
  121. bar: { opacity: 0 }
  122. },
  123. isCollapsed: false,
  124. menuTree: [],
  125. schoolMenu: [],
  126. teacherMenu: [],
  127. isShowLogo: true
  128. }
  129. },
  130. methods: {
  131. initMenu() {
  132. //判断当前学校是否购买服务 暂未提供字段
  133. this.schoolMenu = !this.$store.state.userInfo.schoolPay ? [
  134. // 学校管理
  135. {
  136. icon: 'iconfont icon-school',
  137. name: this.$t('system.menu.schoolMgt'),
  138. router: '',
  139. subName: 'schoolMgt',
  140. role: 'admin',
  141. permission: 'schoolSetting-read|teacher-read|student-read|classroom-read|auth-read|course-read|syllabus-read|content-read|exercise-read|knowledge-read',
  142. child: [
  143. // 基础设置
  144. {
  145. icon: 'iconfont icon-basic-setting',
  146. name: this.$t('system.menu.baseSetting'),
  147. router: '/home/system',
  148. tag: '',
  149. role: 'admin',
  150. permission: 'schoolSetting-read|schoolSetting-upd',
  151. menuName: 'system'
  152. },
  153. // 教师管理
  154. {
  155. icon: 'iconfont icon-teacher-mgt',
  156. name: this.$t('system.menu.teacherMgt'),
  157. router: '/home/teachermgmt',
  158. tag: '',
  159. role: 'admin',
  160. permission: 'teacher-read|teacher-upd',
  161. menuName: 'teachermgmt'
  162. },
  163. // 学生管理
  164. {
  165. icon: 'iconfont icon-student-mgt',
  166. name: this.$t('system.menu.stuMgt'),
  167. router: '/home/studentAccount',
  168. tag: '',
  169. role: 'admin',
  170. permission: 'student-upd|student-read',
  171. menuName: 'studentAccount'
  172. },
  173. // // 教室管理
  174. {
  175. icon: 'iconfont icon-class-mgt',
  176. name: this.$t('system.menu.classMgt'),
  177. router: '/home/classroom',
  178. tag: '',
  179. role: 'admin',
  180. permission: 'classroom-upd|classroom-read',
  181. menuName: 'classroom'
  182. },
  183. // 课程管理
  184. {
  185. icon: 'iconfont icon-kecheng',
  186. name: this.$t('system.menu.cusMgt'),
  187. router: '/home/NewCusMgt',
  188. tag: '',
  189. role: 'admin',
  190. permission: 'course-read|course-upd',
  191. menuName: 'NewCusMgt'
  192. },
  193. // 授权管理
  194. {
  195. icon: 'iconfont icon-auth',
  196. name: this.$t('system.menu.authMgt'),
  197. router: '/home/serviceDriveAuth',
  198. tag: this.$t('system.menu.preview'),
  199. role: 'admin',
  200. permission: 'auth-read|auth-upd',
  201. menuName: 'serviceDriveAuth'
  202. }
  203. ]
  204. },
  205. // 学校资源
  206. {
  207. icon: 'iconfont icon-textbook',
  208. name: this.$t('system.menu.schoolRes'),
  209. router: '',
  210. subName: 'schoolRes',
  211. role: 'admin|teacher',
  212. permission: 'schoolSetting-read|teacher-read|student-read|classroom-read|auth-read|course-read|syllabus-read|content-read|exercise-read|knowledge-read',
  213. child: [
  214. // 校本课纲
  215. {
  216. icon: 'iconfont icon-syllabus',
  217. name: this.$t('system.menu.scSyllabus'),
  218. router: '/home/syllabus',
  219. tag: this.$t('system.menu.preview'),
  220. role: 'admin|teacher',
  221. permission: 'syllabus-read|syllabus-upd',
  222. menuName: 'syllabus'
  223. },
  224. // 校本内容
  225. {
  226. icon: 'iconfont icon-file',
  227. name: this.$t('system.menu.scContent'),
  228. router: '/home/schoolcontent',
  229. tag: '',
  230. role: 'admin|teacher',
  231. permission: 'content-read|content-upd',
  232. menuName: 'schoolcontent'
  233. },
  234. // 校本题库
  235. {
  236. icon: 'iconfont icon-question-bank',
  237. name: this.$t('system.menu.scQuBack'),
  238. router: '/home/evaluation/schoolBank',
  239. tag: '',
  240. role: 'admin|teacher',
  241. permission: 'exercise-read|exercise-upd',
  242. menuName: 'schoolBank'
  243. },
  244. // 知识点库
  245. {
  246. icon: 'iconfont icon-k-point',
  247. name: this.$t('system.menu.kdBack'),
  248. router: '/home/knowledge',
  249. tag: '',
  250. role: 'admin|teacher',
  251. permission: 'knowledge-read|knowledge-upd',
  252. menuName: 'knowledge'
  253. }
  254. ]
  255. },
  256. // 校园活动
  257. {
  258. icon: 'iconfont icon-activityS',
  259. name: this.$t('system.menu.scAc'),
  260. router: '',
  261. role: 'admin',
  262. permission: 'schoolAc-read|schoolAc-upd',
  263. subName: 'scAc',
  264. child: [
  265. {
  266. icon: 'iconfont icon-test',
  267. name: this.$t('system.menu.scEv'),
  268. router: '/home/schoolEvaluation',
  269. tag: '',
  270. role: 'admin',
  271. permission: 'schoolAc-read|schoolAc-upd',
  272. menuName: 'schoolEvaluation'
  273. },
  274. {
  275. icon: 'iconfont icon-vote',
  276. name: this.$t('system.menu.scVote'),
  277. router: '/home/manageVote',
  278. tag: '',
  279. role: 'admin',
  280. permission: 'schoolAc-read|schoolAc-upd',
  281. menuName: 'manageVote'
  282. },
  283. {
  284. icon: 'iconfont icon-questionnaire',
  285. name: this.$t('system.menu.scQu'),
  286. router: '/home/manageQuestionnaire',
  287. tag: '',
  288. role: 'admin',
  289. permission: 'schoolAc-read|schoolAc-upd',
  290. menuName: 'manageQuestionnaire'
  291. },
  292. ]
  293. },
  294. // 统计分析 暂时隐藏,只保留学情分析
  295. // {
  296. // icon: 'iconfont icon-analysis',
  297. // name: this.$t('system.menu.staAna'),
  298. // router: '',
  299. // role: 'admin',
  300. // subName: 'analysis',
  301. // permission: 'analysis-read|scboard-read',
  302. // child: [
  303. // // 学情分析
  304. // {
  305. // icon: 'iconfont icon-xueqing',
  306. // name: this.$t('system.menu.evAna'),
  307. // router: '/totalIndex',
  308. // tag: '',
  309. // role: 'admin',
  310. // permission: 'analysis-read',
  311. // menuName: 'totalIndex'
  312. // },
  313. // // 校园分析
  314. // {
  315. // icon: 'iconfont icon-school-analysis',
  316. // name: this.$t('system.menu.scAna'),
  317. // router: '/home/scboard',
  318. // tag: this.$t('system.menu.preview'),
  319. // role: 'admin',
  320. // permission: 'scboard-read',
  321. // menuName: 'scboard'
  322. // }
  323. // ]
  324. // },
  325. // 学情分析
  326. {
  327. icon: 'iconfont icon-xueqing',
  328. name: this.$t('system.menu.evAna'),
  329. router: '/totalIndex',
  330. tag: '',
  331. role: 'admin',
  332. permission: 'analysis-read',
  333. menuName: 'totalIndex',
  334. child: []
  335. },
  336. ] : []
  337. this.teacherMenu = [
  338. // 我的班级
  339. {
  340. icon: 'iconfont icon-class-self',
  341. name: this.$t('system.menu.myClass'),
  342. router: '/home/manageClass',
  343. tag: '',
  344. role: 'teacher',
  345. permission: '',
  346. child: [],
  347. menuName: 'manageClass',
  348. isShow: this.$store.state.userInfo.hasSchool && this.$store.state.userInfo.isHeadmaster
  349. },
  350. // 我的课程
  351. {
  352. icon: 'iconfont icon-course-self',
  353. name: this.$t('system.menu.myCus'),
  354. router: '/home/myCourse',
  355. tag: '',
  356. role: 'teacher',
  357. permission: '',
  358. child: [],
  359. menuName: 'myCourse',
  360. isShow: true
  361. },
  362. // 我的资源
  363. {
  364. icon: 'iconfont icon-textbook',
  365. name: this.$t('system.menu.cusContent'),
  366. router: '',
  367. role: 'teacher',
  368. permission: '',
  369. subName: 'cusContent',
  370. child: [
  371. {
  372. icon: 'iconfont icon-syllabus',
  373. name: this.$t('system.menu.prtSyllabus'),
  374. router: '/home/personalSyllabus',
  375. tag: this.$t('system.menu.preview'),
  376. role: 'teacher|admin',
  377. permission: '',
  378. menuName: 'personalSyllabus',
  379. isShow: true
  380. },
  381. {
  382. icon: 'iconfont icon-file',
  383. name: this.$t('system.menu.prtContent'),
  384. router: '/home/personalcontent',
  385. tag: '',
  386. role: 'teacher|admin',
  387. permission: '',
  388. menuName: 'personalcontent',
  389. isShow: true
  390. },
  391. {
  392. icon: 'iconfont icon-question-bank',
  393. name: this.$t('system.menu.prtQuBack'),
  394. router: '/home/evaluation/personalBank',
  395. tag: '',
  396. role: 'teacher|admin',
  397. permission: '',
  398. menuName: 'personalBank',
  399. isShow: true
  400. }
  401. ]
  402. },
  403. // 学习活动
  404. {
  405. icon: 'iconfont icon-activityT',
  406. name: this.$t('system.menu.stuAc'),
  407. router: '',
  408. role: 'teacher|admin',
  409. permission: '',
  410. subName: 'stuAc',
  411. child: [
  412. {
  413. icon: 'iconfont icon-test',
  414. name: this.$t('system.menu.prtEv'),
  415. router: '/home/privateEvaluation',
  416. tag: '',
  417. role: 'teacher|admin',
  418. permission: '',
  419. menuName: 'privateEvaluation',
  420. isShow: true
  421. },
  422. {
  423. icon: 'iconfont icon-vote',
  424. name: this.$t('system.menu.prtVote'),
  425. router: '/home/personalVote',
  426. tag: '',
  427. role: 'teacher|admin',
  428. permission: '',
  429. menuName: 'personalVote',
  430. isShow: true
  431. },
  432. {
  433. icon: 'iconfont icon-questionnaire',
  434. name: this.$t('system.menu.prtQu'),
  435. router: '/home/personalSurvey',
  436. tag: '',
  437. role: 'teacher|admin',
  438. permission: '',
  439. menuName: 'personalSurvey',
  440. isShow: true
  441. },
  442. // 自主学习和作业活动暂时隐藏
  443. // {
  444. // icon: 'iconfont icon-learning-self',
  445. // name: this.$t('system.menu.selfLearn'),
  446. // router: '/home/SelfLearn',
  447. // tag: this.$t('system.menu.preview'),
  448. // role: 'teacher|admin',
  449. // permission: '',
  450. // menuName: 'selfLearn',
  451. // isShow:true
  452. // },
  453. // {
  454. // icon: 'iconfont icon-hw',
  455. // name: this.$t('system.menu.homework'),
  456. // router: '/home/manageHomeWork',
  457. // tag: this.$t('system.menu.preview'),
  458. // role: 'teacher|admin',
  459. // permission: '',
  460. // menuName: 'manageHomeWork',
  461. // isShow:true
  462. // }
  463. ]
  464. },
  465. // 任务列表(暂时隐藏)
  466. {
  467. icon: 'iconfont icon-task',
  468. name: this.$t('system.menu.taskList'),
  469. router: '/home/taskList',
  470. tag: '预览',
  471. role: 'teacher',
  472. permission: '',
  473. child: [],
  474. menuName: 'taskList',
  475. isShow: this.$store.state.userInfo.hasSchool
  476. }
  477. ]
  478. },
  479. changeMenuStatus() {
  480. this.$refs.side1.toggleCollapse()
  481. this.$EventBus.$emit('onCollapseChange', this.isCollapsed)
  482. }
  483. },
  484. computed: {
  485. rotateIcon() {
  486. return ["collapse-icon", this.isCollapsed ? "rotate-icon" : ""]
  487. }
  488. },
  489. created() {
  490. this.initMenu()
  491. let cloudSetting = localStorage.getItem('cloudSetting')
  492. if (cloudSetting) {
  493. cloudSetting = JSON.parse(cloudSetting)
  494. if (cloudSetting.menuStatus == 'close') {
  495. this.isCollapsed = true
  496. }
  497. this.isShowLogo = cloudSetting.logoStatus === 'open'
  498. }
  499. },
  500. mounted() {
  501. this.$EventBus.$off('onLogoStatusChange')
  502. this.$EventBus.$on('onLogoStatusChange', val => {
  503. this.isShowLogo = val === 'open'
  504. })
  505. },
  506. watch: {
  507. $route: {
  508. handler(val, oldval) {
  509. if (this.schoolMenu.length == 0) {
  510. this.initMenu()
  511. }
  512. let metaName = val.meta.activeName
  513. this.activeName = metaName
  514. this.openNames = []
  515. for (let i in this.schoolMenu) {
  516. if (this.schoolMenu[i].child.length) {
  517. for (let j in this.schoolMenu[i].child) {
  518. if (this.schoolMenu[i].child[j].menuName == metaName) {
  519. this.activeName = metaName
  520. this.openNames.push(this.schoolMenu[i].subName)
  521. break
  522. }
  523. }
  524. }
  525. }
  526. for (let i in this.teacherMenu) {
  527. if (this.teacherMenu[i].child.length) {
  528. for (let j in this.teacherMenu[i].child) {
  529. if (this.teacherMenu[i].child[j].menuName == metaName) {
  530. this.activeName = metaName
  531. this.openNames.push(this.teacherMenu[i].subName)
  532. break
  533. }
  534. }
  535. }
  536. }
  537. },
  538. // 深度观察监听
  539. deep: true,
  540. //立即执行
  541. immediate: true
  542. },
  543. '$i18n.locale'(n, o) {
  544. this.initMenu()
  545. }
  546. }
  547. };
  548. </script>
  549. <style lang="less" scoped>
  550. @import "./BaseLayout.less";
  551. </style>
  552. <style lang="less">
  553. .biz-menu .ivu-menu-vertical .ivu-menu-item-group-title {
  554. font-size: 12px;
  555. line-height: 30px;
  556. height: 30px;
  557. position: relative;
  558. color: white;
  559. }
  560. .ivu-menu-item-group{
  561. position: relative;
  562. }
  563. .biz-menu .ivu-menu-vertical .ivu-menu-item-group::after {
  564. content: "";
  565. width: 100%;
  566. height: 1px;
  567. background: #303030;
  568. position: absolute;
  569. right: 0px;
  570. bottom: -10px;
  571. box-shadow:0px 12px 8px -12px #000;
  572. }
  573. .biz-menu .ivu-menu-item-group:nth-child(2)::after {
  574. background: transparent;
  575. }
  576. .biz-menu .ivu-menu-item-group:nth-child(2) {
  577. margin-top: 30px;
  578. }
  579. .biz-menu .ivu-menu-item-group:first-child {
  580. margin-top: 0px;
  581. }
  582. .biz-menu .ivu-menu-item-group {
  583. margin-top: 10px;
  584. }
  585. .layout .ivu-layout-header {
  586. padding: 0px;
  587. }
  588. .biz-menu .ivu-menu-light {
  589. // background: var(--side-bg);
  590. background: #1d1e23;
  591. color: var(--primary-textColor);
  592. }
  593. .biz-menu .ivu-menu-vertical.ivu-menu-light:after {
  594. width: 0px;
  595. }
  596. .biz-menu
  597. .ivu-menu-light.ivu-menu-vertical
  598. .ivu-menu-item-active:not(.ivu-menu-submenu) {
  599. background: #33343a;
  600. color: white;
  601. z-index: 2;
  602. }
  603. .collapsed-menu span {
  604. position: absolute;
  605. opacity: 0;
  606. float: right;
  607. width: 0px;
  608. }
  609. .menu-item span {
  610. display: inline-block;
  611. white-space: nowrap;
  612. font-size: 15px;
  613. // position: absolute;
  614. width: ~"calc(100% - 50px)";
  615. max-width: 150px;
  616. vertical-align: top;
  617. transition: width 0.2s;
  618. font-family: Roboto, -apple-system, BlinkMacSystemFont, Segoe UI,
  619. Microsoft JhengHei !important;
  620. }
  621. .menu-item i {
  622. margin-right: 10px;
  623. transform: translateX(0px);
  624. transition: font-size 0.5s ease, transform 0.5s ease;
  625. font-size: 16px;
  626. }
  627. .menu-item .ivu-menu .ivu-menu-item {
  628. color: #cccccc;
  629. }
  630. .menu-item .ivu-menu-item {
  631. color: hsla(0, 0%, 100%, 0.7);
  632. display: flex;
  633. align-items: center;
  634. }
  635. .menu-item .ivu-menu-submenu-title {
  636. color: hsla(0, 0%, 100%, 0.7);
  637. display: flex;
  638. align-items: center;
  639. }
  640. .collapsed-menu i {
  641. transform: translateX(5px);
  642. transition: font-size 0.2s ease 0.2s, transform 0.2s ease 0.2s;
  643. vertical-align: middle;
  644. font-size: 22px;
  645. }
  646. .biz-menu .ivu-icon-ios-arrow-down:before {
  647. position: absolute;
  648. top: -6px;
  649. font-size: 15px;
  650. }
  651. .collapsed-menu .ivu-icon-ios-arrow-down:before {
  652. right: -20px;
  653. }
  654. .biz-menu .ivu-menu-opened .ivu-icon-ios-arrow-down:before {
  655. transform: rotate(180deg);
  656. transition: transform 0.2s;
  657. }
  658. .biz-menu .ivu-icon-ios-arrow-down:before {
  659. transform: rotate(0deg);
  660. transition: transform 0.2s;
  661. }
  662. .biz-menu .ivu-menu-submenu-title-icon {
  663. transform: translateY(-50%) rotate(0deg) !important;
  664. }
  665. .poptop-content-radius .ivu-menu:first-child,
  666. .poptop-content-radius .ivu-menu:first-child .ivu-menu-item {
  667. border-top-left-radius: 5px;
  668. border-top-right-radius: 5px;
  669. }
  670. .poptop-content-radius .ivu-menu:last-child,
  671. .poptop-content-radius .ivu-menu:last-child .ivu-menu-item {
  672. border-bottom-left-radius: 5px;
  673. border-bottom-right-radius: 5px;
  674. }
  675. .biz-menu .ivu-menu-vertical .ivu-menu-item,
  676. .biz-menu .ivu-menu-vertical .ivu-menu-submenu-title {
  677. padding: 13px 24px;
  678. }
  679. .biz-menu .ivu-menu-submenu .ivu-menu-item {
  680. background: #101117;
  681. display: flex;
  682. align-items: center;
  683. }
  684. .biz-menu
  685. .ivu-menu-light.ivu-menu-vertical
  686. .ivu-menu-item-active:not(.ivu-menu-submenu) {
  687. color: #ffffff;
  688. }
  689. .biz-menu
  690. .ivu-menu-light.ivu-menu-vertical
  691. .ivu-menu-item-active:not(.ivu-menu-submenu):after {
  692. // background: transparent;
  693. background: #1cc0f3;
  694. width: 1px;
  695. }
  696. // .ivu-menu-submenu-title:hover .ivu-menu-submenu-title-icon::before,.ivu-menu-submenu-title:hover span, .ivu-menu-submenu-title:hover .ivu-icon{
  697. // color: #fff;
  698. // }
  699. .ivu-menu-submenu-title:hover .ivu-menu-submenu-title-icon::before {
  700. color: rgb(45, 183, 245);
  701. }
  702. .ivu-menu-item:hover,
  703. .ivu-menu-submenu-title:hover {
  704. color: white !important;
  705. .ivu-icon-ios-arrow-down:before {
  706. color: white !important;
  707. }
  708. }
  709. </style>