forked from liweijie/education
1 line
14 KiB
JSON
1 line
14 KiB
JSON
{"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\\SemesterBar.vue?vue&type=script&lang=js","dependencies":[{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\src\\layout\\components\\SemesterBar.vue","mtime":1787567993810},{"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:Ly8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KDQppbXBvcnQgeyBsaXN0U2VtZXN0ZXIsIHVwZGF0ZVNlbWVzdGVyIH0gZnJvbSAnQC9hcGkvdGVhY2hCdXNpbmVzcy9zZW1lc3RlcicNCg0KZXhwb3J0IGRlZmF1bHQgew0KICBuYW1lOiAnU2VtZXN0ZXJCYXInLA0KICBkYXRhKCkgew0KICAgIHJldHVybiB7DQogICAgICAvLyDlrabmnJ/liJfooajvvIjmjqXlj6PmlbDmja7vvIkNCiAgICAgIHNlbWVzdGVyTGlzdDogW10sDQogICAgICAvLyDlvZPliY3pgInkuK3nmoTlrabmnJ/lr7nosaENCiAgICAgIGFjdGl2ZVNlbWVzdGVyOiBudWxsLA0KICAgICAgdG9kYXk6IG5ldyBEYXRlKCksDQogICAgICBsb2FkaW5nOiBmYWxzZQ0KICAgIH0NCiAgfSwNCiAgY29tcHV0ZWQ6IHsNCiAgICBjdXJyZW50U2VtZXN0ZXJOYW1lKCkgew0KICAgICAgcmV0dXJuIHRoaXMuZ2V0U2VtZXN0ZXJOYW1lKHRoaXMuYWN0aXZlU2VtZXN0ZXIgPyB0aGlzLmFjdGl2ZVNlbWVzdGVyLm5kIDogJycpDQogICAgfSwNCiAgICBjdXJyZW50U2VtZXN0ZXJEYXRlKCkgew0KICAgICAgY29uc3QgaXRlbSA9IHRoaXMuYWN0aXZlU2VtZXN0ZXINCiAgICAgIGlmICghaXRlbSkgcmV0dXJuICcnDQogICAgICBjb25zdCBzdGFydCA9IHRoaXMuZm9ybWF0RGF0ZShpdGVtLmt4cnEpDQogICAgICBjb25zdCBlbmQgPSB0aGlzLmZvcm1hdERhdGUoaXRlbS5qc3JxKQ0KICAgICAgaWYgKCFzdGFydCAmJiAhZW5kKSByZXR1cm4gJycNCiAgICAgIHJldHVybiBgJHtzdGFydCB8fCAnPyd9IH4gJHtlbmQgfHwgJz8nfWANCiAgICB9LA0KICAgIHRvZGF5VGV4dCgpIHsNCiAgICAgIGNvbnN0IGQgPSB0aGlzLnRvZGF5DQogICAgICBjb25zdCBwYWQgPSBuID0+IChuIDwgMTAgPyAnMCcgKyBuIDogJycgKyBuKQ0KICAgICAgcmV0dXJuIGAke2QuZ2V0RnVsbFllYXIoKX0tJHtwYWQoZC5nZXRNb250aCgpICsgMSl9LSR7cGFkKGQuZ2V0RGF0ZSgpKX1gDQogICAgfSwNCiAgICB3ZWVrVGV4dCgpIHsNCiAgICAgIGNvbnN0IHdlZWtzID0gWyfmmJ/mnJ/ml6UnLCAn5pif5pyf5LiAJywgJ+aYn+acn+S6jCcsICfmmJ/mnJ/kuIknLCAn5pif5pyf5ZubJywgJ+aYn+acn+S6lCcsICfmmJ/mnJ/lha0nXQ0KICAgICAgcmV0dXJuIHdlZWtzW3RoaXMudG9kYXkuZ2V0RGF5KCldDQogICAgfQ0KICB9LA0KICBjcmVhdGVkKCkgew0KICAgIHRoaXMuZ2V0U2VtZXN0ZXJMaXN0KCkNCiAgfSwNCiAgbWV0aG9kczogew0KICAgIC8qKiDliqDovb3lrabmnJ/liJfooajvvIzpu5jorqTpgInkuK3lvZPliY3lrabmnJ/vvIhkcXhxPXRydWXvvInvvIzml6DlvZPliY3lrabmnJ/liJnpgInnrKzkuIDmnaEgKi8NCiAgICBnZXRTZW1lc3Rlckxpc3QoKSB7DQogICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlDQogICAgICBsaXN0U2VtZXN0ZXIoeyBwYWdlTnVtOiAxLCBwYWdlU2l6ZTogMTAwIH0pLnRoZW4ocmVzcG9uc2UgPT4gew0KICAgICAgICBjb25zdCBkYXRhID0gcmVzcG9uc2UuZGF0YSB8fCB7fQ0KICAgICAgICBjb25zdCBsaXN0ID0gZGF0YS5yZWNvcmRzIHx8IFtdDQogICAgICAgIHRoaXMuc2VtZXN0ZXJMaXN0ID0gbGlzdA0KICAgICAgICBjb25zdCBjdXJyZW50ID0gbGlzdC5maW5kKGkgPT4gaS5kcXhxKQ0KICAgICAgICB0aGlzLmFjdGl2ZVNlbWVzdGVyID0gY3VycmVudCB8fCAobGlzdFswXSA/IGxpc3RbMF0gOiBudWxsKQ0KICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZQ0KICAgICAgfSkuY2F0Y2goKCkgPT4gew0KICAgICAgICB0aGlzLnNlbWVzdGVyTGlzdCA9IFtdDQogICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlDQogICAgICB9KQ0KICAgIH0sDQogICAgLyoqIOagvOW8j+WMluWQjuerryBMb2NhbERhdGVUaW1l77yIMjAyNi0wMi0yM1QwMDowMDowMCAtPiAyMDI2LTAyLTIz77yJICovDQogICAgZm9ybWF0RGF0ZSh2YWx1ZSkgew0KICAgICAgaWYgKCF2YWx1ZSkgcmV0dXJuICcnDQogICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKS5zbGljZSgwLCAxMCkNCiAgICB9LA0KICAgIC8qKiDlrabmnJ/ku6Plj7cgLT4g5a2m5pyf5ZCN56ew77yI5aaCIDIwMjYwMSAtPiAyMDI25bm05pil5a2j5a2m5pyf77yJICovDQogICAgZ2V0U2VtZXN0ZXJOYW1lKG5kKSB7DQogICAgICBpZiAoIW5kKSByZXR1cm4gJycNCiAgICAgIGNvbnN0IHMgPSBTdHJpbmcobmQpDQogICAgICBjb25zdCB4biA9IHMuc2xpY2UoMCwgNCkNCiAgICAgIGNvbnN0IHhxID0gcy5zbGljZSg0KQ0KICAgICAgY29uc3QgbWFwID0geyAnMDEnOiAn5pil5a2j5a2m5pyfJywgJzAyJzogJ+Wkj+Wto+WtpuacnycsICcwMyc6ICfnp4vlraPlrabmnJ8nIH0NCiAgICAgIHJldHVybiB4biArICflubQnICsgKG1hcFt4cV0gfHwgJ+esrCcgKyB4cSArICflrabmnJ8nKQ0KICAgIH0sDQogICAgLyoqIOWIh+aNouWtpuacn++8muWwhuebruagh+Wtpuacn+iuvuS4uuW9k+WJjeWtpuacn++8jOWOn+W9k+WJjeWtpuacn+WPlua2iCAqLw0KICAgIGhhbmRsZVN3aXRjaChuZCkgew0KICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuYWN0aXZlU2VtZXN0ZXINCiAgICAgIGlmICghbmQgfHwgKGN1cnJlbnQgJiYgbmQgPT09IGN1cnJlbnQubmQpKSByZXR1cm4NCiAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuc2VtZXN0ZXJMaXN0LmZpbmQoaSA9PiBpLm5kID09PSBuZCkNCiAgICAgIGlmICghdGFyZ2V0KSByZXR1cm4NCiAgICAgIC8vIOW9k+WJjeW3suaYryLlvZPliY3lrabmnJ8i55qE5YW25LuW6K6w5b2V77yI6ZyA5Y+W5raI77yJDQogICAgICBjb25zdCBvdGhlcnMgPSB0aGlzLnNlbWVzdGVyTGlzdC5maWx0ZXIoaSA9PiBpLmRxeHEgJiYgaS5uZCAhPT0gbmQpDQoNCiAgICAgIHVwZGF0ZVNlbWVzdGVyKHsgLi4udGFyZ2V0LCBkcXhxOiB0cnVlIH0pLnRoZW4oKCkgPT4gew0KICAgICAgICAvLyDoi6XlrZjlnKjljp/lvZPliY3lrabmnJ/vvIzkuIDlubblj5bmtogNCiAgICAgICAgaWYgKG90aGVycy5sZW5ndGgpIHsNCiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwob3RoZXJzLm1hcChvID0+IHVwZGF0ZVNlbWVzdGVyKHsgLi4ubywgZHF4cTogZmFsc2UgfSkpKQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKQ0KICAgICAgfSkudGhlbigoKSA9PiB7DQogICAgICAgIHRoaXMuYWN0aXZlU2VtZXN0ZXIgPSB0YXJnZXQNCiAgICAgICAgdGhpcy4kbWVzc2FnZS5zdWNjZXNzKGDlt7LliIfmjaLoh7PvvJoke3RoaXMuZ2V0U2VtZXN0ZXJOYW1lKG5kKX1gKQ0KICAgICAgICAvLyDph43mlrDmi4nlj5bvvIzlkIzmraXmnIDmlrAgZHF4cSDnirbmgIENCiAgICAgICAgdGhpcy5nZXRTZW1lc3Rlckxpc3QoKQ0KICAgICAgICAvLyDpgJrnn6XlrabmnJ/nrqHnkIbpobXpnaLoh6rliqjliLfmlrANCiAgICAgICAgdGhpcy4kcm9vdC4kZW1pdCgnc2VtZXN0ZXItY3VycmVudC1jaGFuZ2VkJykNCiAgICAgIH0pLmNhdGNoKCgpID0+IHsNCiAgICAgICAgdGhpcy4kbWVzc2FnZS5lcnJvcign5YiH5o2i5a2m5pyf5aSx6LSl77yM6K+356iN5ZCO6YeN6K+VJykNCiAgICAgIH0pDQogICAgfQ0KICB9DQp9DQo="},{"version":3,"sources":["SemesterBar.vue"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6CA;;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;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"SemesterBar.vue","sourceRoot":"src/layout/components","sourcesContent":["<template>\r\n <div class=\"semester-bar\">\r\n <!-- 左:当前学期信息 -->\r\n <div class=\"semester-bar__item semester-bar__current\">\r\n <i class=\"el-icon-date\" />\r\n <span class=\"label\">当前学期</span>\r\n <span class=\"value\">{{ currentSemesterName }}</span>\r\n <span v-if=\"currentSemesterDate\" class=\"date\">{{ currentSemesterDate }}</span>\r\n </div>\r\n\r\n <span class=\"semester-bar__divider\" />\r\n\r\n <!-- 中:今日日期 -->\r\n <div class=\"semester-bar__item semester-bar__date\">\r\n <i class=\"el-icon-time\" />\r\n <span class=\"value\">{{ todayText }}</span>\r\n <span class=\"week\">{{ weekText }}</span>\r\n </div>\r\n\r\n <span class=\"semester-bar__divider\" />\r\n\r\n <!-- 右:学期切换下拉框 -->\r\n <div class=\"semester-bar__item semester-bar__switch\">\r\n <span class=\"label\">切换学期</span>\r\n <div class=\"semester-select-wrap\">\r\n <el-select\r\n :value=\"activeSemester ? activeSemester.nd : ''\"\r\n placeholder=\"请选择学期\"\r\n size=\"small\"\r\n class=\"semester-select\"\r\n @change=\"handleSwitch\"\r\n >\r\n <el-option\r\n v-for=\"item in semesterList\"\r\n :key=\"item.nd\"\r\n :label=\"getSemesterName(item.nd)\"\r\n :value=\"item.nd\"\r\n />\r\n </el-select>\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script>\r\nimport { listSemester, updateSemester } from '@/api/teachBusiness/semester'\r\n\r\nexport default {\r\n name: 'SemesterBar',\r\n data() {\r\n return {\r\n // 学期列表(接口数据)\r\n semesterList: [],\r\n // 当前选中的学期对象\r\n activeSemester: null,\r\n today: new Date(),\r\n loading: false\r\n }\r\n },\r\n computed: {\r\n currentSemesterName() {\r\n return this.getSemesterName(this.activeSemester ? this.activeSemester.nd : '')\r\n },\r\n currentSemesterDate() {\r\n const item = this.activeSemester\r\n if (!item) return ''\r\n const start = this.formatDate(item.kxrq)\r\n const end = this.formatDate(item.jsrq)\r\n if (!start && !end) return ''\r\n return `${start || '?'} ~ ${end || '?'}`\r\n },\r\n todayText() {\r\n const d = this.today\r\n const pad = n => (n < 10 ? '0' + n : '' + n)\r\n return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`\r\n },\r\n weekText() {\r\n const weeks = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六']\r\n return weeks[this.today.getDay()]\r\n }\r\n },\r\n created() {\r\n this.getSemesterList()\r\n },\r\n methods: {\r\n /** 加载学期列表,默认选中当前学期(dqxq=true),无当前学期则选第一条 */\r\n getSemesterList() {\r\n this.loading = true\r\n listSemester({ pageNum: 1, pageSize: 100 }).then(response => {\r\n const data = response.data || {}\r\n const list = data.records || []\r\n this.semesterList = list\r\n const current = list.find(i => i.dqxq)\r\n this.activeSemester = current || (list[0] ? list[0] : null)\r\n this.loading = false\r\n }).catch(() => {\r\n this.semesterList = []\r\n this.loading = false\r\n })\r\n },\r\n /** 格式化后端 LocalDateTime(2026-02-23T00:00:00 -> 2026-02-23) */\r\n formatDate(value) {\r\n if (!value) return ''\r\n return String(value).slice(0, 10)\r\n },\r\n /** 学期代号 -> 学期名称(如 202601 -> 2026年春季学期) */\r\n getSemesterName(nd) {\r\n if (!nd) return ''\r\n const s = String(nd)\r\n const xn = s.slice(0, 4)\r\n const xq = s.slice(4)\r\n const map = { '01': '春季学期', '02': '夏季学期', '03': '秋季学期' }\r\n return xn + '年' + (map[xq] || '第' + xq + '学期')\r\n },\r\n /** 切换学期:将目标学期设为当前学期,原当前学期取消 */\r\n handleSwitch(nd) {\r\n const current = this.activeSemester\r\n if (!nd || (current && nd === current.nd)) return\r\n const target = this.semesterList.find(i => i.nd === nd)\r\n if (!target) return\r\n // 当前已是\"当前学期\"的其他记录(需取消)\r\n const others = this.semesterList.filter(i => i.dqxq && i.nd !== nd)\r\n\r\n updateSemester({ ...target, dqxq: true }).then(() => {\r\n // 若存在原当前学期,一并取消\r\n if (others.length) {\r\n return Promise.all(others.map(o => updateSemester({ ...o, dqxq: false })))\r\n }\r\n return Promise.resolve()\r\n }).then(() => {\r\n this.activeSemester = target\r\n this.$message.success(`已切换至:${this.getSemesterName(nd)}`)\r\n // 重新拉取,同步最新 dqxq 状态\r\n this.getSemesterList()\r\n // 通知学期管理页面自动刷新\r\n this.$root.$emit('semester-current-changed')\r\n }).catch(() => {\r\n this.$message.error('切换学期失败,请稍后重试')\r\n })\r\n }\r\n }\r\n}\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n.semester-bar {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n gap: 10px;\r\n height: 36px;\r\n font-size: 13px;\r\n color: rgba(255, 255, 255, 0.85);\r\n user-select: none;\r\n\r\n &__item {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n height: 36px;\r\n padding: 0 16px;\r\n border-radius: 7px;\r\n background: rgba(255, 255, 255, 0.09);\r\n border: 1px solid rgba(255, 255, 255, 0.16);\r\n box-sizing: border-box;\r\n\r\n i {\r\n color: #fff;\r\n margin-right: 7px;\r\n font-size: 15px;\r\n display: flex;\r\n align-items: center;\r\n height: 100%;\r\n }\r\n\r\n .label,\r\n .value,\r\n .week,\r\n .date {\r\n display: flex;\r\n align-items: center;\r\n height: 100%;\r\n white-space: nowrap;\r\n }\r\n\r\n .label {\r\n color: rgba(255, 255, 255, 0.75);\r\n margin-right: 6px;\r\n }\r\n\r\n .value {\r\n font-weight: 600;\r\n color: #fff;\r\n }\r\n\r\n .date {\r\n margin-left: 10px;\r\n font-size: 12px;\r\n color: rgba(255, 255, 255, 0.75);\r\n letter-spacing: 0.5px;\r\n padding-left: 10px;\r\n border-left: 1px solid rgba(255, 255, 255, 0.25);\r\n }\r\n\r\n .week {\r\n margin-left: 8px;\r\n color: rgba(255, 255, 255, 0.75);\r\n }\r\n }\r\n\r\n &__current {\r\n margin-right: 0;\r\n }\r\n\r\n &__date {\r\n margin-right: 0;\r\n }\r\n\r\n /* 胶囊式布局后不再需要分隔线 */\r\n &__divider {\r\n display: none;\r\n }\r\n\r\n &__switch {\r\n background: transparent;\r\n border: none;\r\n padding: 0;\r\n border-radius: 0;\r\n height: 36px;\r\n\r\n /* 用一层定高 flex 容器包裹 select,彻底隔离其默认行高外溢 */\r\n .semester-select-wrap {\r\n display: flex;\r\n align-items: center;\r\n height: 36px;\r\n }\r\n\r\n .semester-select {\r\n width: 200px;\r\n }\r\n\r\n /* 关闭 select/input 外层默认行高,交给 flex 居中 */\r\n ::v-deep .el-select,\r\n ::v-deep .el-input {\r\n height: 36px;\r\n line-height: normal;\r\n }\r\n\r\n ::v-deep .el-input__inner {\r\n background: rgba(255, 255, 255, 0.12);\r\n border: 1px solid rgba(255, 255, 255, 0.35);\r\n color: #fff;\r\n border-radius: 7px;\r\n height: 36px;\r\n padding: 0 12px;\r\n display: flex;\r\n align-items: center;\r\n\r\n &::placeholder {\r\n color: rgba(255, 255, 255, 0.7);\r\n }\r\n }\r\n\r\n ::v-deep .el-input__inner:hover {\r\n border-color: rgba(255, 255, 255, 0.6);\r\n }\r\n\r\n ::v-deep .el-input__icon {\r\n color: rgba(255, 255, 255, 0.85);\r\n }\r\n }\r\n}\r\n</style>\r\n"]}]} |