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

1 line
32 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\\views\\teachOffice\\elective\\index.vue?vue&type=script&lang=js","dependencies":[{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\src\\views\\teachOffice\\elective\\index.vue","mtime":1787567993848},{"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:Ly8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KDQppbXBvcnQgew0KICBsaXN0RWxlY3RpdmUsDQogIGJhdGNoT3BlbkVsZWN0aXZlLA0KICBiYXRjaENhbmNlbE9wZW5FbGVjdGl2ZSwNCiAgYmF0Y2hTdG9wRWxlY3RpdmUsDQogIGV4cG9ydEVsZWN0aXZlTGlzdCwNCiAgZXhwb3J0RWxlY3RpdmVTdHVkZW50c0V4Y2VsLA0KICBleHBvcnRFbGVjdGl2ZVN0dWRlbnRzV29yZA0KfSBmcm9tICdAL2FwaS90ZWFjaE9mZmljZS9lbGVjdGl2ZScNCmltcG9ydCB7IHNhdmVBcyB9IGZyb20gJ2ZpbGUtc2F2ZXInDQoNCmV4cG9ydCBkZWZhdWx0IHsNCiAgbmFtZTogJ0VsZWN0aXZlJywNCiAgZGF0YSgpIHsNCiAgICByZXR1cm4gew0KICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT0g5LiL5ouJ6YCJ6aG5ID09PT09PT09PT09PT09PT09PT09DQogICAgICBzdGF0dXNPcHRpb25zOiBbJ+aLn+WIticsICflvIDmlL7miqXlkI0nLCAn5YGc5q2i5oql5ZCNJywgJ+W3suW8gOivviddLA0KICAgICAgcHhjY09wdGlvbnM6IFsn5pegJywgJ+acrOenkScsICfnoZXlo6snLCAn5Y2a5aOrJ10sDQoNCiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09IOafpeivouadoeS7tiA9PT09PT09PT09PT09PT09PT09PQ0KICAgICAgc2VhcmNoRm9ybTogew0KICAgICAgICBqczogJycsDQogICAgICAgIGtiY25qOiAnJywNCiAgICAgICAgeHhrenQ6ICcnLA0KICAgICAgICBrY2ttbWM6ICcnLA0KICAgICAgICB4eGJtYzogJycsDQogICAgICAgIHB4Y2M6ICcnDQogICAgICB9LA0KDQogICAgICAvLyA9PT09PT09PT09PT09PT09PT09PSDmlbDmja7ooajmoLwgPT09PT09PT09PT09PT09PT09PT0NCiAgICAgIHRhYmxlRGF0YTogW10sDQogICAgICB0b3RhbDogMCwNCiAgICAgIGxvYWRpbmc6IGZhbHNlLA0KICAgICAgc2VsZWN0ZWRSb3dzOiBbXSwNCg0KICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT0g5paH5Lu25LiK5LygID09PT09PT09PT09PT09PT09PT09DQogICAgICBzZWxlY3RlZEZpbGU6IG51bGwsDQoNCiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09IOaWsOW7uumAieS/ruivvuW8ueeqlyA9PT09PT09PT09PT09PT09PT09PQ0KICAgICAgZGlhbG9nVmlzaWJsZTogZmFsc2UsDQogICAgICBmb3JtOiB7DQogICAgICAgIGtjbWM6ICcnLA0KICAgICAgICBqczogJycsDQogICAgICAgIGpjOiAnJywNCiAgICAgICAganhjZDogJycsDQogICAgICAgIGpoc3hzOiAwLA0KICAgICAgICB5eHN4czogMCwNCiAgICAgICAgeGY6IDAsDQogICAgICAgIGpoOiAwDQogICAgICB9LA0KICAgICAgcnVsZXM6IHsNCiAgICAgICAga2NtYzogW3sgcmVxdWlyZWQ6IHRydWUsIG1lc3NhZ2U6ICfor7fovpPlhaXor77nqIvlkI3np7AnLCB0cmlnZ2VyOiAnYmx1cicgfV0sDQogICAgICAgIGpzOiBbeyByZXF1aXJlZDogdHJ1ZSwgbWVzc2FnZTogJ+ivt+i+k+WFpeWunuaWveaVmeWRmCcsIHRyaWdnZXI6ICdibHVyJyB9XQ0KICAgICAgfSwNCg0KICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT0g5YiG6aG1ID09PT09PT09PT09PT09PT09PT09DQogICAgICBjdXJyZW50UGFnZTogMSwNCiAgICAgIHBhZ2VTaXplOiAyMA0KICAgIH0NCiAgfSwNCiAgY29tcHV0ZWQ6IHsNCiAgICBmaWxlTmFtZSgpIHsNCiAgICAgIHJldHVybiAodGhpcy5zZWxlY3RlZEZpbGUgJiYgdGhpcy5zZWxlY3RlZEZpbGUubmFtZSkgfHwgJ+acqumAieaLqeS7u+S9leaWh+S7ticNCiAgICB9DQogIH0sDQogIGNyZWF0ZWQoKSB7DQogICAgdGhpcy5sb2FkTGlzdCgpDQogIH0sDQogIG1ldGhvZHM6IHsNCiAgICAvLyDnu4Too4Xmn6Xor6Lov4fmu6TmnaHku7bvvIjliJfooajkuI7lr7zlh7rlhbHnlKjvvIzlr7zlh7rkuI3lkKvliIbpobXlj4LmlbDvvIkNCiAgICBidWlsZEZpbHRlcigpIHsNCiAgICAgIGNvbnN0IHEgPSB7fQ0KICAgICAgaWYgKHRoaXMuc2VhcmNoRm9ybS5qcykgcS5qeXhtID0gdGhpcy5zZWFyY2hGb3JtLmpzDQogICAgICBpZiAodGhpcy5zZWFyY2hGb3JtLmtiY25qKSBxLmt4YmNuaiA9IHRoaXMuc2VhcmNoRm9ybS5rYmNuag0KICAgICAgaWYgKHRoaXMuc2VhcmNoRm9ybS5rY2ttbWMpIHEua21jID0gdGhpcy5zZWFyY2hGb3JtLmtja21tYw0KICAgICAgaWYgKHRoaXMuc2VhcmNoRm9ybS54eGJtYykgcS54eGJtYyA9IHRoaXMuc2VhcmNoRm9ybS54eGJtYw0KICAgICAgaWYgKHRoaXMuc2VhcmNoRm9ybS54eGt6dCkgcS54a3p0ID0gdGhpcy5zZWFyY2hGb3JtLnh4a3p0DQogICAgICBpZiAodGhpcy5zZWFyY2hGb3JtLnB4Y2MpIHEucHhjYyA9IHRoaXMuc2VhcmNoRm9ybS5weGNjDQogICAgICByZXR1cm4gcQ0KICAgIH0sDQoNCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PSDmn6Xor6IgPT09PT09PT09PT09PT09PT09PT0NCiAgICBoYW5kbGVRdWVyeSgpIHsNCiAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxDQogICAgICB0aGlzLmxvYWRMaXN0KCkNCiAgICB9LA0KICAgIGxvYWRMaXN0KCkgew0KICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZQ0KICAgICAgY29uc3QgcGFyYW1zID0gT2JqZWN0LmFzc2lnbih7IHBhZ2VOdW06IHRoaXMuY3VycmVudFBhZ2UsIHBhZ2VTaXplOiB0aGlzLnBhZ2VTaXplIH0sIHRoaXMuYnVpbGRGaWx0ZXIoKSkNCiAgICAgIGxpc3RFbGVjdGl2ZShwYXJhbXMpDQogICAgICAgIC50aGVuKHJlcyA9PiB7DQogICAgICAgICAgY29uc3QgZGF0YSA9IChyZXMgJiYgcmVzLmRhdGEpIHx8IHt9DQogICAgICAgICAgdGhpcy50YWJsZURhdGEgPSBkYXRhLnJlY29yZHMgfHwgW10NCiAgICAgICAgICB0aGlzLnRvdGFsID0gZGF0YS50b3RhbCB8fCAwDQogICAgICAgIH0pDQogICAgICAgIC5maW5hbGx5KCgpID0+IHsNCiAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZQ0KICAgICAgICB9KQ0KICAgIH0sDQoNCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PSDlr7zlh7ogPT09PT09PT09PT09PT09PT09PT0NCiAgICBoYW5kbGVEb3dubG9hZExpc3QoKSB7DQogICAgICBleHBvcnRFbGVjdGl2ZUxpc3QodGhpcy5idWlsZEZpbHRlcigpKQ0KICAgICAgICAudGhlbihibG9iID0+IHsNCiAgICAgICAgICBzYXZlQXMoYmxvYiwgJ+mAieS/ruePreWIl+ihqC54bHN4JykNCiAgICAgICAgICB0aGlzLiRtZXNzYWdlLnN1Y2Nlc3MoJ+mAieS/ruePreWIl+ihqOW3suS4i+i9vScpDQogICAgICAgIH0pDQogICAgICAgIC5jYXRjaCgoKSA9PiB7fSkNCiAgICB9LA0KICAgIGhhbmRsZURvd25sb2FkV29yZCgpIHsNCiAgICAgIGNvbnN0IGJoTGlzdCA9IHRoaXMuc2VsZWN0ZWRSb3dzLm1hcChyb3cgPT4gcm93LmJoKQ0KICAgICAgaWYgKGJoTGlzdC5sZW5ndGggPT09IDApIHsNCiAgICAgICAgdGhpcy4kbWVzc2FnZS53YXJuaW5nKCfor7flhYjpgInmi6npgInkv67nj60nKQ0KICAgICAgICByZXR1cm4NCiAgICAgIH0NCiAgICAgIGV4cG9ydEVsZWN0aXZlU3R1ZGVudHNXb3JkKGJoTGlzdCkNCiAgICAgICAgLnRoZW4oYmxvYiA9PiB7DQogICAgICAgICAgc2F2ZUFzKGJsb2IsICfpgInkv67nj63lrablkZjlkI3ljZUuZG9jeCcpDQogICAgICAgICAgdGhpcy4kbWVzc2FnZS5zdWNjZXNzKCfpgInkv67nj63lrablkZjlkI3ljZVXb3Jk5bey5LiL6L29JykNCiAgICAgICAgfSkNCiAgICAgICAgLmNhdGNoKCgpID0+IHt9KQ0KICAgIH0sDQogICAgaGFuZGxlRG93bmxvYWRFeGNlbCgpIHsNCiAgICAgIGNvbnN0IGJoTGlzdCA9IHRoaXMuc2VsZWN0ZWRSb3dzLm1hcChyb3cgPT4gcm93LmJoKQ0KICAgICAgaWYgKGJoTGlzdC5sZW5ndGggPT09IDApIHsNCiAgICAgICAgdGhpcy4kbWVzc2FnZS53YXJuaW5nKCfor7flhYjpgInmi6npgInkv67nj60nKQ0KICAgICAgICByZXR1cm4NCiAgICAgIH0NCiAgICAgIGV4cG9ydEVsZWN0aXZlU3R1ZGVudHNFeGNlbChiaExpc3QpDQogICAgICAgIC50aGVuKGJsb2IgPT4gew0KICAgICAgICAgIHNhdmVBcyhibG9iLCAn6YCJ5L+u54+t5a2m5ZGY5ZCN5Y2VLnhsc3gnKQ0KICAgICAgICAgIHRoaXMuJG1lc3NhZ2Uuc3VjY2Vzcygn6YCJ5L+u54+t5a2m5ZGY5ZCN5Y2VRXhjZWzlt7LkuIvovb0nKQ0KICAgICAgICB9KQ0KICAgICAgICAuY2F0Y2goKCkgPT4ge30pDQogICAgfSwNCg0KICAgIC8vID09PT09PT09PT09PT09PT09PT09IOaTjeS9nOaMiemSriA9PT09PT09PT09PT09PT09PT09PQ0KICAgIGhhbmRsZU9wZW5FYXJseSgpIHsNCiAgICAgIGNvbnN0IGJoTGlzdCA9IHRoaXMuc2VsZWN0ZWRSb3dzLm1hcChyb3cgPT4gcm93LmJoKQ0KICAgICAgaWYgKGJoTGlzdC5sZW5ndGggPT09IDApIHsNCiAgICAgICAgdGhpcy4kbWVzc2FnZS53YXJuaW5nKCfor7flhYjpgInmi6npgInkv67nj60nKQ0KICAgICAgICByZXR1cm4NCiAgICAgIH0NCiAgICAgIGJhdGNoT3BlbkVsZWN0aXZlKGJoTGlzdCkNCiAgICAgICAgLnRoZW4oKCkgPT4gew0KICAgICAgICAgIHRoaXMuJG1lc3NhZ2Uuc3VjY2Vzcygn5omA6YCJ54+t5bey5byA5pS+5oql5ZCNJykNCiAgICAgICAgICB0aGlzLmxvYWRMaXN0KCkNCiAgICAgICAgfSkNCiAgICAgICAgLmNhdGNoKCgpID0+IHt9KQ0KICAgIH0sDQogICAgaGFuZGxlQ2FuY2VsRWFybHkoKSB7DQogICAgICBjb25zdCBiaExpc3QgPSB0aGlzLnNlbGVjdGVkUm93cy5tYXAocm93ID0+IHJvdy5iaCkNCiAgICAgIGlmIChiaExpc3QubGVuZ3RoID09PSAwKSB7DQogICAgICAgIHRoaXMuJG1lc3NhZ2Uud2FybmluZygn6K+35YWI6YCJ5oup6YCJ5L+u54+tJykNCiAgICAgICAgcmV0dXJuDQogICAgICB9DQogICAgICBiYXRjaENhbmNlbE9wZW5FbGVjdGl2ZShiaExpc3QpDQogICAgICAgIC50aGVuKCgpID0+IHsNCiAgICAgICAgICB0aGlzLiRtZXNzYWdlLnN1Y2Nlc3MoJ+aJgOmAieePreW3suWPlua2iOW8gOaUvuaKpeWQjScpDQogICAgICAgICAgdGhpcy5sb2FkTGlzdCgpDQogICAgICAgIH0pDQogICAgICAgIC5jYXRjaCgoKSA9PiB7fSkNCiAgICB9LA0KICAgIGhhbmRsZVN0b3BTaWdudXAoKSB7DQogICAgICBjb25zdCBiaExpc3QgPSB0aGlzLnNlbGVjdGVkUm93cy5tYXAocm93ID0+IHJvdy5iaCkNCiAgICAgIGlmIChiaExpc3QubGVuZ3RoID09PSAwKSB7DQogICAgICAgIHRoaXMuJG1lc3NhZ2Uud2FybmluZygn6K+35YWI6YCJ5oup6YCJ5L+u54+tJykNCiAgICAgICAgcmV0dXJuDQogICAgICB9DQogICAgICBiYXRjaFN0b3BFbGVjdGl2ZShiaExpc3QpDQogICAgICAgIC50aGVuKCgpID0+IHsNCiAgICAgICAgICB0aGlzLiRtZXNzYWdlLnN1Y2Nlc3MoJ+W3suaJuemHj+WBnOatouaKpeWQjScpDQogICAgICAgICAgdGhpcy5sb2FkTGlzdCgpDQogICAgICAgIH0pDQogICAgICAgIC5jYXRjaCgoKSA9PiB7fSkNCiAgICB9LA0KICAgIGhhbmRsZVJldmVyc2VSYW5nZSgpIHsNCiAgICAgIHRoaXMuJG1lc3NhZ2Uud2FybmluZygn5ZCO56uv5pqC5pyq5o+Q5L6b6K+l5o6l5Y+jJykNCiAgICB9LA0KICAgIGhhbmRsZURvd25sb2FkVGVtcGxhdGUoKSB7DQogICAgICB0aGlzLiRtZXNzYWdlLndhcm5pbmcoJ+WQjuerr+aaguacquaPkOS+m+ivpeaOpeWPoycpDQogICAgfSwNCg0KICAgIC8vID09PT09PT09PT09PT09PT09PT09IOaWh+S7tuS4iuS8oCA9PT09PT09PT09PT09PT09PT09PQ0KICAgIGhhbmRsZVNlbGVjdEZpbGUoKSB7DQogICAgICB0aGlzLiRyZWZzLmZpbGVJbnB1dFJlZiAmJiB0aGlzLiRyZWZzLmZpbGVJbnB1dFJlZi5jbGljaygpDQogICAgfSwNCiAgICBoYW5kbGVGaWxlQ2hhbmdlKGUpIHsNCiAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlID0gZS50YXJnZXQuZmlsZXNbMF0gfHwgbnVsbA0KICAgIH0sDQogICAgaGFuZGxlVXBsb2FkKCkgew0KICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkRmlsZSkgew0KICAgICAgICB0aGlzLiRtZXNzYWdlLndhcm5pbmcoJ+ivt+WFiOmAieaLqeaWh+S7ticpDQogICAgICAgIHJldHVybg0KICAgICAgfQ0KICAgICAgdGhpcy4kbWVzc2FnZS53YXJuaW5nKCflkI7nq6/mmoLmnKrmj5Dkvpvor6XmjqXlj6MnKQ0KICAgIH0sDQoNCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PSDooajmoLzlpJrpgIkgPT09PT09PT09PT09PT09PT09PT0NCiAgICBoYW5kbGVTZWxlY3Rpb25DaGFuZ2Uocm93cykgew0KICAgICAgdGhpcy5zZWxlY3RlZFJvd3MgPSByb3dzDQogICAgfSwNCg0KICAgIC8vID09PT09PT09PT09PT09PT09PT09IOaWsOW7uumAieS/ruivvuW8ueeqlyA9PT09PT09PT09PT09PT09PT09PQ0KICAgIGhhbmRsZU9wZW5OZXcoKSB7DQogICAgICB0aGlzLiRtZXNzYWdlLndhcm5pbmcoJ+WQjuerr+aaguacquaPkOS+m+ivpeaOpeWPoycpDQogICAgfSwNCiAgICBoYW5kbGVOZXdDb25maXJtKCkgew0KICAgICAgaWYgKCF0aGlzLiRyZWZzLmZvcm1SZWYpIHJldHVybg0KICAgICAgdGhpcy4kcmVmcy5mb3JtUmVmLnZhbGlkYXRlKCh2YWxpZCkgPT4gew0KICAgICAgICBpZiAoIXZhbGlkKSByZXR1cm4NCiAgICAgICAgY29uc29sZS5sb2coJ+aWsOW7uumAieS/ruivvjonLCBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuZm9ybSkpKQ0KICAgICAgICB0aGlzLiRtZXNzYWdlLnN1Y2Nlc3MoJ+aWsOW7uumAieS/ruivvuaIkOWKn++8iOWJjeerr+aooeaLn++8iScpDQogICAgICAgIHRoaXMuZGlhbG9nVmlzaWJsZSA9IGZhbHNlDQogICAgICB9KQ0KICAgIH0sDQoNCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PSDliIbpobUgPT09PT09PT09PT09PT09PT09PT0NCiAgICBoYW5kbGVQYWdlQ2hhbmdlKHBhZ2UpIHsNCiAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSBwYWdlDQogICAgICB0aGlzLmxvYWRMaXN0KCkNCiAgICB9LA0KDQogICAgLy8g6KGo5qC85bqP5Y+377yI6Leo6aG16L+e57ut77yJDQogICAgdGFibGVJbmRleChpbmRleCkgew0KICAgICAgcmV0dXJuICh0aGlzLmN1cnJlbnRQYWdlIC0gMSkgKiB0aGlzLnBhZ2VTaXplICsgaW5kZXggKyAxDQogICAgfQ0KICB9DQp9DQo="},{"version":3,"sources":["index.vue"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8NA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;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;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;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;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;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;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA","file":"index.vue","sourceRoot":"src/views/teachOffice/elective","sourcesContent":["<template>\r\n <div class=\"app-container management-page elective-page\">\r\n <!-- ==================== 2. 查询条件区域 ==================== -->\r\n <div class=\"section-card query-card\">\r\n <div class=\"section-heading\">\r\n <div>\r\n <h2 class=\"section-title\">筛选条件</h2>\r\n <p class=\"section-description\">按课程、班次、教员及状态筛选选修课</p>\r\n </div>\r\n <el-button type=\"primary\" icon=\"el-icon-search\" @click=\"handleQuery\">查询</el-button>\r\n </div>\r\n <el-form>\r\n <el-row :gutter=\"32\">\r\n <!-- 左栏 -->\r\n <el-col :xs=\"24\" :md=\"12\">\r\n <div class=\"query-field\">\r\n <span class=\"q-label no-check\">授课教员</span>\r\n <el-input v-model=\"searchForm.js\" placeholder=\"请输入授课教员\" clearable class=\"q-control\" />\r\n </div>\r\n <div class=\"query-field\">\r\n <span class=\"q-label no-check\">可选班次年级</span>\r\n <el-input v-model=\"searchForm.kbcnj\" placeholder=\"请输入可选班次年级\" clearable class=\"q-control\" />\r\n </div>\r\n <div class=\"query-field\">\r\n <span class=\"q-label no-check\">选修课状态</span>\r\n <el-select\r\n v-model=\"searchForm.xxkzt\"\r\n placeholder=\"请选择选修课状态\"\r\n clearable\r\n class=\"q-control\"\r\n >\r\n <el-option v-for=\"item in statusOptions\" :key=\"item\" :label=\"item\" :value=\"item\" />\r\n </el-select>\r\n </div>\r\n </el-col>\r\n\r\n <!-- 右栏 -->\r\n <el-col :xs=\"24\" :md=\"12\">\r\n <div class=\"query-field\">\r\n <span class=\"q-label no-check\">课程科目名称</span>\r\n <el-input v-model=\"searchForm.kckmmc\" placeholder=\"请输入课程科目名称\" clearable class=\"q-control\" />\r\n </div>\r\n <div class=\"query-field\">\r\n <span class=\"q-label no-check\">选修班名称</span>\r\n <el-input v-model=\"searchForm.xxbmc\" placeholder=\"请输入选修班名称\" clearable class=\"q-control\" />\r\n </div>\r\n <div class=\"query-field\">\r\n <span class=\"q-label no-check\">培训层次</span>\r\n <el-select v-model=\"searchForm.pxcc\" placeholder=\"请选择培训层次\" clearable class=\"q-control\">\r\n <el-option v-for=\"item in pxccOptions\" :key=\"item\" :label=\"item\" :value=\"item\" />\r\n </el-select>\r\n </div>\r\n </el-col>\r\n </el-row>\r\n </el-form>\r\n\r\n </div>\r\n\r\n <!-- ==================== 3. 导出按钮区域 ==================== -->\r\n <div class=\"section-card export-card\">\r\n <div class=\"section-heading section-heading--compact\">\r\n <div>\r\n <h2 class=\"section-title\">数据导出</h2>\r\n <p class=\"section-description\">下载选修班及学员名单</p>\r\n </div>\r\n </div>\r\n <div class=\"export-bar\">\r\n <el-button icon=\"el-icon-download\" @click=\"handleDownloadList\">下载选修班列表</el-button>\r\n <el-button icon=\"el-icon-download\" @click=\"handleDownloadWord\">下载选修班学员名单Word</el-button>\r\n <el-button icon=\"el-icon-download\" @click=\"handleDownloadExcel\">下载选修班学员名单Excel</el-button>\r\n </div>\r\n </div>\r\n\r\n <!-- ==================== 4. 操作按钮区域 ==================== -->\r\n <div class=\"section-card action-card\">\r\n <div class=\"section-heading section-heading--compact\">\r\n <div>\r\n <h2 class=\"section-title\">选修课操作</h2>\r\n <p class=\"section-description\">新建选修课,或对已选数据执行批量操作</p>\r\n </div>\r\n </div>\r\n <div class=\"action-row\">\r\n <el-button type=\"primary\" icon=\"el-icon-plus\" @click=\"handleOpenNew\">新建选修课</el-button>\r\n <el-button type=\"primary\" plain icon=\"el-icon-circle-check\" @click=\"handleOpenEarly\">\r\n 所选批量开放报名\r\n </el-button>\r\n <el-button type=\"warning\" plain icon=\"el-icon-remove-outline\" @click=\"handleCancelEarly\">\r\n 所选批量取消开放报名\r\n </el-button>\r\n <el-button type=\"danger\" plain icon=\"el-icon-circle-close\" @click=\"handleStopSignup\">\r\n 批量停止报名\r\n </el-button>\r\n <el-button icon=\"el-icon-refresh\" @click=\"handleReverseRange\">\r\n 所选批量根据学员反向确定班次范围\r\n </el-button>\r\n </div>\r\n <div class=\"action-row\">\r\n <el-button icon=\"el-icon-download\" @click=\"handleDownloadTemplate\">【选修课数据文件模板】下载</el-button>\r\n </div>\r\n </div>\r\n\r\n <!-- ==================== 5. 文件上传区域 ==================== -->\r\n <div class=\"section-card upload-card\">\r\n <div class=\"section-heading section-heading--compact\">\r\n <div>\r\n <h2 class=\"section-title\">数据导入</h2>\r\n <p class=\"section-description\">选择填写完成的模板文件并上传</p>\r\n </div>\r\n </div>\r\n <div class=\"upload-row\">\r\n <div class=\"upload-left\">\r\n <el-button icon=\"el-icon-folder-opened\" @click=\"handleSelectFile\">选择文件</el-button>\r\n <span class=\"file-name\" :class=\"{ 'has-file': selectedFile }\">{{ fileName }}</span>\r\n <input ref=\"fileInputRef\" type=\"file\" style=\"display: none\" @change=\"handleFileChange\" />\r\n </div>\r\n <div class=\"upload-right\">\r\n <el-button type=\"primary\" icon=\"el-icon-upload2\" @click=\"handleUpload\">上传数据</el-button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- ==================== 6. 数据表格区域 ==================== -->\r\n <div class=\"section-card table-card\">\r\n <div class=\"section-heading section-heading--compact table-heading\">\r\n <div>\r\n <h2 class=\"section-title\">选修课列表</h2>\r\n <p class=\"section-description\">共 {{ total }} 条数据</p>\r\n </div>\r\n </div>\r\n <el-table v-loading=\"loading\" :data=\"tableData\" border stripe class=\"main-table\" @selection-change=\"handleSelectionChange\">\r\n <template slot=\"empty\">\r\n <span>无数据!</span>\r\n </template>\r\n <el-table-column type=\"selection\" width=\"40\" align=\"center\" />\r\n <el-table-column type=\"index\" label=\"序号\" width=\"60\" align=\"center\" :index=\"tableIndex\" />\r\n <el-table-column prop=\"kmc\" label=\"课程\" min-width=\"110\" show-overflow-tooltip />\r\n <el-table-column prop=\"jcmc\" label=\"教材\" min-width=\"120\" show-overflow-tooltip />\r\n <el-table-column prop=\"jyxm\" label=\"实施教员\" width=\"90\" align=\"center\" />\r\n <el-table-column prop=\"jsmc\" label=\"教学场地\" width=\"100\" show-overflow-tooltip />\r\n <el-table-column prop=\"kxdlbc\" label=\"显示可选队别班次\" min-width=\"150\" align=\"center\" show-overflow-tooltip />\r\n <el-table-column label=\"计划学时/运行学时/学分\" width=\"130\" align=\"center\">\r\n <template slot=\"header\">\r\n <div class=\"triple-header\">\r\n <span>计划学时</span>\r\n <span>运行学时</span>\r\n <span>学分</span>\r\n </div>\r\n </template>\r\n <template slot-scope=\"{ row }\">\r\n <div class=\"triple-cell\">\r\n <span>{{ row.jhyxxsxf }}</span>\r\n </div>\r\n </template>\r\n </el-table-column>\r\n <el-table-column label=\"开课结课日期\" min-width=\"150\" align=\"center\">\r\n <template slot-scope=\"{ row }\">\r\n {{ row.kkjkrq }}\r\n </template>\r\n </el-table-column>\r\n <el-table-column label=\"报名日期\" min-width=\"140\" align=\"center\">\r\n <template slot-scope=\"{ row }\">\r\n {{ row.bmrq }}\r\n </template>\r\n </el-table-column>\r\n <el-table-column prop=\"jhrs\" label=\"计划人数\" width=\"90\" align=\"center\" />\r\n <el-table-column prop=\"yqsm\" label=\"要求说明\" min-width=\"120\" show-overflow-tooltip />\r\n </el-table>\r\n\r\n <div class=\"pagination-wrap\">\r\n <el-pagination\r\n background\r\n layout=\"total, prev, pager, next, jumper\"\r\n :total=\"total\"\r\n :page-size=\"pageSize\"\r\n :current-page=\"currentPage\"\r\n @current-change=\"handlePageChange\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!-- 新建选修课弹窗 -->\r\n <el-dialog\r\n :visible=\"dialogVisible\"\r\n title=\"新建选修课\"\r\n width=\"560px\"\r\n @update:visible=\"val => (dialogVisible = val)\"\r\n >\r\n <el-form ref=\"formRef\" :model=\"form\" :rules=\"rules\" label-width=\"110px\">\r\n <el-form-item label=\"课程名称\" prop=\"kcmc\">\r\n <el-input v-model=\"form.kcmc\" placeholder=\"请输入课程名称\" clearable />\r\n </el-form-item>\r\n <el-form-item label=\"实施教员\" prop=\"js\">\r\n <el-input v-model=\"form.js\" placeholder=\"请输入实施教员\" clearable />\r\n </el-form-item>\r\n <el-form-item label=\"教材\">\r\n <el-input v-model=\"form.jc\" placeholder=\"请输入教材\" clearable />\r\n </el-form-item>\r\n <el-form-item label=\"教学场地\">\r\n <el-input v-model=\"form.jxcd\" placeholder=\"请输入教学场地\" clearable />\r\n </el-form-item>\r\n <el-form-item label=\"计划学时\">\r\n <el-input-number v-model=\"form.jhsxs\" :min=\"0\" :precision=\"0\" class=\"w-full\" />\r\n </el-form-item>\r\n <el-form-item label=\"运行学时\">\r\n <el-input-number v-model=\"form.yxsxs\" :min=\"0\" :precision=\"0\" class=\"w-full\" />\r\n </el-form-item>\r\n <el-form-item label=\"学分\">\r\n <el-input-number v-model=\"form.xf\" :min=\"0\" :precision=\"1\" class=\"w-full\" />\r\n </el-form-item>\r\n <el-form-item label=\"计划人数\">\r\n <el-input-number v-model=\"form.jh\" :min=\"0\" :precision=\"0\" class=\"w-full\" />\r\n </el-form-item>\r\n </el-form>\r\n <div slot=\"footer\">\r\n <el-button @click=\"dialogVisible = false\">取消</el-button>\r\n <el-button type=\"primary\" @click=\"handleNewConfirm\">确定</el-button>\r\n </div>\r\n </el-dialog>\r\n </div>\r\n</template>\r\n\r\n<script>\r\nimport {\r\n listElective,\r\n batchOpenElective,\r\n batchCancelOpenElective,\r\n batchStopElective,\r\n exportElectiveList,\r\n exportElectiveStudentsExcel,\r\n exportElectiveStudentsWord\r\n} from '@/api/teachOffice/elective'\r\nimport { saveAs } from 'file-saver'\r\n\r\nexport default {\r\n name: 'Elective',\r\n data() {\r\n return {\r\n // ==================== 下拉选项 ====================\r\n statusOptions: ['拟制', '开放报名', '停止报名', '已开课'],\r\n pxccOptions: ['无', '本科', '硕士', '博士'],\r\n\r\n // ==================== 查询条件 ====================\r\n searchForm: {\r\n js: '',\r\n kbcnj: '',\r\n xxkzt: '',\r\n kckmmc: '',\r\n xxbmc: '',\r\n pxcc: ''\r\n },\r\n\r\n // ==================== 数据表格 ====================\r\n tableData: [],\r\n total: 0,\r\n loading: false,\r\n selectedRows: [],\r\n\r\n // ==================== 文件上传 ====================\r\n selectedFile: null,\r\n\r\n // ==================== 新建选修课弹窗 ====================\r\n dialogVisible: false,\r\n form: {\r\n kcmc: '',\r\n js: '',\r\n jc: '',\r\n jxcd: '',\r\n jhsxs: 0,\r\n yxsxs: 0,\r\n xf: 0,\r\n jh: 0\r\n },\r\n rules: {\r\n kcmc: [{ required: true, message: '请输入课程名称', trigger: 'blur' }],\r\n js: [{ required: true, message: '请输入实施教员', trigger: 'blur' }]\r\n },\r\n\r\n // ==================== 分页 ====================\r\n currentPage: 1,\r\n pageSize: 20\r\n }\r\n },\r\n computed: {\r\n fileName() {\r\n return (this.selectedFile && this.selectedFile.name) || '未选择任何文件'\r\n }\r\n },\r\n created() {\r\n this.loadList()\r\n },\r\n methods: {\r\n // 组装查询过滤条件(列表与导出共用,导出不含分页参数)\r\n buildFilter() {\r\n const q = {}\r\n if (this.searchForm.js) q.jyxm = this.searchForm.js\r\n if (this.searchForm.kbcnj) q.kxbcnj = this.searchForm.kbcnj\r\n if (this.searchForm.kckmmc) q.kmc = this.searchForm.kckmmc\r\n if (this.searchForm.xxbmc) q.xxbmc = this.searchForm.xxbmc\r\n if (this.searchForm.xxkzt) q.xkzt = this.searchForm.xxkzt\r\n if (this.searchForm.pxcc) q.pxcc = this.searchForm.pxcc\r\n return q\r\n },\r\n\r\n // ==================== 查询 ====================\r\n handleQuery() {\r\n this.currentPage = 1\r\n this.loadList()\r\n },\r\n loadList() {\r\n this.loading = true\r\n const params = Object.assign({ pageNum: this.currentPage, pageSize: this.pageSize }, this.buildFilter())\r\n listElective(params)\r\n .then(res => {\r\n const data = (res && res.data) || {}\r\n this.tableData = data.records || []\r\n this.total = data.total || 0\r\n })\r\n .finally(() => {\r\n this.loading = false\r\n })\r\n },\r\n\r\n // ==================== 导出 ====================\r\n handleDownloadList() {\r\n exportElectiveList(this.buildFilter())\r\n .then(blob => {\r\n saveAs(blob, '选修班列表.xlsx')\r\n this.$message.success('选修班列表已下载')\r\n })\r\n .catch(() => {})\r\n },\r\n handleDownloadWord() {\r\n const bhList = this.selectedRows.map(row => row.bh)\r\n if (bhList.length === 0) {\r\n this.$message.warning('请先选择选修班')\r\n return\r\n }\r\n exportElectiveStudentsWord(bhList)\r\n .then(blob => {\r\n saveAs(blob, '选修班学员名单.docx')\r\n this.$message.success('选修班学员名单Word已下载')\r\n })\r\n .catch(() => {})\r\n },\r\n handleDownloadExcel() {\r\n const bhList = this.selectedRows.map(row => row.bh)\r\n if (bhList.length === 0) {\r\n this.$message.warning('请先选择选修班')\r\n return\r\n }\r\n exportElectiveStudentsExcel(bhList)\r\n .then(blob => {\r\n saveAs(blob, '选修班学员名单.xlsx')\r\n this.$message.success('选修班学员名单Excel已下载')\r\n })\r\n .catch(() => {})\r\n },\r\n\r\n // ==================== 操作按钮 ====================\r\n handleOpenEarly() {\r\n const bhList = this.selectedRows.map(row => row.bh)\r\n if (bhList.length === 0) {\r\n this.$message.warning('请先选择选修班')\r\n return\r\n }\r\n batchOpenElective(bhList)\r\n .then(() => {\r\n this.$message.success('所选班已开放报名')\r\n this.loadList()\r\n })\r\n .catch(() => {})\r\n },\r\n handleCancelEarly() {\r\n const bhList = this.selectedRows.map(row => row.bh)\r\n if (bhList.length === 0) {\r\n this.$message.warning('请先选择选修班')\r\n return\r\n }\r\n batchCancelOpenElective(bhList)\r\n .then(() => {\r\n this.$message.success('所选班已取消开放报名')\r\n this.loadList()\r\n })\r\n .catch(() => {})\r\n },\r\n handleStopSignup() {\r\n const bhList = this.selectedRows.map(row => row.bh)\r\n if (bhList.length === 0) {\r\n this.$message.warning('请先选择选修班')\r\n return\r\n }\r\n batchStopElective(bhList)\r\n .then(() => {\r\n this.$message.success('已批量停止报名')\r\n this.loadList()\r\n })\r\n .catch(() => {})\r\n },\r\n handleReverseRange() {\r\n this.$message.warning('后端暂未提供该接口')\r\n },\r\n handleDownloadTemplate() {\r\n this.$message.warning('后端暂未提供该接口')\r\n },\r\n\r\n // ==================== 文件上传 ====================\r\n handleSelectFile() {\r\n this.$refs.fileInputRef && this.$refs.fileInputRef.click()\r\n },\r\n handleFileChange(e) {\r\n this.selectedFile = e.target.files[0] || null\r\n },\r\n handleUpload() {\r\n if (!this.selectedFile) {\r\n this.$message.warning('请先选择文件')\r\n return\r\n }\r\n this.$message.warning('后端暂未提供该接口')\r\n },\r\n\r\n // ==================== 表格多选 ====================\r\n handleSelectionChange(rows) {\r\n this.selectedRows = rows\r\n },\r\n\r\n // ==================== 新建选修课弹窗 ====================\r\n handleOpenNew() {\r\n this.$message.warning('后端暂未提供该接口')\r\n },\r\n handleNewConfirm() {\r\n if (!this.$refs.formRef) return\r\n this.$refs.formRef.validate((valid) => {\r\n if (!valid) return\r\n console.log('新建选修课:', JSON.parse(JSON.stringify(this.form)))\r\n this.$message.success('新建选修课成功(前端模拟)')\r\n this.dialogVisible = false\r\n })\r\n },\r\n\r\n // ==================== 分页 ====================\r\n handlePageChange(page) {\r\n this.currentPage = page\r\n this.loadList()\r\n },\r\n\r\n // 表格序号(跨页连续)\r\n tableIndex(index) {\r\n return (this.currentPage - 1) * this.pageSize + index + 1\r\n }\r\n }\r\n}\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n// ==================== 2. 查询条件区域 ====================\r\n.query-card {\r\n .query-field {\r\n display: flex;\r\n align-items: center;\r\n margin-bottom: 14px;\r\n min-height: 32px;\r\n\r\n .q-label {\r\n width: 120px;\r\n flex-shrink: 0;\r\n font-size: 13px;\r\n color: #303133;\r\n text-align: right;\r\n margin-right: 10px;\r\n white-space: nowrap;\r\n }\r\n\r\n .q-control {\r\n flex: 1;\r\n min-width: 0;\r\n }\r\n }\r\n}\r\n\r\n.export-bar {\r\n align-items: center;\r\n}\r\n\r\n// ==================== 4. 操作按钮区域 ====================\r\n.action-card {\r\n .action-row {\r\n display: flex;\r\n flex-wrap: wrap;\r\n gap: 12px;\r\n margin-bottom: 12px;\r\n\r\n &:last-child {\r\n margin-bottom: 0;\r\n }\r\n }\r\n}\r\n\r\n// ==================== 5. 文件上传区域 ====================\r\n.upload-card {\r\n .upload-row {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n flex-wrap: wrap;\r\n gap: 12px;\r\n\r\n .upload-left {\r\n display: flex;\r\n align-items: center;\r\n gap: 12px;\r\n\r\n .file-name {\r\n font-size: 12px;\r\n color: #999;\r\n\r\n &.has-file {\r\n color: #303133;\r\n }\r\n }\r\n }\r\n\r\n .upload-right {\r\n display: flex;\r\n align-items: center;\r\n }\r\n }\r\n}\r\n\r\n// ==================== 6. 数据表格区域 ====================\r\n.table-card {\r\n .main-table {\r\n ::v-deep .cell {\r\n font-size: 12px;\r\n }\r\n }\r\n\r\n .triple-header,\r\n .triple-cell {\r\n display: flex;\r\n flex-direction: column;\r\n line-height: 1.4;\r\n }\r\n\r\n .pagination-wrap {\r\n display: flex;\r\n justify-content: flex-end;\r\n margin-top: 16px;\r\n }\r\n}\r\n</style>\r\n"]}]}