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=style&index=0&id=e73c8bc4&scoped=true&lang=scss","dependencies":[{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\src\\layout\\components\\SemesterBar.vue","mtime":1787567993810},{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\node_modules\\css-loader\\dist\\cjs.js","mtime":1787309792478},{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\node_modules\\vue-loader\\lib\\loaders\\stylePostLoader.js","mtime":1787309794547},{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\node_modules\\postcss-loader\\src\\index.js","mtime":1787309793084},{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\node_modules\\sass-loader\\dist\\cjs.js","mtime":1787309791955},{"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:CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKDQouc2VtZXN0ZXItYmFyIHsNCiAgZGlzcGxheTogZmxleDsNCiAgYWxpZ24taXRlbXM6IGNlbnRlcjsNCiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7DQogIGdhcDogMTBweDsNCiAgaGVpZ2h0OiAzNnB4Ow0KICBmb250LXNpemU6IDEzcHg7DQogIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuODUpOw0KICB1c2VyLXNlbGVjdDogbm9uZTsNCg0KICAmX19pdGVtIHsNCiAgICBkaXNwbGF5OiBmbGV4Ow0KICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7DQogICAgaGVpZ2h0OiAzNnB4Ow0KICAgIHBhZGRpbmc6IDAgMTZweDsNCiAgICBib3JkZXItcmFkaXVzOiA3cHg7DQogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA5KTsNCiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTYpOw0KICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7DQoNCiAgICBpIHsNCiAgICAgIGNvbG9yOiAjZmZmOw0KICAgICAgbWFyZ2luLXJpZ2h0OiA3cHg7DQogICAgICBmb250LXNpemU6IDE1cHg7DQogICAgICBkaXNwbGF5OiBmbGV4Ow0KICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsNCiAgICAgIGhlaWdodDogMTAwJTsNCiAgICB9DQoNCiAgICAubGFiZWwsDQogICAgLnZhbHVlLA0KICAgIC53ZWVrLA0KICAgIC5kYXRlIHsNCiAgICAgIGRpc3BsYXk6IGZsZXg7DQogICAgICBhbGlnbi1pdGVtczogY2VudGVyOw0KICAgICAgaGVpZ2h0OiAxMDAlOw0KICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsNCiAgICB9DQoNCiAgICAubGFiZWwgew0KICAgICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43NSk7DQogICAgICBtYXJnaW4tcmlnaHQ6IDZweDsNCiAgICB9DQoNCiAgICAudmFsdWUgew0KICAgICAgZm9udC13ZWlnaHQ6IDYwMDsNCiAgICAgIGNvbG9yOiAjZmZmOw0KICAgIH0NCg0KICAgIC5kYXRlIHsNCiAgICAgIG1hcmdpbi1sZWZ0OiAxMHB4Ow0KICAgICAgZm9udC1zaXplOiAxMnB4Ow0KICAgICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43NSk7DQogICAgICBsZXR0ZXItc3BhY2luZzogMC41cHg7DQogICAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7DQogICAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yNSk7DQogICAgfQ0KDQogICAgLndlZWsgew0KICAgICAgbWFyZ2luLWxlZnQ6IDhweDsNCiAgICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNzUpOw0KICAgIH0NCiAgfQ0KDQogICZfX2N1cnJlbnQgew0KICAgIG1hcmdpbi1yaWdodDogMDsNCiAgfQ0KDQogICZfX2RhdGUgew0KICAgIG1hcmdpbi1yaWdodDogMDsNCiAgfQ0KDQogIC8qIOiDtuWbiuW8j+W4g+WxgOWQjuS4jeWGjemcgOimgeWIhumalOe6vyAqLw0KICAmX19kaXZpZGVyIHsNCiAgICBkaXNwbGF5OiBub25lOw0KICB9DQoNCiAgJl9fc3dpdGNoIHsNCiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsNCiAgICBib3JkZXI6IG5vbmU7DQogICAgcGFkZGluZzogMDsNCiAgICBib3JkZXItcmFkaXVzOiAwOw0KICAgIGhlaWdodDogMzZweDsNCg0KICAgIC8qIOeUqOS4gOWxguWumumrmCBmbGV4IOWuueWZqOWMheijuSBzZWxlY3TvvIzlvbvlupXpmpTnprvlhbbpu5jorqTooYzpq5jlpJbmuqIgKi8NCiAgICAuc2VtZXN0ZXItc2VsZWN0LXdyYXAgew0KICAgICAgZGlzcGxheTogZmxleDsNCiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQogICAgICBoZWlnaHQ6IDM2cHg7DQogICAgfQ0KDQogICAgLnNlbWVzdGVyLXNlbGVjdCB7DQogICAgICB3aWR0aDogMjAwcHg7DQogICAgfQ0KDQogICAgLyog5YWz6ZetIHNlbGVjdC9pbnB1dCDlpJblsYLpu5jorqTooYzpq5jvvIzkuqTnu5kgZmxleCDlsYXkuK0gKi8NCiAgICA6OnYtZGVlcCAuZWwtc2VsZWN0LA0KICAgIDo6di1kZWVwIC5lbC1pbnB1dCB7DQogICAgICBoZWlnaHQ6IDM2cHg7DQogICAgICBsaW5lLWhlaWdodDogbm9ybWFsOw0KICAgIH0NCg0KICAgIDo6di1kZWVwIC5lbC1pbnB1dF9faW5uZXIgew0KICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKTsNCiAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4zNSk7DQogICAgICBjb2xvcjogI2ZmZjsNCiAgICAgIGJvcmRlci1yYWRpdXM6IDdweDsNCiAgICAgIGhlaWdodDogMzZweDsNCiAgICAgIHBhZGRpbmc6IDAgMTJweDsNCiAgICAgIGRpc3BsYXk6IGZsZXg7DQogICAgICBhbGlnbi1pdGVtczogY2VudGVyOw0KDQogICAgICAmOjpwbGFjZWhvbGRlciB7DQogICAgICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNyk7DQogICAgICB9DQogICAgfQ0KDQogICAgOjp2LWRlZXAgLmVsLWlucHV0X19pbm5lcjpob3ZlciB7DQogICAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42KTsNCiAgICB9DQoNCiAgICA6OnYtZGVlcCAuZWwtaW5wdXRfX2ljb24gew0KICAgICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC44NSk7DQogICAgfQ0KICB9DQp9DQo="},{"version":3,"sources":["SemesterBar.vue"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;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"]}]} |