Files
education/frontend/node_modules/.cache/vue-loader/8d4ddc79848056287b5dd9d9ac228d37.json
T

1 line
16 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"remainingRequest":"C:\\Users\\Admin\\Desktop\\education\\frontend\\node_modules\\vue-loader\\lib\\index.js??vue-loader-options!C:\\Users\\Admin\\Desktop\\education\\frontend\\src\\layout\\components\\Navbar.vue?vue&type=script&lang=js","dependencies":[{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\src\\layout\\components\\Navbar.vue","mtime":1787567993805},{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\node_modules\\cache-loader\\dist\\cjs.js","mtime":1787309791955},{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\node_modules\\babel-loader\\lib\\index.js","mtime":1787309793142},{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\node_modules\\cache-loader\\dist\\cjs.js","mtime":1787309791955},{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\node_modules\\vue-loader\\lib\\index.js","mtime":1787309793790}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:Ly8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KDQppbXBvcnQgeyBtYXBHZXR0ZXJzIH0gZnJvbSAndnVleCcNCmltcG9ydCBCcmVhZGNydW1iIGZyb20gJ0AvY29tcG9uZW50cy9CcmVhZGNydW1iJw0KaW1wb3J0IEhhbWJ1cmdlciBmcm9tICdAL2NvbXBvbmVudHMvSGFtYnVyZ2VyJw0KaW1wb3J0IFNjcmVlbmZ1bGwgZnJvbSAnQC9jb21wb25lbnRzL1NjcmVlbmZ1bGwnDQppbXBvcnQgU2VhcmNoIGZyb20gJ0AvY29tcG9uZW50cy9IZWFkZXJTZWFyY2gnDQppbXBvcnQgSGVhZGVyTm90aWNlIGZyb20gJy4vSGVhZGVyTm90aWNlJw0KDQpleHBvcnQgZGVmYXVsdCB7DQogIGNvbXBvbmVudHM6IHsNCiAgICBCcmVhZGNydW1iLA0KICAgIEhhbWJ1cmdlciwNCiAgICBTY3JlZW5mdWxsLA0KICAgIFNlYXJjaCwNCiAgICBIZWFkZXJOb3RpY2UNCiAgfSwNCiAgcHJvcHM6IHsNCiAgICAvLyBoZWFkZXJNb2RlPXRydWUg5pe277yMTmF2YmFyIOS9nOS4uumhtumDqOWFqOWuvSBIZWFkZXIg5Y+z5L6n5Yqf6IO95Yy677yM5LuF5riy5p+TIHJpZ2h0LW1lbnUNCiAgICBoZWFkZXJNb2RlOiB7DQogICAgICB0eXBlOiBCb29sZWFuLA0KICAgICAgZGVmYXVsdDogZmFsc2UNCiAgICB9DQogIH0sDQogIGRhdGEoKSB7DQogICAgcmV0dXJuIHt9DQogIH0sDQogIGNvbXB1dGVkOiB7DQogICAgLi4ubWFwR2V0dGVycyhbDQogICAgICAnc2lkZWJhcicsDQogICAgICAnYXZhdGFyJywNCiAgICAgICdkZXZpY2UnLA0KICAgICAgJ25pY2tOYW1lJywNCiAgICAgICdyb2xlcycNCiAgICBdKSwNCiAgICAvLyDnlKjmiLfop5LoibLmoIfnrb7vvJrmoLnmja4gcm9sZXMg5pWw57uE5pm66IO95pig5bCE5Li65Y+L5aW95paH5pysDQogICAgdXNlclJvbGVMYWJlbCgpIHsNCiAgICAgIGNvbnN0IHJvbGVNYXAgPSB7DQogICAgICAgIGFkbWluOiAn57O757uf566h55CG5ZGYJywNCiAgICAgICAgdGVhY2hlcjogJ+aVmeW4iOeUqOaItycsDQogICAgICAgIHN0dWRlbnQ6ICflrabnlJ/nlKjmiLcnLA0KICAgICAgICBST0xFX0RFRkFVTFQ6ICfmma7pgJrnlKjmiLcnDQogICAgICB9DQogICAgICBjb25zdCByID0gKHRoaXMucm9sZXMgJiYgdGhpcy5yb2xlc1swXSkgfHwgJycNCiAgICAgIC8vIOebtOaOpeWMuemFjeaIluWOu+mZpCBST0xFXyDliY3nvIDlkI7lho3ljLnphY0NCiAgICAgIHJldHVybiByb2xlTWFwW3JdIHx8IHJvbGVNYXBbU3RyaW5nKHIpLnJlcGxhY2UoL15ST0xFXy8sICcnKV0gfHwgJ+aVmeWtpueuoeeQhuezu+e7nycNCiAgICB9DQogIH0sDQogIG1ldGhvZHM6IHsNCiAgICB0b2dnbGVTaWRlQmFyKCkgew0KICAgICAgdGhpcy4kc3RvcmUuZGlzcGF0Y2goJ2FwcC90b2dnbGVTaWRlQmFyJykNCiAgICB9LA0KICAgIGhhbmRsZUNvbW1hbmQoY29tbWFuZCkgew0KICAgICAgLy8g6aKE55WZ77ya5LiL5ouJ6I+c5Y2VIGNvbW1hbmQg5LqL5Lu25YWl5Y+jDQogICAgfSwNCiAgICBvcGVuU2VhcmNoKCkgew0KICAgICAgaWYgKHRoaXMuJHJlZnMuc2VhcmNoUmVmICYmIHR5cGVvZiB0aGlzLiRyZWZzLnNlYXJjaFJlZi5jbGljayA9PT0gJ2Z1bmN0aW9uJykgew0KICAgICAgICB0aGlzLiRyZWZzLnNlYXJjaFJlZi5jbGljaygpDQogICAgICB9DQogICAgfSwNCiAgICBsb2NrU2NyZWVuKCkgew0KICAgICAgY29uc3QgY3VycmVudFBhdGggPSB0aGlzLiRyb3V0ZS5mdWxsUGF0aA0KICAgICAgdGhpcy4kc3RvcmUuZGlzcGF0Y2goJ2xvY2svbG9ja1NjcmVlbicsIGN1cnJlbnRQYXRoKS50aGVuKCgpID0+IHsNCiAgICAgICAgdGhpcy4kcm91dGVyLnB1c2goJy9sb2NrJykNCiAgICAgIH0pDQogICAgfSwNCiAgICBsb2dvdXQoKSB7DQogICAgICB0aGlzLiRjb25maXJtKCfnoa7lrprms6jplIDlubbpgIDlh7rns7vnu5/lkJfvvJ8nLCAn5o+Q56S6Jywgew0KICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogJ+ehruWumicsDQogICAgICAgIGNhbmNlbEJ1dHRvblRleHQ6ICflj5bmtognLA0KICAgICAgICB0eXBlOiAnd2FybmluZycNCiAgICAgIH0pLnRoZW4oKCkgPT4gew0KICAgICAgICB0aGlzLiRzdG9yZS5kaXNwYXRjaCgnTG9nT3V0JykudGhlbigoKSA9PiB7DQogICAgICAgICAgbG9jYXRpb24uaHJlZiA9ICcvaW5kZXgnDQogICAgICAgIH0pDQogICAgICB9KS5jYXRjaCgoKSA9PiB7fSkNCiAgICB9LA0KICB9DQp9DQo="},{"version":3,"sources":["Navbar.vue"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgDA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"Navbar.vue","sourceRoot":"src/layout/components","sourcesContent":["<template>\r\n <div class=\"navbar\" :class=\"[{ 'header-mode': headerMode }]\">\r\n <hamburger v-if=\"!headerMode\" id=\"hamburger-container\" :is-active=\"sidebar.opened\" class=\"hamburger-container\" @toggleClick=\"toggleSideBar\" />\r\n\r\n <breadcrumb v-if=\"!headerMode\" id=\"breadcrumb-container\" class=\"breadcrumb-container\" />\r\n <div class=\"right-menu\">\r\n <template v-if=\"device!=='mobile'\">\r\n <el-tooltip content=\"菜单搜索\" effect=\"dark\" placement=\"bottom\">\r\n <div id=\"header-search\" class=\"right-menu-item icon-btn\" @click=\"openSearch\">\r\n <search ref=\"searchRef\" />\r\n </div>\r\n </el-tooltip>\r\n\r\n <el-tooltip content=\"消息通知\" effect=\"dark\" placement=\"bottom\">\r\n <header-notice id=\"header-notice\" class=\"right-menu-item icon-btn\" />\r\n </el-tooltip>\r\n\r\n </template>\r\n\r\n <el-dropdown class=\"avatar-container right-menu-item\" trigger=\"click\" @command=\"handleCommand\">\r\n <div class=\"avatar-wrapper\">\r\n <div class=\"avatar-box\">\r\n <img :src=\"avatar\" class=\"user-avatar\">\r\n <span class=\"online-dot\" title=\"在线\"></span>\r\n </div>\r\n <div class=\"user-info\">\r\n <span class=\"user-nickname\">{{ nickName }}</span>\r\n <span class=\"user-role\">{{ userRoleLabel }}</span>\r\n </div>\r\n <i class=\"el-icon-arrow-down user-caret\"></i>\r\n </div>\r\n <el-dropdown-menu slot=\"dropdown\" class=\"user-dropdown-menu\">\r\n <router-link to=\"/user/profile\">\r\n <el-dropdown-item icon=\"el-icon-user\">个人中心</el-dropdown-item>\r\n </router-link>\r\n <el-dropdown-item icon=\"el-icon-lock\" @click.native=\"lockScreen\">\r\n <span>锁定屏幕</span>\r\n </el-dropdown-item>\r\n <el-dropdown-item divided icon=\"el-icon-switch-button\" @click.native=\"logout\">\r\n <span>退出登录</span>\r\n </el-dropdown-item>\r\n </el-dropdown-menu>\r\n </el-dropdown>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script>\r\nimport { mapGetters } from 'vuex'\r\nimport Breadcrumb from '@/components/Breadcrumb'\r\nimport Hamburger from '@/components/Hamburger'\r\nimport Screenfull from '@/components/Screenfull'\r\nimport Search from '@/components/HeaderSearch'\r\nimport HeaderNotice from './HeaderNotice'\r\n\r\nexport default {\r\n components: {\r\n Breadcrumb,\r\n Hamburger,\r\n Screenfull,\r\n Search,\r\n HeaderNotice\r\n },\r\n props: {\r\n // headerMode=true 时,Navbar 作为顶部全宽 Header 右侧功能区,仅渲染 right-menu\r\n headerMode: {\r\n type: Boolean,\r\n default: false\r\n }\r\n },\r\n data() {\r\n return {}\r\n },\r\n computed: {\r\n ...mapGetters([\r\n 'sidebar',\r\n 'avatar',\r\n 'device',\r\n 'nickName',\r\n 'roles'\r\n ]),\r\n // 用户角色标签:根据 roles 数组智能映射为友好文本\r\n userRoleLabel() {\r\n const roleMap = {\r\n admin: '系统管理员',\r\n teacher: '教师用户',\r\n student: '学生用户',\r\n ROLE_DEFAULT: '普通用户'\r\n }\r\n const r = (this.roles && this.roles[0]) || ''\r\n // 直接匹配或去除 ROLE_ 前缀后再匹配\r\n return roleMap[r] || roleMap[String(r).replace(/^ROLE_/, '')] || '教学管理系统'\r\n }\r\n },\r\n methods: {\r\n toggleSideBar() {\r\n this.$store.dispatch('app/toggleSideBar')\r\n },\r\n handleCommand(command) {\r\n // 预留:下拉菜单 command 事件入口\r\n },\r\n openSearch() {\r\n if (this.$refs.searchRef && typeof this.$refs.searchRef.click === 'function') {\r\n this.$refs.searchRef.click()\r\n }\r\n },\r\n lockScreen() {\r\n const currentPath = this.$route.fullPath\r\n this.$store.dispatch('lock/lockScreen', currentPath).then(() => {\r\n this.$router.push('/lock')\r\n })\r\n },\r\n logout() {\r\n this.$confirm('确定注销并退出系统吗?', '提示', {\r\n confirmButtonText: '确定',\r\n cancelButtonText: '取消',\r\n type: 'warning'\r\n }).then(() => {\r\n this.$store.dispatch('LogOut').then(() => {\r\n location.href = '/index'\r\n })\r\n }).catch(() => {})\r\n },\r\n }\r\n}\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.navbar.nav3 {\r\n .hamburger-container {\r\n display: none !important;\r\n }\r\n}\r\n\r\n.navbar {\r\n height: 50px;\r\n overflow: hidden;\r\n position: relative;\r\n background: #fff;\r\n box-shadow: 0 1px 4px rgba(0,21,41,.08);\r\n display: flex;\r\n align-items: center;\r\n // padding: 0 8px;\r\n box-sizing: border-box;\r\n\r\n &.header-mode {\r\n height: 100%;\r\n background: transparent;\r\n box-shadow: none;\r\n padding-right: 8px;\r\n\r\n /* 深色顶栏下右侧功能区图标与文字改为白色 */\r\n .right-menu-item {\r\n color: rgba(255, 255, 255, 0.95);\r\n\r\n &.icon-btn {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 38px;\r\n height: 38px;\r\n border-radius: 7px;\r\n background: rgba(255, 255, 255, 0.07);\r\n border: 1px solid rgba(255, 255, 255, 0.10);\r\n transition: background-color 0.18s ease, border-color 0.18s ease;\r\n cursor: pointer;\r\n\r\n &:hover {\r\n background: rgba(255, 255, 255, 0.15);\r\n border-color: rgba(255, 255, 255, 0.28);\r\n }\r\n\r\n &:active {\r\n background: rgba(255, 255, 255, 0.21);\r\n }\r\n\r\n .svg-icon {\r\n width: 18px;\r\n height: 18px;\r\n }\r\n }\r\n\r\n .el-dropdown-link {\r\n color: rgba(255, 255, 255, 0.95);\r\n }\r\n }\r\n\r\n /* 通过深选择器让 .icon-btn 样式同时穿透到子组件(如 HeaderNotice)的根元素 */\r\n ::v-deep .icon-btn {\r\n display: inline-flex !important;\r\n align-items: center;\r\n justify-content: center;\r\n width: 38px;\r\n height: 38px;\r\n border-radius: 7px;\r\n background: rgba(255, 255, 255, 0.07);\r\n border: 1px solid rgba(255, 255, 255, 0.10);\r\n transition: background-color 0.18s ease, border-color 0.18s ease;\r\n cursor: pointer;\r\n\r\n &:hover {\r\n background: rgba(255, 255, 255, 0.15);\r\n border-color: rgba(255, 255, 255, 0.28);\r\n }\r\n\r\n &:active {\r\n background: rgba(255, 255, 255, 0.21);\r\n }\r\n\r\n .svg-icon {\r\n width: 18px;\r\n height: 18px;\r\n color: #fff;\r\n }\r\n }\r\n\r\n .avatar-container .avatar-wrapper .user-nickname {\r\n color: #fff;\r\n }\r\n }\r\n\r\n .hamburger-container {\r\n line-height: 46px;\r\n height: 100%;\r\n cursor: pointer;\r\n transition: background .3s;\r\n -webkit-tap-highlight-color:transparent;\r\n display: flex;\r\n align-items: center;\r\n flex-shrink: 0;\r\n margin-right: 8px;\r\n\r\n &:hover {\r\n background: rgba(0, 0, 0, .025)\r\n }\r\n }\r\n\r\n .breadcrumb-container {\r\n flex-shrink: 0;\r\n }\r\n\r\n .topmenu-container {\r\n position: absolute;\r\n left: 50px;\r\n }\r\n\r\n .right-menu {\r\n height: 100%;\r\n line-height: 50px;\r\n display: flex;\r\n align-items: center;\r\n margin-left: auto;\r\n gap: 6px;\r\n\r\n &:focus {\r\n outline: none;\r\n }\r\n\r\n .right-menu-item {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n height: 100%;\r\n font-size: 18px;\r\n color: #5a5e66;\r\n vertical-align: text-bottom;\r\n padding: 0;\r\n line-height: normal;\r\n\r\n &.icon-btn {\r\n position: relative;\r\n }\r\n\r\n .el-dropdown-link {\r\n font-size: 14px;\r\n color: #5a5e66;\r\n cursor: pointer;\r\n }\r\n }\r\n\r\n .avatar-container {\r\n margin-right: 0;\r\n padding: 0 6px 0 10px;\r\n height: 100%;\r\n border-radius: 8px;\r\n cursor: pointer;\r\n\r\n &.is-active .user-caret {\r\n transform: rotate(180deg);\r\n }\r\n\r\n .avatar-wrapper {\r\n display: flex;\r\n align-items: center;\r\n position: relative;\r\n gap: 10px;\r\n\r\n .avatar-box {\r\n position: relative;\r\n width: 36px;\r\n height: 36px;\r\n border-radius: 8px;\r\n padding: 2px;\r\n background: rgba(255, 255, 255, 0.92);\r\n box-shadow: 0 1px 4px rgba(0, 0, 0, 0.12);\r\n flex-shrink: 0;\r\n }\r\n\r\n .user-avatar {\r\n cursor: pointer;\r\n width: 100%;\r\n height: 100%;\r\n border-radius: 6px;\r\n object-fit: cover;\r\n background: var(--edu-green-light);\r\n display: block;\r\n }\r\n\r\n .online-dot {\r\n position: absolute;\r\n right: 0;\r\n bottom: 0;\r\n width: 10px;\r\n height: 10px;\r\n border-radius: 50%;\r\n background: #2ecc71;\r\n border: 2px solid #fff;\r\n box-shadow: 0 0 0 0 rgba(46, 204, 113, 0.6);\r\n animation: onlinePulse 2s infinite;\r\n }\r\n\r\n @keyframes onlinePulse {\r\n 0% { box-shadow: 0 0 0 0 rgba(46, 204, 113, 0.55); }\r\n 70% { box-shadow: 0 0 0 6px rgba(46, 204, 113, 0); }\r\n 100% { box-shadow: 0 0 0 0 rgba(46, 204, 113, 0); }\r\n }\r\n\r\n .user-info {\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: center;\r\n line-height: 1.15;\r\n min-width: 0;\r\n }\r\n\r\n .user-nickname {\r\n font-size: 14px;\r\n font-weight: 600;\r\n color: #fff;\r\n max-width: 120px;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n letter-spacing: 0.3px;\r\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.15);\r\n }\r\n\r\n .user-role {\r\n font-size: 11px;\r\n color: rgba(255, 255, 255, 0.7);\r\n margin-top: 2px;\r\n letter-spacing: 0.2px;\r\n }\r\n\r\n .user-caret {\r\n font-size: 12px;\r\n color: rgba(255, 255, 255, 0.85);\r\n margin-left: 2px;\r\n transition: transform 0.2s ease;\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\n/* 用户下拉菜单 - 提升视觉品质(非 scoped,因为 el-dropdown-menu 渲染到 body) */\r\n.user-dropdown-menu {\r\n border-radius: 10px !important;\r\n border: 1px solid #ebeef5 !important;\r\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12), 0 2px 6px rgba(0, 0, 0, 0.06) !important;\r\n padding: 6px !important;\r\n overflow: hidden;\r\n\r\n .el-dropdown-menu__item {\r\n border-radius: 6px;\r\n font-size: 13px;\r\n color: #303133;\r\n line-height: 36px;\r\n padding: 0 14px;\r\n transition: background 0.2s, color 0.2s;\r\n\r\n i {\r\n font-size: 14px;\r\n color: var(--edu-green-primary);\r\n margin-right: 8px;\r\n }\r\n\r\n &:not(.is-disabled):hover,\r\n &:not(.is-disabled):focus {\r\n background: var(--edu-green-light);\r\n color: var(--edu-green-primary);\r\n outline: none;\r\n }\r\n }\r\n}\r\n</style>\r\n"]}]}