LayoutHeader.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622
  1. <template>
  2. <!-- 顶部登录导航 -->
  3. <div class="LoginNav">
  4. <div class="logo">
  5. <span class="logo-img"> logo </span>
  6. <el-menu
  7. :default-active="activeIndex"
  8. class="el-menu-demo"
  9. mode="horizontal"
  10. text-color="#000"
  11. active-text-color="#F90"
  12. @select="handleSelect"
  13. >
  14. <el-menu-item index="1">主页</el-menu-item>
  15. <el-menu-item index="2">
  16. <template v-if="projectList.length > 1">
  17. <el-dropdown trigger="click" @command="handleCommand">
  18. <span
  19. class="el-dropdown-link"
  20. :style="{ color: activeIndex === '2' ? '#F90' : '#000' }"
  21. >
  22. {{ projectName }}
  23. <!-- SYSTEM -->
  24. <i class="el-icon-arrow-down el-icon--right"></i>
  25. </span>
  26. <el-dropdown-menu slot="dropdown" style="min-width: 278px">
  27. <el-dropdown-item
  28. v-for="(item, i) in projectList"
  29. :key="i"
  30. :class="i === LoginNavIndex ? 'menuActive' : ''"
  31. :command="i"
  32. class="projectList"
  33. >
  34. <img
  35. style="position: relative; width: 24px"
  36. :src="require('../../assets/login/' + item.img + '.png')"
  37. alt=""
  38. />
  39. <span style="margin-left: 16px">
  40. {{ item.name }}
  41. </span>
  42. </el-dropdown-item>
  43. </el-dropdown-menu>
  44. </el-dropdown>
  45. </template>
  46. <template v-else>{{ projectList.length > 0 && projectList[0].name }}</template>
  47. </el-menu-item>
  48. </el-menu>
  49. </div>
  50. <div class="userName">
  51. <el-dropdown style="margin-right: 16px" trigger="click" @command="changeLang">
  52. <span class="el-dropdown-link">
  53. {{ lang }}<i class="el-icon-arrow-down el-icon--right"></i>
  54. </span>
  55. <el-dropdown-menu slot="dropdown" style="width: 200px">
  56. <el-dropdown-item v-for="item in language_list" :key="item.language_type" :command="item">
  57. {{ item.language_name }}
  58. </el-dropdown-item>
  59. </el-dropdown-menu>
  60. </el-dropdown>
  61. <div v-if="!userMessage" class="selectLoginOrRegistration">
  62. <span @click="cutLoginReg">登录</span>
  63. </div>
  64. <!-- 用户头像和用户名 -->
  65. <el-dropdown v-else style="margin-right: 16px" trigger="click" class="user">
  66. <span class="el-dropdown-link">
  67. <img
  68. class="headPhoto"
  69. :src="
  70. userMessage.image_url ? userMessage.image_url : '../../assets/login/Group3214.png'
  71. "
  72. />
  73. <span class="real_name">{{ userMessage.user_real_name }}</span>
  74. </span>
  75. <el-dropdown-menu slot="dropdown" class="user-menu">
  76. <el-dropdown-item @click.native="goPersonal">
  77. <img src="../../assets/login/project7.png" /><span>个人中心</span>
  78. </el-dropdown-item>
  79. <el-dropdown-item @click.native="QuitLogin">
  80. <img src="../../assets/login/Frame77.png" /><span>退出登录</span>
  81. </el-dropdown-item>
  82. </el-dropdown-menu>
  83. </el-dropdown>
  84. <!-- 消息 铃铛图片 -->
  85. <div class="message" @click="goPersonal">
  86. <img src="../../assets/login/Vector.png" />
  87. <span v-show="isNotRead" class="redDot"></span>
  88. </div>
  89. </div>
  90. </div>
  91. </template>
  92. <script>
  93. import { mapGetters } from 'vuex';
  94. import { getToken, removeToken } from '@/utils/auth';
  95. import { GetLanguageList } from '@/api/app';
  96. import { setI18nLang } from '@/utils/i18n';
  97. import { IsExistMyMessage_NotRead } from '@/api/user';
  98. export default {
  99. name: 'LayoutHeader',
  100. data() {
  101. return {
  102. activeIndex: '2', // 主导航索引
  103. LoginNavIndex: 0, // 下拉框导航索引
  104. projectName: '教学中心',
  105. projectList: [
  106. {
  107. id: 0,
  108. name: '教学中心',
  109. img: 'project1-1',
  110. selectImg: 'project1-1-1'
  111. },
  112. {
  113. id: 1,
  114. name: '教材管理系统',
  115. img: 'project1-1',
  116. selectImg: 'project1-1-1'
  117. },
  118. {
  119. id: 2,
  120. name: '教培中心',
  121. img: 'project2-2-2',
  122. selectImg: 'project2-2'
  123. },
  124. {
  125. id: 3,
  126. name: '教研中心',
  127. img: 'project6-6-6',
  128. selectImg: 'project6-6'
  129. },
  130. {
  131. id: 4,
  132. name: '考试中心',
  133. img: 'project6-6-6',
  134. selectImg: 'project6-6'
  135. },
  136. {
  137. id: 5,
  138. name: '学习中心',
  139. img: 'project4-4-4',
  140. selectImg: 'project4-4'
  141. },
  142. {
  143. id: 6,
  144. name: '个人中心',
  145. img: 'project3-3-3',
  146. selectImg: 'project3-3'
  147. }
  148. ],
  149. teacherProList: [
  150. // 普通教师
  151. {
  152. id: 0,
  153. name: '教学中心',
  154. img: 'project1'
  155. },
  156. {
  157. id: 2,
  158. name: '教培中心',
  159. img: 'project3'
  160. },
  161. {
  162. id: 3,
  163. name: '教研中心',
  164. img: 'project4'
  165. },
  166. {
  167. id: 5,
  168. name: '学习中心',
  169. img: 'project6'
  170. },
  171. {
  172. id: 6,
  173. name: '个人中心',
  174. img: 'project7'
  175. }
  176. ],
  177. stuProList: [
  178. {
  179. id: 0,
  180. name: '教学中心',
  181. img: 'project1'
  182. },
  183. {
  184. id: 5,
  185. name: '学习中心',
  186. img: 'project6'
  187. },
  188. {
  189. id: 6,
  190. name: '个人中心',
  191. img: 'project7'
  192. }
  193. ],
  194. userMessage: null,
  195. userShow: false,
  196. language_list: [],
  197. isNotRead: false,
  198. lang: ''
  199. };
  200. },
  201. computed: {
  202. ...mapGetters(['language_type'])
  203. },
  204. created() {
  205. let { token, isHas } = getToken();
  206. if (isHas) {
  207. this.userMessage = token;
  208. let popedom_code_list = this.userMessage.popedom_code_list;
  209. if (this.userMessage.user_type === 'TEACHER') {
  210. this.projectList = this.handleProList(popedom_code_list);
  211. } else if (this.userMessage.user_type === 'STUDENT') {
  212. this.projectList = this.stuProList;
  213. }
  214. this.projectList.forEach((item, index) => {
  215. if (item.id === 0) {
  216. this.LoginNavIndex = index;
  217. }
  218. });
  219. }
  220. this.getLangList();
  221. setInterval(() => {
  222. IsExistMyMessage_NotRead().then(({ is_exist }) => {
  223. this.isNotRead = JSON.parse(is_exist);
  224. });
  225. }, 10000);
  226. },
  227. methods: {
  228. // 切换导航
  229. handleSelect(key) {
  230. this.activeIndex = key;
  231. if (this.activeIndex === '1') {
  232. window.location.href = '/';
  233. }
  234. },
  235. // 切换项目
  236. handleCommand(command) {
  237. this.LoginNavIndex = command;
  238. if (!this.userMessage) {
  239. this.$message.warning('请先登录');
  240. this.projectName = '教学中心';
  241. window.location.href = '/';
  242. return;
  243. }
  244. this.projectName = this.projectList[command].name;
  245. let id = this.projectList[command].id;
  246. let url = '';
  247. if (id === 0) {
  248. // 教学管理系统
  249. url = `/GCLS-Learn/#/EnterSys`;
  250. } else if (id === 1) {
  251. // 教材管理系统
  252. url = `/GCLS-Book/#/EnterSys`;
  253. } else if (id === 2) {
  254. // 教培中心
  255. url = `/GCLS-TRC/#/EnterSys`;
  256. } else if (id === 3) {
  257. // 教研中心
  258. url = `/GCLS-TC/#/EnterSys`;
  259. } else if (id === 4) {
  260. // 考试中心
  261. url = `/GCLS-Test/#/EnterSys`;
  262. } else if (id === 5) {
  263. // 学习中心
  264. url = `/GCLS-LC/#/EnterSys`;
  265. } else {
  266. // 个人中心
  267. url = `/GCLS-Personal/#/EnterSys`;
  268. }
  269. window.location.href = url;
  270. },
  271. goPersonal() {
  272. window.location.href = `/GCLS-Personal/#/EnterSys`;
  273. },
  274. // 切换登录的注册
  275. cutLoginReg() {
  276. window.location.href = '/';
  277. },
  278. QuitLogin() {
  279. removeToken();
  280. this.userShow = false;
  281. this.userMessage = null;
  282. window.location.href = '/';
  283. },
  284. getLangList() {
  285. GetLanguageList().then(({ language_list }) => {
  286. this.language_list = language_list;
  287. let curLang = language_list.find(el => el.language_type === this.language_type);
  288. this.lang = curLang ? curLang.language_name : '中文';
  289. });
  290. },
  291. async changeLang({ language_name, language_type }) {
  292. this.lang = language_name;
  293. await setI18nLang(language_type);
  294. this.$router.go(0);
  295. },
  296. handleProList(list) {
  297. let projectList = [];
  298. if (list.length === 0) {
  299. let arr = [
  300. {
  301. id: 2,
  302. name: '教培中心',
  303. img: 'project2-2-2',
  304. selectImg: 'project2-2'
  305. },
  306. {
  307. id: 3,
  308. name: '教研中心',
  309. img: 'project6-6-6',
  310. selectImg: 'project6-6'
  311. },
  312. {
  313. id: 5,
  314. name: '学习中心',
  315. img: 'project4-4-4',
  316. selectImg: 'project4-4'
  317. },
  318. {
  319. id: 6,
  320. name: '个人中心',
  321. img: 'project3-3-3',
  322. selectImg: 'project3-3'
  323. }
  324. ];
  325. projectList = arr;
  326. }
  327. if (list.includes(2000001)) {
  328. projectList = JSON.parse(JSON.stringify(this.teacherProList));
  329. for (let i = 0; i < list.length; i++) {
  330. let code = list[i];
  331. if (code === 2000003) {
  332. projectList.push({
  333. id: 1,
  334. name: '教材管理系统',
  335. img: 'project1-1',
  336. selectImg: 'project1-1-1'
  337. });
  338. }
  339. if (code === 2000005) {
  340. projectList.push({
  341. id: 4,
  342. name: '考试中心',
  343. img: 'project5-5-5',
  344. selectImg: 'project5-5'
  345. });
  346. }
  347. }
  348. } else {
  349. for (let i = 0; i < list.length; i++) {
  350. let code = list[i];
  351. if (code === 2000002) {
  352. projectList.push({
  353. id: 0,
  354. name: '教学管理系统',
  355. img: 'project1-1-1',
  356. selectImg: 'project1-1'
  357. });
  358. } else if (code === 2000003) {
  359. projectList.push({
  360. id: 1,
  361. name: '教材管理系统',
  362. img: 'project1-1',
  363. selectImg: 'project1-1-1'
  364. });
  365. } else if (code === 2000004) {
  366. projectList.push({
  367. id: 2,
  368. name: '教师培训中心',
  369. img: 'project2-2-2',
  370. selectImg: 'project2-2'
  371. });
  372. } else if (code === 2000005) {
  373. projectList.push({
  374. id: 4,
  375. name: '考试中心',
  376. img: 'project5-5-5',
  377. selectImg: 'project5-5'
  378. });
  379. } else if (code === 2000006) {
  380. projectList.push({
  381. id: 3,
  382. name: '教研中心',
  383. img: 'project4-4-4',
  384. selectImg: 'project4-4'
  385. });
  386. }
  387. }
  388. projectList.push({
  389. id: 6,
  390. name: '个人中心',
  391. img: 'project3-3-3',
  392. selectImg: 'project3-3'
  393. });
  394. }
  395. // 排序
  396. for (let i = 0; i < projectList.length - 1; i++) {
  397. for (let j = 0; j < projectList.length - 1 - i; j++) {
  398. // 相邻元素两两对比,元素交换,大的元素交换到后面
  399. if (projectList[j].id > projectList[j + 1].id) {
  400. let temp = projectList[j];
  401. projectList[j] = projectList[j + 1];
  402. projectList[j + 1] = temp;
  403. }
  404. }
  405. }
  406. return projectList;
  407. }
  408. }
  409. };
  410. </script>
  411. <style lang="scss" scoped>
  412. .LoginNav {
  413. height: 74px;
  414. position: relative;
  415. display: flex;
  416. align-items: center;
  417. justify-content: space-between;
  418. box-sizing: border-box;
  419. padding: 0 24px;
  420. z-index: 999;
  421. background: #fff;
  422. box-shadow: 0 1px 0 rgba(0, 0, 0, 0.15);
  423. font-family: 'sourceR';
  424. .logo {
  425. display: flex;
  426. align-items: center;
  427. &-img {
  428. font-style: normal;
  429. font-weight: 600;
  430. font-size: 30px;
  431. font-variant: small-caps;
  432. color: #000;
  433. margin-right: 29px;
  434. line-height: 74px;
  435. }
  436. .el-menu-demo {
  437. background: rgba(0, 0, 0, 0);
  438. li {
  439. font-size: 16px;
  440. background: none;
  441. &:hover {
  442. background: none;
  443. }
  444. }
  445. }
  446. // 取消组件默认的样式
  447. .el-menu.el-menu--horizontal {
  448. border-bottom: none;
  449. }
  450. }
  451. .userName {
  452. display: flex;
  453. justify-content: flex-end;
  454. align-items: center;
  455. .seek {
  456. margin-right: 100px;
  457. position: relative;
  458. img {
  459. left: 10px;
  460. top: 11px;
  461. position: absolute;
  462. }
  463. }
  464. .flag {
  465. position: relative;
  466. top: 5px;
  467. }
  468. .headPhoto {
  469. width: 34px;
  470. height: 34px;
  471. border-radius: 50%;
  472. }
  473. .message {
  474. height: 100%;
  475. position: relative;
  476. display: flex;
  477. justify-content: center;
  478. align-items: center;
  479. margin-left: 23px;
  480. img {
  481. width: 18px;
  482. height: 24px;
  483. }
  484. .redDot {
  485. position: absolute;
  486. top: 2px;
  487. right: -2px;
  488. width: 6px;
  489. height: 6px;
  490. display: inline-block;
  491. background: red;
  492. border-radius: 50%;
  493. }
  494. }
  495. .selectLoginOrRegistration {
  496. display: flex;
  497. height: 32px;
  498. border: 1px solid #fff;
  499. box-sizing: border-box;
  500. border-radius: 4px;
  501. justify-content: space-evenly;
  502. align-items: center;
  503. padding: 0 16px;
  504. > span {
  505. cursor: pointer;
  506. font-size: 16px;
  507. color: #fff;
  508. }
  509. }
  510. .user {
  511. cursor: pointer;
  512. .real_name {
  513. display: inline-block;
  514. vertical-align: super;
  515. font-size: 20px;
  516. padding-left: 10px;
  517. }
  518. }
  519. }
  520. }
  521. </style>
  522. <style lang="scss">
  523. .LoginNav {
  524. .el-dropdown-menu__item {
  525. line-height: 40px;
  526. display: flex;
  527. justify-content: center;
  528. align-items: center;
  529. > span {
  530. font-family: 'sourceR';
  531. font-size: 16px;
  532. }
  533. }
  534. .el-menu--horizontal > .el-menu-item {
  535. height: 74px;
  536. line-height: 78px;
  537. }
  538. .el-dropdown-link {
  539. color: #000;
  540. }
  541. .el-dropdown {
  542. cursor: pointer;
  543. display: block;
  544. > span {
  545. font-family: 'sourceR';
  546. font-size: 16px;
  547. }
  548. }
  549. }
  550. .projectList {
  551. &.el-dropdown-menu__item {
  552. line-height: 40px;
  553. display: flex;
  554. align-items: center;
  555. color: #000;
  556. > img {
  557. top: 0;
  558. }
  559. > span {
  560. line-height: 40px;
  561. font-family: 'sourceR';
  562. }
  563. }
  564. &:hover {
  565. background: rgba(255, 153, 0, 0.1) !important;
  566. color: #000 !important;
  567. }
  568. &.menuActive {
  569. background: #f90;
  570. }
  571. }
  572. </style>
  573. <style lang="scss">
  574. .user-menu {
  575. width: 156px;
  576. .el-dropdown-menu__item {
  577. display: flex;
  578. align-items: center;
  579. color: #000;
  580. font-size: 16px;
  581. img {
  582. width: 24px;
  583. height: 24px;
  584. margin-right: 10px;
  585. }
  586. }
  587. }
  588. </style>