forked from liweijie/education
1 line
46 KiB
JSON
1 line
46 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\\student\\shiftTeam\\index.vue?vue&type=script&lang=js","dependencies":[{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\src\\views\\student\\shiftTeam\\index.vue","mtime":1787640892010},{"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:Ly8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KDQppbXBvcnQgeyBzYXZlQXMgfSBmcm9tICdmaWxlLXNhdmVyJw0KaW1wb3J0IHsNCiAgbGlzdFRlYW0sDQogIGdldFRlYW0sDQogIGFkZFRlYW0sDQogIHVwZGF0ZVRlYW0sDQogIGRlbFRlYW0sDQogIGltcG9ydFRlYW0sDQogIGV4cG9ydFRlYW0NCn0gZnJvbSAnQC9hcGkvc3R1ZGVudFJlY29yZHMvdGVhbScNCg0KZXhwb3J0IGRlZmF1bHQgew0KICBuYW1lOiAnU2hpZnRUZWFtSW5kZXgnLA0KICBkYXRhKCkgew0KICAgIHJldHVybiB7DQogICAgICAvLyA9PT09PT09PT09PT09PT09PT09PSDmn6Xor6LmnaHku7YgPT09PT09PT09PT09PT09PT09PT0NCiAgICAgIHNlYXJjaEZvcm06IHsNCiAgICAgICAgeHlkbWM6ICcnLA0KICAgICAgICBuajogJycsDQogICAgICAgIHp5ZGg6ICcnLA0KICAgICAgICB4eWRseDogJycsDQogICAgICAgIHJ3bGI6ICcnLA0KICAgICAgICB4c2x4OiB1bmRlZmluZWQNCiAgICAgIH0sDQoNCiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09IOaWh+S7tuWvvOWFpSA9PT09PT09PT09PT09PT09PT09PQ0KICAgICAgc2VsZWN0ZWRGaWxlOiBudWxsLA0KICAgICAgdXBsb2FkaW5nOiBmYWxzZSwNCg0KICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT0g5YiX6KGo5pWw5o2uID09PT09PT09PT09PT09PT09PT09DQogICAgICBsb2FkaW5nOiBmYWxzZSwNCiAgICAgIHRhYmxlRGF0YTogW10sDQogICAgICB0b3RhbDogMCwNCiAgICAgIHBhZ2VOdW06IDEsDQogICAgICBwYWdlU2l6ZTogMjAsDQoNCiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09IOaWsOWini/nvJbovpEgPT09PT09PT09PT09PT09PT09PT0NCiAgICAgIGZvcm1EaWFsb2dWaXNpYmxlOiBmYWxzZSwNCiAgICAgIGRpYWxvZ1RpdGxlOiAn5paw5aKe5a2m5ZGY6ZifJywNCiAgICAgIGlzQWRkOiB0cnVlLA0KICAgICAgZm9ybVNhdmluZzogZmFsc2UsDQogICAgICBmb3JtOiB0aGlzLmNyZWF0ZUVtcHR5Rm9ybSgpLA0KICAgICAgZm9ybVJ1bGVzOiB7DQogICAgICAgIHh5ZGJoOiBbeyByZXF1aXJlZDogdHJ1ZSwgbWVzc2FnZTogJ+ivt+i+k+WFpeWtpuWRmOmYn+e8luWPtycsIHRyaWdnZXI6ICdibHVyJyB9XSwNCiAgICAgICAgeHlkbWM6IFt7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAn6K+36L6T5YWl5a2m5ZGY6Zif5ZCN56ewJywgdHJpZ2dlcjogJ2JsdXInIH1dLA0KICAgICAgICB4eWRyczogW3sgcmVxdWlyZWQ6IHRydWUsIG1lc3NhZ2U6ICfor7fovpPlhaXlrablkZjpmJ/kurrmlbAnLCB0cmlnZ2VyOiAnY2hhbmdlJyB9XSwNCiAgICAgICAgenlkaDogW3sgcmVxdWlyZWQ6IHRydWUsIG1lc3NhZ2U6ICfor7fovpPlhaXkuJPkuJrku6Plj7cnLCB0cmlnZ2VyOiAnYmx1cicgfV0sDQogICAgICAgIHJ3bGI6IFt7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAn6K+36L6T5YWl5Lu75Yqh57G75YirJywgdHJpZ2dlcjogJ2JsdXInIH1dLA0KICAgICAgICB4c2x4OiBbeyByZXF1aXJlZDogdHJ1ZSwgbWVzc2FnZTogJ+ivt+mAieaLqeiZmuWunuexu+WeiycsIHRyaWdnZXI6ICdjaGFuZ2UnIH1dLA0KICAgICAgICByeHJxOiBbeyByZXF1aXJlZDogdHJ1ZSwgbWVzc2FnZTogJ+ivt+mAieaLqeWFpeWtpuaXpeacnycsIHRyaWdnZXI6ICdjaGFuZ2UnIH1dLA0KICAgICAgICBieXJxOiBbeyByZXF1aXJlZDogdHJ1ZSwgbWVzc2FnZTogJ+ivt+mAieaLqeavleS4muaXpeacnycsIHRyaWdnZXI6ICdjaGFuZ2UnIH1dLA0KICAgICAgICB4eWRseDogW3sgcmVxdWlyZWQ6IHRydWUsIG1lc3NhZ2U6ICfor7fovpPlhaXlrablkZjpmJ/nsbvlnosnLCB0cmlnZ2VyOiAnYmx1cicgfV0sDQogICAgICAgIGpjbGI6IFt7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAn6K+36L6T5YWl6IqC5qyh57G75YirJywgdHJpZ2dlcjogJ2JsdXInIH1dLA0KICAgICAgICB4dG1zOiBbeyByZXF1aXJlZDogdHJ1ZSwgbWVzc2FnZTogJ+ivt+i+k+WFpeezu+e7n+aooeW8jycsIHRyaWdnZXI6ICdibHVyJyB9XSwNCiAgICAgICAgenRweHJ3OiBbeyByZXF1aXJlZDogdHJ1ZSwgbWVzc2FnZTogJ+ivt+mAieaLqeS4u+S9k+WfueiureS7u+WKoScsIHRyaWdnZXI6ICdjaGFuZ2UnIH1dDQogICAgICB9LA0KDQogICAgICAvLyA9PT09PT09PT09PT09PT09PT09PSDor6bmg4UgPT09PT09PT09PT09PT09PT09PT0NCiAgICAgIGRldGFpbERpYWxvZ1Zpc2libGU6IGZhbHNlLA0KICAgICAgZGV0YWlsTG9hZGluZzogZmFsc2UsDQogICAgICBkZXRhaWxGb3JtOiB7fQ0KICAgIH0NCiAgfSwNCiAgY29tcHV0ZWQ6IHsNCiAgICBmaWxlTmFtZSgpIHsNCiAgICAgIHJldHVybiAodGhpcy5zZWxlY3RlZEZpbGUgJiYgdGhpcy5zZWxlY3RlZEZpbGUubmFtZSkgfHwgJ+acqumAieaLqeS7u+S9leaWh+S7ticNCiAgICB9DQogIH0sDQogIG1vdW50ZWQoKSB7DQogICAgdGhpcy5mZXRjaExpc3QoKQ0KICB9LA0KICBtZXRob2RzOiB7DQogICAgY3JlYXRlRW1wdHlGb3JtKCkgew0KICAgICAgcmV0dXJuIHsNCiAgICAgICAgeHlkYmg6ICcnLA0KICAgICAgICB4eWRtYzogJycsDQogICAgICAgIHh5ZHJzOiB1bmRlZmluZWQsDQogICAgICAgIG5qOiAnJywNCiAgICAgICAgenlkaDogJycsDQogICAgICAgIHp5anNiaDogJycsDQogICAgICAgIGJ6OiAnJywNCiAgICAgICAgenh6dDogMSwNCiAgICAgICAgeGg6IHVuZGVmaW5lZCwNCiAgICAgICAgcndsYjogJycsDQogICAgICAgIHhzbHg6IDEsDQogICAgICAgIHJ4cnE6ICcnLA0KICAgICAgICBieXJxOiAnJywNCiAgICAgICAgeHlkbHg6ICcnLA0KICAgICAgICBweHJ3YnNoOiAnJywNCiAgICAgICAgamNsYjogJycsDQogICAgICAgIHh0bXM6ICcnLA0KICAgICAgICBqc29uemQ6ICcnLA0KICAgICAgICBqYzogJycsDQogICAgICAgIHNzZHc6ICcnLA0KICAgICAgICB6dHB4cnc6IDENCiAgICAgIH0NCiAgICB9LA0KDQogICAgLy8gPT09PT09PT09PT09PT09PT09PT0g5pel5pyfL+aVsOWAvOWxleekuiA9PT09PT09PT09PT09PT09PT09PQ0KICAgIGZvcm1hdERhdGUodmFsKSB7DQogICAgICBpZiAoIXZhbCkgcmV0dXJuICcnDQogICAgICByZXR1cm4gU3RyaW5nKHZhbCkuc3Vic3RyaW5nKDAsIDEwKQ0KICAgIH0sDQogICAgZm10VmFsdWUodmFsKSB7DQogICAgICByZXR1cm4gdmFsID09PSBudWxsIHx8IHZhbCA9PT0gdW5kZWZpbmVkIHx8IHZhbCA9PT0gJycgPyAnLScgOiB2YWwNCiAgICB9LA0KDQogICAgLyoqIOaehOW7uuafpeivouadoeS7tu+8iOS4jeWQq+WIhumhte+8ie+8jOS+m+WIl+ihqOafpeivouS4juWvvOWHuuWFseeUqCAqLw0KICAgIGJ1aWxkUXVlcnkoKSB7DQogICAgICBjb25zdCBwYXJhbXMgPSB7fQ0KICAgICAgO1sneHlkbWMnLCAnbmonLCAnenlkaCcsICd4eWRseCcsICdyd2xiJ10uZm9yRWFjaChrZXkgPT4gew0KICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuc2VhcmNoRm9ybVtrZXldDQogICAgICAgIGlmICh2YWx1ZSAhPT0gJycgJiYgdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkgew0KICAgICAgICAgIHBhcmFtc1trZXldID0gU3RyaW5nKHZhbHVlKS50cmltKCkNCiAgICAgICAgfQ0KICAgICAgfSkNCiAgICAgIGlmICh0aGlzLnNlYXJjaEZvcm0ueHNseCAhPT0gdW5kZWZpbmVkICYmIHRoaXMuc2VhcmNoRm9ybS54c2x4ICE9PSAnJyAmJiB0aGlzLnNlYXJjaEZvcm0ueHNseCAhPT0gbnVsbCkgew0KICAgICAgICBwYXJhbXMueHNseCA9IHRoaXMuc2VhcmNoRm9ybS54c2x4DQogICAgICB9DQogICAgICByZXR1cm4gcGFyYW1zDQogICAgfSwNCg0KICAgIC8vID09PT09PT09PT09PT09PT09PT09IOafpeivouWIl+ihqCA9PT09PT09PT09PT09PT09PT09PQ0KICAgIGZldGNoTGlzdCgpIHsNCiAgICAgIHRoaXMubG9hZGluZyA9IHRydWUNCiAgICAgIGNvbnN0IHBhcmFtcyA9IHsNCiAgICAgICAgcGFnZU51bTogdGhpcy5wYWdlTnVtLA0KICAgICAgICBwYWdlU2l6ZTogdGhpcy5wYWdlU2l6ZSwNCiAgICAgICAgLi4udGhpcy5idWlsZFF1ZXJ5KCkNCiAgICAgIH0NCiAgICAgIGxpc3RUZWFtKHBhcmFtcykudGhlbihyZXNwb25zZSA9PiB7DQogICAgICAgIGNvbnN0IGRhdGEgPSByZXNwb25zZS5kYXRhIHx8IHt9DQogICAgICAgIHRoaXMudGFibGVEYXRhID0gZGF0YS5yZWNvcmRzIHx8IFtdDQogICAgICAgIHRoaXMudG90YWwgPSBkYXRhLnRvdGFsIHx8IDANCiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2UNCiAgICAgIH0pLmNhdGNoKCgpID0+IHsNCiAgICAgICAgdGhpcy50YWJsZURhdGEgPSBbXQ0KICAgICAgICB0aGlzLnRvdGFsID0gMA0KICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZQ0KICAgICAgfSkNCiAgICB9LA0KDQogICAgaGFuZGxlU2VhcmNoKCkgew0KICAgICAgdGhpcy5wYWdlTnVtID0gMQ0KICAgICAgdGhpcy5mZXRjaExpc3QoKQ0KICAgIH0sDQoNCiAgICBoYW5kbGVSZXNldCgpIHsNCiAgICAgIHRoaXMuJHJlZnMuc2VhcmNoRm9ybVJlZi5yZXNldEZpZWxkcygpDQogICAgICB0aGlzLnBhZ2VOdW0gPSAxDQogICAgICB0aGlzLmZldGNoTGlzdCgpDQogICAgfSwNCg0KICAgIGhhbmRsZVBhZ2VDaGFuZ2UoY3VycmVudCkgew0KICAgICAgdGhpcy5wYWdlTnVtID0gY3VycmVudA0KICAgICAgdGhpcy5mZXRjaExpc3QoKQ0KICAgIH0sDQoNCiAgICBoYW5kbGVTaXplQ2hhbmdlKHNpemUpIHsNCiAgICAgIHRoaXMucGFnZVNpemUgPSBzaXplDQogICAgICB0aGlzLnBhZ2VOdW0gPSAxDQogICAgICB0aGlzLmZldGNoTGlzdCgpDQogICAgfSwNCg0KICAgIC8vID09PT09PT09PT09PT09PT09PT09IOaWsOWini/nvJbovpEgPT09PT09PT09PT09PT09PT09PT0NCiAgICBoYW5kbGVBZGQoKSB7DQogICAgICB0aGlzLmlzQWRkID0gdHJ1ZQ0KICAgICAgdGhpcy5kaWFsb2dUaXRsZSA9ICfmlrDlop7lrablkZjpmJ8nDQogICAgICB0aGlzLmZvcm0gPSB0aGlzLmNyZWF0ZUVtcHR5Rm9ybSgpDQogICAgICB0aGlzLmZvcm1EaWFsb2dWaXNpYmxlID0gdHJ1ZQ0KICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4gew0KICAgICAgICB0aGlzLiRyZWZzLmZvcm1SZWYgJiYgdGhpcy4kcmVmcy5mb3JtUmVmLmNsZWFyVmFsaWRhdGUoKQ0KICAgICAgfSkNCiAgICB9LA0KDQogICAgaGFuZGxlRWRpdChyb3cpIHsNCiAgICAgIHRoaXMuaXNBZGQgPSBmYWxzZQ0KICAgICAgdGhpcy5kaWFsb2dUaXRsZSA9ICfnvJbovpHlrablkZjpmJ8nDQogICAgICB0aGlzLmZvcm0gPSB0aGlzLmNyZWF0ZUVtcHR5Rm9ybSgpDQogICAgICB0aGlzLmZvcm1EaWFsb2dWaXNpYmxlID0gdHJ1ZQ0KICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4gew0KICAgICAgICB0aGlzLiRyZWZzLmZvcm1SZWYgJiYgdGhpcy4kcmVmcy5mb3JtUmVmLmNsZWFyVmFsaWRhdGUoKQ0KICAgICAgfSkNCiAgICAgIGdldFRlYW0ocm93Lnh5ZGJoKS50aGVuKHJlc3BvbnNlID0+IHsNCiAgICAgICAgY29uc3QgZCA9IHJlc3BvbnNlLmRhdGEgfHwge30NCiAgICAgICAgdGhpcy5mb3JtID0gew0KICAgICAgICAgIHh5ZGJoOiBkLnh5ZGJoIHx8ICcnLA0KICAgICAgICAgIHh5ZG1jOiBkLnh5ZG1jIHx8ICcnLA0KICAgICAgICAgIHh5ZHJzOiBkLnh5ZHJzICE9PSBudWxsICYmIGQueHlkcnMgIT09IHVuZGVmaW5lZCA/IGQueHlkcnMgOiB1bmRlZmluZWQsDQogICAgICAgICAgbmo6IGQubmogfHwgJycsDQogICAgICAgICAgenlkaDogZC56eWRoIHx8ICcnLA0KICAgICAgICAgIHp5anNiaDogZC56eWpzYmggfHwgJycsDQogICAgICAgICAgYno6IGQuYnogfHwgJycsDQogICAgICAgICAgenh6dDogZC56eHp0ICE9PSBudWxsICYmIGQuenh6dCAhPT0gdW5kZWZpbmVkID8gTnVtYmVyKGQuenh6dCkgOiAxLA0KICAgICAgICAgIHhoOiBkLnhoICE9PSBudWxsICYmIGQueGggIT09IHVuZGVmaW5lZCA/IGQueGggOiB1bmRlZmluZWQsDQogICAgICAgICAgcndsYjogZC5yd2xiIHx8ICcnLA0KICAgICAgICAgIHhzbHg6IGQueHNseCAhPT0gbnVsbCAmJiBkLnhzbHggIT09IHVuZGVmaW5lZCA/IE51bWJlcihkLnhzbHgpIDogMSwNCiAgICAgICAgICByeHJxOiB0aGlzLmZvcm1hdERhdGUoZC5yeHJxKSwNCiAgICAgICAgICBieXJxOiB0aGlzLmZvcm1hdERhdGUoZC5ieXJxKSwNCiAgICAgICAgICB4eWRseDogZC54eWRseCB8fCAnJywNCiAgICAgICAgICBweHJ3YnNoOiBkLnB4cndic2ggfHwgJycsDQogICAgICAgICAgamNsYjogZC5qY2xiIHx8ICcnLA0KICAgICAgICAgIHh0bXM6IGQueHRtcyB8fCAnJywNCiAgICAgICAgICBqc29uemQ6IGQuanNvbnpkIHx8ICcnLA0KICAgICAgICAgIGpjOiBkLmpjIHx8ICcnLA0KICAgICAgICAgIHNzZHc6IGQuc3NkdyB8fCAnJywNCiAgICAgICAgICB6dHB4cnc6IGQuenRweHJ3ICE9PSBudWxsICYmIGQuenRweHJ3ICE9PSB1bmRlZmluZWQgPyBOdW1iZXIoZC56dHB4cncpIDogMQ0KICAgICAgICB9DQogICAgICB9KS5jYXRjaCgoKSA9PiB7fSkNCiAgICB9LA0KDQogICAgYnVpbGRQYXlsb2FkKCkgew0KICAgICAgY29uc3QgZiA9IHRoaXMuZm9ybQ0KICAgICAgY29uc3QgcGF5bG9hZCA9IHsNCiAgICAgICAgeHlkYmg6IGYueHlkYmgsDQogICAgICAgIHh5ZG1jOiBmLnh5ZG1jLA0KICAgICAgICB6eWRoOiBmLnp5ZGgsDQogICAgICAgIHJ3bGI6IGYucndsYiwNCiAgICAgICAgeHlkbHg6IGYueHlkbHgsDQogICAgICAgIGpjbGI6IGYuamNsYiwNCiAgICAgICAgeHRtczogZi54dG1zLA0KICAgICAgICB6eHp0OiBOdW1iZXIoZi56eHp0KSwNCiAgICAgICAgeHNseDogTnVtYmVyKGYueHNseCksDQogICAgICAgIHp0cHhydzogTnVtYmVyKGYuenRweHJ3KQ0KICAgICAgfQ0KICAgICAgLy8g5pWw5YC85a2X5q61DQogICAgICBpZiAoZi54eWRycyAhPT0gJycgJiYgZi54eWRycyAhPT0gbnVsbCAmJiBmLnh5ZHJzICE9PSB1bmRlZmluZWQpIHBheWxvYWQueHlkcnMgPSBOdW1iZXIoZi54eWRycykNCiAgICAgIGlmIChmLnhoICE9PSAnJyAmJiBmLnhoICE9PSBudWxsICYmIGYueGggIT09IHVuZGVmaW5lZCkgcGF5bG9hZC54aCA9IE51bWJlcihmLnhoKQ0KICAgICAgLy8g5pel5pyf5a2X5q61DQogICAgICBpZiAoZi5yeHJxKSBwYXlsb2FkLnJ4cnEgPSBmLnJ4cnENCiAgICAgIGlmIChmLmJ5cnEpIHBheWxvYWQuYnlycSA9IGYuYnlycQ0KICAgICAgLy8g5YW25L2Z5paH5pys5a2X5q616Z2e56m65omN5LygDQogICAgICA7WyduaicsICd6eWpzYmgnLCAncHhyd2JzaCcsICdqc29uemQnLCAnamMnLCAnc3NkdycsICdieiddLmZvckVhY2goa2V5ID0+IHsNCiAgICAgICAgaWYgKGZba2V5XSAhPT0gJycgJiYgZltrZXldICE9PSBudWxsICYmIGZba2V5XSAhPT0gdW5kZWZpbmVkKSB7DQogICAgICAgICAgcGF5bG9hZFtrZXldID0gU3RyaW5nKGZba2V5XSkudHJpbSgpDQogICAgICAgIH0NCiAgICAgIH0pDQogICAgICByZXR1cm4gcGF5bG9hZA0KICAgIH0sDQoNCiAgICBoYW5kbGVGb3JtU3VibWl0KCkgew0KICAgICAgdGhpcy4kcmVmcy5mb3JtUmVmLnZhbGlkYXRlKHZhbGlkID0+IHsNCiAgICAgICAgaWYgKCF2YWxpZCkgcmV0dXJuDQogICAgICAgIHRoaXMuZm9ybVNhdmluZyA9IHRydWUNCiAgICAgICAgY29uc3QgcGF5bG9hZCA9IHRoaXMuYnVpbGRQYXlsb2FkKCkNCiAgICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuaXNBZGQgPyBhZGRUZWFtKHBheWxvYWQpIDogdXBkYXRlVGVhbShwYXlsb2FkKQ0KICAgICAgICByZXF1ZXN0LnRoZW4oKCkgPT4gew0KICAgICAgICAgIHRoaXMuJG1lc3NhZ2Uuc3VjY2Vzcyh0aGlzLmlzQWRkID8gJ+aWsOWinuaIkOWKnycgOiAn5L+u5pS55oiQ5YqfJykNCiAgICAgICAgICB0aGlzLmZvcm1EaWFsb2dWaXNpYmxlID0gZmFsc2UNCiAgICAgICAgICB0aGlzLmZldGNoTGlzdCgpDQogICAgICAgIH0pLmNhdGNoKCgpID0+IHsNCiAgICAgICAgfSkuZmluYWxseSgoKSA9PiB7DQogICAgICAgICAgdGhpcy5mb3JtU2F2aW5nID0gZmFsc2UNCiAgICAgICAgfSkNCiAgICAgIH0pDQogICAgfSwNCg0KICAgIC8vID09PT09PT09PT09PT09PT09PT09IOWIoOmZpCA9PT09PT09PT09PT09PT09PT09PQ0KICAgIGhhbmRsZURlbGV0ZShyb3cpIHsNCiAgICAgIHRoaXMuJGNvbmZpcm0oYOehruWumuimgeWIoOmZpOOAjCR7cm93Lnh5ZG1jIHx8IHJvdy54eWRiaH3jgI3lkJfvvJ9gLCAn57O757uf5o+Q56S6Jywgew0KICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogJ+ehruWumicsDQogICAgICAgIGNhbmNlbEJ1dHRvblRleHQ6ICflj5bmtognLA0KICAgICAgICB0eXBlOiAnd2FybmluZycNCiAgICAgIH0pLnRoZW4oKCkgPT4gew0KICAgICAgICByZXR1cm4gZGVsVGVhbShyb3cueHlkYmgpDQogICAgICB9KS50aGVuKCgpID0+IHsNCiAgICAgICAgdGhpcy4kbWVzc2FnZS5zdWNjZXNzKCfliKDpmaTmiJDlip8nKQ0KICAgICAgICB0aGlzLmZldGNoTGlzdCgpDQogICAgICB9KS5jYXRjaCgoKSA9PiB7fSkNCiAgICB9LA0KDQogICAgLy8gPT09PT09PT09PT09PT09PT09PT0g6K+m5oOFID09PT09PT09PT09PT09PT09PT09DQogICAgaGFuZGxlRGV0YWlsKHJvdykgew0KICAgICAgdGhpcy5kZXRhaWxEaWFsb2dWaXNpYmxlID0gdHJ1ZQ0KICAgICAgdGhpcy5kZXRhaWxMb2FkaW5nID0gdHJ1ZQ0KICAgICAgdGhpcy5kZXRhaWxGb3JtID0ge30NCiAgICAgIGdldFRlYW0ocm93Lnh5ZGJoKS50aGVuKHJlc3BvbnNlID0+IHsNCiAgICAgICAgdGhpcy5kZXRhaWxGb3JtID0gcmVzcG9uc2UuZGF0YSB8fCB7fQ0KICAgICAgICB0aGlzLmRldGFpbExvYWRpbmcgPSBmYWxzZQ0KICAgICAgfSkuY2F0Y2goKCkgPT4gew0KICAgICAgICB0aGlzLmRldGFpbExvYWRpbmcgPSBmYWxzZQ0KICAgICAgfSkNCiAgICB9LA0KDQogICAgLy8gPT09PT09PT09PT09PT09PT09PT0g5a+85Ye6ID09PT09PT09PT09PT09PT09PT09DQogICAgaGFuZGxlRXhwb3J0KCkgew0KICAgICAgZXhwb3J0VGVhbSh0aGlzLmJ1aWxkUXVlcnkoKSkudGhlbihibG9iID0+IHsNCiAgICAgICAgc2F2ZUFzKGJsb2IsICfnj63mrKEo5a2m5ZGY6ZifKeeuoeeQhi54bHN4JykNCiAgICAgICAgdGhpcy4kbWVzc2FnZS5zdWNjZXNzKCflr7zlh7rmiJDlip8nKQ0KICAgICAgfSkuY2F0Y2goKCkgPT4ge30pDQogICAgfSwNCg0KICAgIC8vID09PT09PT09PT09PT09PT09PT09IOaooeadv+S4i+i9vSAvIOWvvOWFpSA9PT09PT09PT09PT09PT09PT09PQ0KICAgIGhhbmRsZURvd25sb2FkVGVtcGxhdGUoKSB7DQogICAgICAvLyDlkI7nq6/mmoLmnKrmj5DkvpvmqKHmnb/kuIvovb3mjqXlj6PvvIzku4XkvZzmj5DnpLoNCiAgICAgIHRoaXMuJG1lc3NhZ2UuaW5mbygn5ZCO56uv5pqC5pyq5o+Q5L6b6K+l5o6l5Y+jJykNCiAgICB9LA0KDQogICAgaGFuZGxlQ2hvb3NlRmlsZSgpIHsNCiAgICAgIHRoaXMuJHJlZnMuZmlsZUlucHV0UmVmICYmIHRoaXMuJHJlZnMuZmlsZUlucHV0UmVmLmNsaWNrKCkNCiAgICB9LA0KDQogICAgaGFuZGxlRmlsZUNoYW5nZShlKSB7DQogICAgICBjb25zdCBpbnB1dCA9IGUudGFyZ2V0DQogICAgICB0aGlzLnNlbGVjdGVkRmlsZSA9IChpbnB1dC5maWxlcyAmJiBpbnB1dC5maWxlc1swXSkgfHwgbnVsbA0KICAgIH0sDQoNCiAgICBoYW5kbGVVcGxvYWQoKSB7DQogICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRGaWxlKSB7DQogICAgICAgIHRoaXMuJG1lc3NhZ2Uud2FybmluZygn6K+35YWI6YCJ5oup5paH5Lu2JykNCiAgICAgICAgcmV0dXJuDQogICAgICB9DQogICAgICB0aGlzLnVwbG9hZGluZyA9IHRydWUNCiAgICAgIGltcG9ydFRlYW0odGhpcy5zZWxlY3RlZEZpbGUpLnRoZW4ocmVzID0+IHsNCiAgICAgICAgY29uc3QgY291bnQgPSByZXMgJiYgcmVzLmRhdGENCiAgICAgICAgaWYgKGNvdW50ICE9PSBudWxsICYmIGNvdW50ICE9PSB1bmRlZmluZWQpIHsNCiAgICAgICAgICB0aGlzLiRtZXNzYWdlLnN1Y2Nlc3MoYOWvvOWFpeaIkOWKn++8jOWFsSAke2NvdW50fSDmnaHorrDlvZVgKQ0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIHRoaXMuJG1lc3NhZ2Uuc3VjY2VzcygocmVzICYmIHJlcy5tc2cpIHx8ICflr7zlhaXmiJDlip8nKQ0KICAgICAgICB9DQogICAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlID0gbnVsbA0KICAgICAgICB0aGlzLiRyZWZzLmZpbGVJbnB1dFJlZiAmJiAodGhpcy4kcmVmcy5maWxlSW5wdXRSZWYudmFsdWUgPSAnJykNCiAgICAgICAgdGhpcy5wYWdlTnVtID0gMQ0KICAgICAgICB0aGlzLmZldGNoTGlzdCgpDQogICAgICB9KS5jYXRjaCgoKSA9PiB7fSkuZmluYWxseSgoKSA9PiB7DQogICAgICAgIHRoaXMudXBsb2FkaW5nID0gZmFsc2UNCiAgICAgIH0pDQogICAgfQ0KICB9DQp9DQo="},{"version":3,"sources":["index.vue"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwSA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;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;;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;;AAEA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;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;;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;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;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","file":"index.vue","sourceRoot":"src/views/student/shiftTeam","sourcesContent":["<template>\r\n <div class=\"app-container shift-team-page\">\r\n <!-- ==================== 1. 查询条件 ==================== -->\r\n <el-card shadow=\"never\" class=\"search-card\">\r\n <el-form ref=\"searchFormRef\" :model=\"searchForm\" label-width=\"90px\" class=\"search-form\">\r\n <el-row :gutter=\"24\">\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"12\" :lg=\"8\" :xl=\"8\">\r\n <el-form-item label=\"学员队名称\">\r\n <el-input v-model=\"searchForm.xydmc\" placeholder=\"请输入学员队名称\" clearable @keyup.enter.native=\"handleSearch\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"12\" :lg=\"8\" :xl=\"8\">\r\n <el-form-item label=\"年级\">\r\n <el-input v-model=\"searchForm.nj\" placeholder=\"请输入年级\" clearable @keyup.enter.native=\"handleSearch\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"12\" :lg=\"8\" :xl=\"8\">\r\n <el-form-item label=\"专业代号\">\r\n <el-input v-model=\"searchForm.zydh\" placeholder=\"请输入专业代号\" clearable @keyup.enter.native=\"handleSearch\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"12\" :lg=\"8\" :xl=\"8\">\r\n <el-form-item label=\"学员队类型\">\r\n <el-input v-model=\"searchForm.xydlx\" placeholder=\"请输入学员队类型\" clearable @keyup.enter.native=\"handleSearch\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"12\" :lg=\"8\" :xl=\"8\">\r\n <el-form-item label=\"任务类别\">\r\n <el-input v-model=\"searchForm.rwlb\" placeholder=\"请输入任务类别\" clearable @keyup.enter.native=\"handleSearch\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"12\" :lg=\"8\" :xl=\"8\">\r\n <el-form-item label=\"虚实类型\">\r\n <el-select v-model=\"searchForm.xslx\" placeholder=\"请选择虚实类型\" clearable class=\"w-full\">\r\n <el-option label=\"虚\" :value=\"0\" />\r\n <el-option label=\"实\" :value=\"1\" />\r\n </el-select>\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row class=\"search-actions-row\">\r\n <el-col :span=\"24\" class=\"search-actions\">\r\n <el-button type=\"primary\" icon=\"el-icon-search\" @click=\"handleSearch\">查询</el-button>\r\n <el-button icon=\"el-icon-refresh\" @click=\"handleReset\">重置</el-button>\r\n </el-col>\r\n </el-row>\r\n </el-form>\r\n </el-card>\r\n\r\n <!-- ==================== 2. 工具栏:新增 / 导入 / 导出 ==================== -->\r\n <div class=\"toolbar\">\r\n <el-button type=\"primary\" icon=\"el-icon-plus\" @click=\"handleAdd\">新增学员队</el-button>\r\n <el-button icon=\"el-icon-download\" @click=\"handleExport\">导出 Excel</el-button>\r\n <el-button icon=\"el-icon-download\" @click=\"handleDownloadTemplate\">模板下载</el-button>\r\n <div class=\"file-input\">\r\n <input ref=\"fileInputRef\" type=\"file\" accept=\".xls,.xlsx\" style=\"display: none\" @change=\"handleFileChange\" />\r\n <el-button icon=\"el-icon-folder-opened\" @click=\"handleChooseFile\">选择文件</el-button>\r\n <span class=\"file-name\">{{ fileName }}</span>\r\n <el-button type=\"primary\" icon=\"el-icon-upload2\" :loading=\"uploading\" @click=\"handleUpload\">上传数据</el-button>\r\n </div>\r\n </div>\r\n\r\n <!-- ==================== 3. 列表 ==================== -->\r\n <el-card shadow=\"never\" class=\"table-card\">\r\n <div class=\"table-header\">\r\n <span class=\"table-title\">教学班次列表:</span>\r\n </div>\r\n <el-table v-loading=\"loading\" :data=\"tableData\" stripe border highlight-current-row>\r\n <el-table-column prop=\"xydbh\" label=\"学员队编号\" min-width=\"120\" show-overflow-tooltip />\r\n <el-table-column prop=\"xydmc\" label=\"学员队名称\" min-width=\"130\" show-overflow-tooltip />\r\n <el-table-column prop=\"nj\" label=\"年级\" width=\"90\" align=\"center\" />\r\n <el-table-column prop=\"zydh\" label=\"专业代号\" min-width=\"110\" show-overflow-tooltip />\r\n <el-table-column prop=\"rwlb\" label=\"任务类别\" width=\"100\" align=\"center\" />\r\n <el-table-column label=\"虚实类型\" width=\"90\" align=\"center\">\r\n <template slot-scope=\"{ row }\">\r\n <el-tag :type=\"Number(row.xslx) === 1 ? 'success' : 'info'\" size=\"mini\">\r\n {{ Number(row.xslx) === 1 ? '实' : '虚' }}\r\n </el-tag>\r\n </template>\r\n </el-table-column>\r\n <el-table-column label=\"在校状态\" width=\"90\" align=\"center\">\r\n <template slot-scope=\"{ row }\">\r\n <el-tag :type=\"Number(row.zxzt) === 1 ? 'success' : 'danger'\" size=\"mini\">\r\n {{ Number(row.zxzt) === 1 ? '在校' : '毕业' }}\r\n </el-tag>\r\n </template>\r\n </el-table-column>\r\n <el-table-column prop=\"xydrs\" label=\"人数\" width=\"80\" align=\"center\" />\r\n <el-table-column label=\"入学日期\" width=\"110\" align=\"center\">\r\n <template slot-scope=\"{ row }\">{{ formatDate(row.rxrq) }}</template>\r\n </el-table-column>\r\n <el-table-column label=\"毕业日期\" width=\"110\" align=\"center\">\r\n <template slot-scope=\"{ row }\">{{ formatDate(row.byrq) }}</template>\r\n </el-table-column>\r\n <el-table-column label=\"操作\" width=\"190\" align=\"center\" fixed=\"right\">\r\n <template slot-scope=\"{ row }\">\r\n <el-button type=\"text\" size=\"small\" icon=\"el-icon-view\" @click=\"handleDetail(row)\">详情</el-button>\r\n <el-button type=\"text\" size=\"small\" icon=\"el-icon-edit\" @click=\"handleEdit(row)\">编辑</el-button>\r\n <el-button type=\"text\" size=\"small\" class=\"text-danger\" @click=\"handleDelete(row)\">删除</el-button>\r\n </template>\r\n </el-table-column>\r\n </el-table>\r\n\r\n <el-pagination\r\n :current-page=\"pageNum\"\r\n :page-size=\"pageSize\"\r\n :total=\"total\"\r\n :page-sizes=\"[10, 20, 50, 100]\"\r\n layout=\"total, sizes, prev, pager, next, jumper\"\r\n class=\"pagination-wrapper\"\r\n @current-change=\"handlePageChange\"\r\n @size-change=\"handleSizeChange\"\r\n />\r\n </el-card>\r\n\r\n <!-- ==================== 4. 新增/编辑对话框 ==================== -->\r\n <el-dialog\r\n :visible=\"formDialogVisible\"\r\n :title=\"dialogTitle\"\r\n width=\"760px\"\r\n :close-on-click-modal=\"false\"\r\n @update:visible=\"val => formDialogVisible = val\"\r\n >\r\n <el-form ref=\"formRef\" :model=\"form\" :rules=\"formRules\" label-width=\"130px\" class=\"form-dialog-form\">\r\n <el-divider content-position=\"left\">基本信息</el-divider>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"学员队编号\" prop=\"xydbh\">\r\n <el-input v-model=\"form.xydbh\" placeholder=\"请输入学员队编号\" :disabled=\"!isAdd\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"学员队名称\" prop=\"xydmc\">\r\n <el-input v-model=\"form.xydmc\" placeholder=\"请输入学员队名称\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"学员队人数\" prop=\"xydrs\">\r\n <el-input-number v-model=\"form.xydrs\" :min=\"0\" controls-position=\"right\" style=\"width: 100%\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"年级\">\r\n <el-input v-model=\"form.nj\" placeholder=\"请输入年级\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"专业代号\" prop=\"zydh\">\r\n <el-input v-model=\"form.zydh\" placeholder=\"请输入专业代号\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"专业教室编号\">\r\n <el-input v-model=\"form.zyjsbh\" placeholder=\"请输入专业教室编号\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"学员队类型\" prop=\"xydlx\">\r\n <el-input v-model=\"form.xydlx\" placeholder=\"请输入学员队类型\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"节次类别\" prop=\"jclb\">\r\n <el-input v-model=\"form.jclb\" placeholder=\"请输入节次类别\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"系统模式\" prop=\"xtms\">\r\n <el-input v-model=\"form.xtms\" placeholder=\"请输入系统模式\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"简称\">\r\n <el-input v-model=\"form.jc\" placeholder=\"请输入简称\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"所属单位\">\r\n <el-input v-model=\"form.ssdw\" placeholder=\"请输入所属单位\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"序号\">\r\n <el-input-number v-model=\"form.xh\" :min=\"0\" controls-position=\"right\" style=\"width: 100%\" />\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n\r\n <el-divider content-position=\"left\">培训与状态</el-divider>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"任务类别\" prop=\"rwlb\">\r\n <el-input v-model=\"form.rwlb\" placeholder=\"请输入任务类别\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"虚实类型\" prop=\"xslx\">\r\n <el-select v-model=\"form.xslx\" class=\"w-full\">\r\n <el-option label=\"虚\" :value=\"0\" />\r\n <el-option label=\"实\" :value=\"1\" />\r\n </el-select>\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"主体培训任务\" prop=\"ztpxrw\">\r\n <el-select v-model=\"form.ztpxrw\" class=\"w-full\">\r\n <el-option label=\"是\" :value=\"1\" />\r\n <el-option label=\"否\" :value=\"0\" />\r\n </el-select>\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"培训任务标识号\">\r\n <el-input v-model=\"form.pxrwbsh\" placeholder=\"请输入培训任务标识号\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"在校状态\">\r\n <el-select v-model=\"form.zxzt\" class=\"w-full\">\r\n <el-option label=\"在校\" :value=\"1\" />\r\n <el-option label=\"毕业\" :value=\"0\" />\r\n </el-select>\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"入学日期\" prop=\"rxrq\">\r\n <el-date-picker v-model=\"form.rxrq\" type=\"date\" value-format=\"yyyy-MM-dd\" placeholder=\"请选择入学日期\" style=\"width: 100%\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"毕业日期\" prop=\"byrq\">\r\n <el-date-picker v-model=\"form.byrq\" type=\"date\" value-format=\"yyyy-MM-dd\" placeholder=\"请选择毕业日期\" style=\"width: 100%\" />\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-form-item label=\"JSON字段\">\r\n <el-input v-model=\"form.jsonzd\" placeholder=\"请输入 JSON 字段\" />\r\n </el-form-item>\r\n <el-form-item label=\"备注\">\r\n <el-input v-model=\"form.bz\" type=\"textarea\" :rows=\"2\" placeholder=\"请输入备注\" />\r\n </el-form-item>\r\n </el-form>\r\n <div slot=\"footer\">\r\n <el-button @click=\"formDialogVisible = false\">取消</el-button>\r\n <el-button type=\"primary\" :loading=\"formSaving\" @click=\"handleFormSubmit\">确定</el-button>\r\n </div>\r\n </el-dialog>\r\n\r\n <!-- ==================== 5. 详情对话框 ==================== -->\r\n <el-dialog title=\"学员队详情\" :visible=\"detailDialogVisible\" width=\"720px\" :close-on-click-modal=\"false\"\r\n @update:visible=\"val => detailDialogVisible = val\">\r\n <div v-loading=\"detailLoading\" class=\"detail-body\">\r\n <el-descriptions :column=\"2\" border>\r\n <el-descriptions-item label=\"学员队编号\">{{ detailForm.xydbh || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"学员队名称\">{{ detailForm.xydmc || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"学员队人数\">{{ fmtValue(detailForm.xydrs) }}</el-descriptions-item>\r\n <el-descriptions-item label=\"年级\">{{ detailForm.nj || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"专业代号\">{{ detailForm.zydh || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"专业教室编号\">{{ detailForm.zyjsbh || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"学员队类型\">{{ detailForm.xydlx || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"节次类别\">{{ detailForm.jclb || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"系统模式\">{{ detailForm.xtms || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"简称\">{{ detailForm.jc || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"所属单位\">{{ detailForm.ssdw || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"序号\">{{ fmtValue(detailForm.xh) }}</el-descriptions-item>\r\n <el-descriptions-item label=\"任务类别\">{{ detailForm.rwlb || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"虚实类型\">\r\n <el-tag :type=\"Number(detailForm.xslx) === 1 ? 'success' : 'info'\" size=\"mini\">\r\n {{ Number(detailForm.xslx) === 1 ? '实' : '虚' }}\r\n </el-tag>\r\n </el-descriptions-item>\r\n <el-descriptions-item label=\"主体培训任务\">\r\n <el-tag :type=\"Number(detailForm.ztpxrw) === 1 ? 'success' : 'info'\" size=\"mini\">\r\n {{ Number(detailForm.ztpxrw) === 1 ? '是' : '否' }}\r\n </el-tag>\r\n </el-descriptions-item>\r\n <el-descriptions-item label=\"培训任务标识号\">{{ detailForm.pxrwbsh || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"在校状态\">\r\n <el-tag :type=\"Number(detailForm.zxzt) === 1 ? 'success' : 'danger'\" size=\"mini\">\r\n {{ Number(detailForm.zxzt) === 1 ? '在校' : '毕业' }}\r\n </el-tag>\r\n </el-descriptions-item>\r\n <el-descriptions-item label=\"入学日期\">{{ detailForm.rxrq || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"毕业日期\">{{ detailForm.byrq || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"JSON字段\" :span=\"2\">{{ detailForm.jsonzd || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"备注\" :span=\"2\">{{ detailForm.bz || '-' }}</el-descriptions-item>\r\n </el-descriptions>\r\n </div>\r\n <div slot=\"footer\">\r\n <el-button @click=\"detailDialogVisible = false\">关闭</el-button>\r\n </div>\r\n </el-dialog>\r\n </div>\r\n</template>\r\n\r\n<script>\r\nimport { saveAs } from 'file-saver'\r\nimport {\r\n listTeam,\r\n getTeam,\r\n addTeam,\r\n updateTeam,\r\n delTeam,\r\n importTeam,\r\n exportTeam\r\n} from '@/api/studentRecords/team'\r\n\r\nexport default {\r\n name: 'ShiftTeamIndex',\r\n data() {\r\n return {\r\n // ==================== 查询条件 ====================\r\n searchForm: {\r\n xydmc: '',\r\n nj: '',\r\n zydh: '',\r\n xydlx: '',\r\n rwlb: '',\r\n xslx: undefined\r\n },\r\n\r\n // ==================== 文件导入 ====================\r\n selectedFile: null,\r\n uploading: false,\r\n\r\n // ==================== 列表数据 ====================\r\n loading: false,\r\n tableData: [],\r\n total: 0,\r\n pageNum: 1,\r\n pageSize: 20,\r\n\r\n // ==================== 新增/编辑 ====================\r\n formDialogVisible: false,\r\n dialogTitle: '新增学员队',\r\n isAdd: true,\r\n formSaving: false,\r\n form: this.createEmptyForm(),\r\n formRules: {\r\n xydbh: [{ required: true, message: '请输入学员队编号', trigger: 'blur' }],\r\n xydmc: [{ required: true, message: '请输入学员队名称', trigger: 'blur' }],\r\n xydrs: [{ required: true, message: '请输入学员队人数', trigger: 'change' }],\r\n zydh: [{ required: true, message: '请输入专业代号', trigger: 'blur' }],\r\n rwlb: [{ required: true, message: '请输入任务类别', trigger: 'blur' }],\r\n xslx: [{ required: true, message: '请选择虚实类型', trigger: 'change' }],\r\n rxrq: [{ required: true, message: '请选择入学日期', trigger: 'change' }],\r\n byrq: [{ required: true, message: '请选择毕业日期', trigger: 'change' }],\r\n xydlx: [{ required: true, message: '请输入学员队类型', trigger: 'blur' }],\r\n jclb: [{ required: true, message: '请输入节次类别', trigger: 'blur' }],\r\n xtms: [{ required: true, message: '请输入系统模式', trigger: 'blur' }],\r\n ztpxrw: [{ required: true, message: '请选择主体培训任务', trigger: 'change' }]\r\n },\r\n\r\n // ==================== 详情 ====================\r\n detailDialogVisible: false,\r\n detailLoading: false,\r\n detailForm: {}\r\n }\r\n },\r\n computed: {\r\n fileName() {\r\n return (this.selectedFile && this.selectedFile.name) || '未选择任何文件'\r\n }\r\n },\r\n mounted() {\r\n this.fetchList()\r\n },\r\n methods: {\r\n createEmptyForm() {\r\n return {\r\n xydbh: '',\r\n xydmc: '',\r\n xydrs: undefined,\r\n nj: '',\r\n zydh: '',\r\n zyjsbh: '',\r\n bz: '',\r\n zxzt: 1,\r\n xh: undefined,\r\n rwlb: '',\r\n xslx: 1,\r\n rxrq: '',\r\n byrq: '',\r\n xydlx: '',\r\n pxrwbsh: '',\r\n jclb: '',\r\n xtms: '',\r\n jsonzd: '',\r\n jc: '',\r\n ssdw: '',\r\n ztpxrw: 1\r\n }\r\n },\r\n\r\n // ==================== 日期/数值展示 ====================\r\n formatDate(val) {\r\n if (!val) return ''\r\n return String(val).substring(0, 10)\r\n },\r\n fmtValue(val) {\r\n return val === null || val === undefined || val === '' ? '-' : val\r\n },\r\n\r\n /** 构建查询条件(不含分页),供列表查询与导出共用 */\r\n buildQuery() {\r\n const params = {}\r\n ;['xydmc', 'nj', 'zydh', 'xydlx', 'rwlb'].forEach(key => {\r\n const value = this.searchForm[key]\r\n if (value !== '' && value !== null && value !== undefined) {\r\n params[key] = String(value).trim()\r\n }\r\n })\r\n if (this.searchForm.xslx !== undefined && this.searchForm.xslx !== '' && this.searchForm.xslx !== null) {\r\n params.xslx = this.searchForm.xslx\r\n }\r\n return params\r\n },\r\n\r\n // ==================== 查询列表 ====================\r\n fetchList() {\r\n this.loading = true\r\n const params = {\r\n pageNum: this.pageNum,\r\n pageSize: this.pageSize,\r\n ...this.buildQuery()\r\n }\r\n listTeam(params).then(response => {\r\n const data = response.data || {}\r\n this.tableData = data.records || []\r\n this.total = data.total || 0\r\n this.loading = false\r\n }).catch(() => {\r\n this.tableData = []\r\n this.total = 0\r\n this.loading = false\r\n })\r\n },\r\n\r\n handleSearch() {\r\n this.pageNum = 1\r\n this.fetchList()\r\n },\r\n\r\n handleReset() {\r\n this.$refs.searchFormRef.resetFields()\r\n this.pageNum = 1\r\n this.fetchList()\r\n },\r\n\r\n handlePageChange(current) {\r\n this.pageNum = current\r\n this.fetchList()\r\n },\r\n\r\n handleSizeChange(size) {\r\n this.pageSize = size\r\n this.pageNum = 1\r\n this.fetchList()\r\n },\r\n\r\n // ==================== 新增/编辑 ====================\r\n handleAdd() {\r\n this.isAdd = true\r\n this.dialogTitle = '新增学员队'\r\n this.form = this.createEmptyForm()\r\n this.formDialogVisible = true\r\n this.$nextTick(() => {\r\n this.$refs.formRef && this.$refs.formRef.clearValidate()\r\n })\r\n },\r\n\r\n handleEdit(row) {\r\n this.isAdd = false\r\n this.dialogTitle = '编辑学员队'\r\n this.form = this.createEmptyForm()\r\n this.formDialogVisible = true\r\n this.$nextTick(() => {\r\n this.$refs.formRef && this.$refs.formRef.clearValidate()\r\n })\r\n getTeam(row.xydbh).then(response => {\r\n const d = response.data || {}\r\n this.form = {\r\n xydbh: d.xydbh || '',\r\n xydmc: d.xydmc || '',\r\n xydrs: d.xydrs !== null && d.xydrs !== undefined ? d.xydrs : undefined,\r\n nj: d.nj || '',\r\n zydh: d.zydh || '',\r\n zyjsbh: d.zyjsbh || '',\r\n bz: d.bz || '',\r\n zxzt: d.zxzt !== null && d.zxzt !== undefined ? Number(d.zxzt) : 1,\r\n xh: d.xh !== null && d.xh !== undefined ? d.xh : undefined,\r\n rwlb: d.rwlb || '',\r\n xslx: d.xslx !== null && d.xslx !== undefined ? Number(d.xslx) : 1,\r\n rxrq: this.formatDate(d.rxrq),\r\n byrq: this.formatDate(d.byrq),\r\n xydlx: d.xydlx || '',\r\n pxrwbsh: d.pxrwbsh || '',\r\n jclb: d.jclb || '',\r\n xtms: d.xtms || '',\r\n jsonzd: d.jsonzd || '',\r\n jc: d.jc || '',\r\n ssdw: d.ssdw || '',\r\n ztpxrw: d.ztpxrw !== null && d.ztpxrw !== undefined ? Number(d.ztpxrw) : 1\r\n }\r\n }).catch(() => {})\r\n },\r\n\r\n buildPayload() {\r\n const f = this.form\r\n const payload = {\r\n xydbh: f.xydbh,\r\n xydmc: f.xydmc,\r\n zydh: f.zydh,\r\n rwlb: f.rwlb,\r\n xydlx: f.xydlx,\r\n jclb: f.jclb,\r\n xtms: f.xtms,\r\n zxzt: Number(f.zxzt),\r\n xslx: Number(f.xslx),\r\n ztpxrw: Number(f.ztpxrw)\r\n }\r\n // 数值字段\r\n if (f.xydrs !== '' && f.xydrs !== null && f.xydrs !== undefined) payload.xydrs = Number(f.xydrs)\r\n if (f.xh !== '' && f.xh !== null && f.xh !== undefined) payload.xh = Number(f.xh)\r\n // 日期字段\r\n if (f.rxrq) payload.rxrq = f.rxrq\r\n if (f.byrq) payload.byrq = f.byrq\r\n // 其余文本字段非空才传\r\n ;['nj', 'zyjsbh', 'pxrwbsh', 'jsonzd', 'jc', 'ssdw', 'bz'].forEach(key => {\r\n if (f[key] !== '' && f[key] !== null && f[key] !== undefined) {\r\n payload[key] = String(f[key]).trim()\r\n }\r\n })\r\n return payload\r\n },\r\n\r\n handleFormSubmit() {\r\n this.$refs.formRef.validate(valid => {\r\n if (!valid) return\r\n this.formSaving = true\r\n const payload = this.buildPayload()\r\n const request = this.isAdd ? addTeam(payload) : updateTeam(payload)\r\n request.then(() => {\r\n this.$message.success(this.isAdd ? '新增成功' : '修改成功')\r\n this.formDialogVisible = false\r\n this.fetchList()\r\n }).catch(() => {\r\n }).finally(() => {\r\n this.formSaving = false\r\n })\r\n })\r\n },\r\n\r\n // ==================== 删除 ====================\r\n handleDelete(row) {\r\n this.$confirm(`确定要删除「${row.xydmc || row.xydbh}」吗?`, '系统提示', {\r\n confirmButtonText: '确定',\r\n cancelButtonText: '取消',\r\n type: 'warning'\r\n }).then(() => {\r\n return delTeam(row.xydbh)\r\n }).then(() => {\r\n this.$message.success('删除成功')\r\n this.fetchList()\r\n }).catch(() => {})\r\n },\r\n\r\n // ==================== 详情 ====================\r\n handleDetail(row) {\r\n this.detailDialogVisible = true\r\n this.detailLoading = true\r\n this.detailForm = {}\r\n getTeam(row.xydbh).then(response => {\r\n this.detailForm = response.data || {}\r\n this.detailLoading = false\r\n }).catch(() => {\r\n this.detailLoading = false\r\n })\r\n },\r\n\r\n // ==================== 导出 ====================\r\n handleExport() {\r\n exportTeam(this.buildQuery()).then(blob => {\r\n saveAs(blob, '班次(学员队)管理.xlsx')\r\n this.$message.success('导出成功')\r\n }).catch(() => {})\r\n },\r\n\r\n // ==================== 模板下载 / 导入 ====================\r\n handleDownloadTemplate() {\r\n // 后端暂未提供模板下载接口,仅作提示\r\n this.$message.info('后端暂未提供该接口')\r\n },\r\n\r\n handleChooseFile() {\r\n this.$refs.fileInputRef && this.$refs.fileInputRef.click()\r\n },\r\n\r\n handleFileChange(e) {\r\n const input = e.target\r\n this.selectedFile = (input.files && input.files[0]) || null\r\n },\r\n\r\n handleUpload() {\r\n if (!this.selectedFile) {\r\n this.$message.warning('请先选择文件')\r\n return\r\n }\r\n this.uploading = true\r\n importTeam(this.selectedFile).then(res => {\r\n const count = res && res.data\r\n if (count !== null && count !== undefined) {\r\n this.$message.success(`导入成功,共 ${count} 条记录`)\r\n } else {\r\n this.$message.success((res && res.msg) || '导入成功')\r\n }\r\n this.selectedFile = null\r\n this.$refs.fileInputRef && (this.$refs.fileInputRef.value = '')\r\n this.pageNum = 1\r\n this.fetchList()\r\n }).catch(() => {}).finally(() => {\r\n this.uploading = false\r\n })\r\n }\r\n }\r\n}\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n.app-container {\r\n padding: 20px;\r\n}\r\n\r\n.shift-team-page {\r\n .search-card {\r\n margin-bottom: 16px;\r\n\r\n .search-form {\r\n .w-full {\r\n width: 100%;\r\n }\r\n\r\n .search-actions-row {\r\n margin-top: 2px;\r\n border-top: 1px dashed #ebeef5;\r\n padding-top: 14px;\r\n }\r\n\r\n .search-actions {\r\n display: flex;\r\n align-items: center;\r\n justify-content: flex-end;\r\n gap: 12px;\r\n }\r\n }\r\n }\r\n\r\n .toolbar {\r\n display: flex;\r\n align-items: center;\r\n gap: 12px;\r\n flex-wrap: wrap;\r\n margin-bottom: 16px;\r\n\r\n .file-input {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n\r\n .file-name {\r\n font-size: 12px;\r\n color: #909399;\r\n max-width: 180px;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n }\r\n }\r\n }\r\n\r\n .table-card {\r\n .table-header {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n margin-bottom: 16px;\r\n\r\n .table-title {\r\n font-size: 16px;\r\n font-weight: 600;\r\n color: #303133;\r\n }\r\n }\r\n\r\n .pagination-wrapper {\r\n display: flex;\r\n justify-content: flex-end;\r\n margin-top: 16px;\r\n }\r\n }\r\n\r\n .form-dialog-form {\r\n max-height: 62vh;\r\n overflow-y: auto;\r\n padding-right: 6px;\r\n\r\n ::v-deep .el-divider--horizontal {\r\n margin: 4px 0 16px;\r\n }\r\n }\r\n\r\n .text-danger {\r\n color: #f56c6c;\r\n padding: 0;\r\n }\r\n}\r\n</style>\r\n"]}]} |