forked from liweijie/education
1 line
34 KiB
JSON
1 line
34 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\\taskPlan\\index.vue?vue&type=script&lang=js","dependencies":[{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\src\\views\\teachOffice\\taskPlan\\index.vue","mtime":1787648748791},{"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:Ly8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KDQovKioNCiAqIOaVmeWtpuS7u+WKoeiuoeWIkueuoeeQhu+8iOWujOaVtOeuoeeQhumhte+8iQ0KICog5a+55bqU6I+c5Y2V77yadGVhY2hPZmZpY2UvdGFza1BsYW4NCiAqIOaPkOS+myB0ZWFjaGluZ1Rhc2sg5YWo5aWX55yf5a6e5o6l5Y+j5pON5L2c77ya5YiG6aG15p+l6K+iIGxpc3TjgIHor6bmg4UgZ2V0P2JoPeOAgeaWsOWiniBhZGTjgIHnvJbovpEgdXBkYXRl44CBDQogKiDlj5HluIMgYmF0Y2hQdWJsaXNoP2JoPe+8iOmcgOWFiOWhq+WGmeaVmeeglOWupOS7u+WKoeS5pu+8ieOAgeWIoOmZpCBkZWxldGU/Ymg977yI57qn6IGU5Yig6Zmk5pWZ56CU5a6k5Lu75Yqh5Lmm77yJDQogKiDlj6ror7vmn6Xor6Lop4blm77lnKggc3JjL3ZpZXdzL3RlYWNoQnVzaW5lc3MvdGVhY2hpbmdUYXNrL2luZGV4LnZ1Ze+8iOaVmeWtpuS7u+WKoeWIl+ihqO+8ieaPkOS+m++8jOmBv+WFjemHjeWkjeaTjeS9nOWQjOS4gOWunuS9kw0KICovDQppbXBvcnQgew0KICBsaXN0VGVhY2hpbmdUYXNrLA0KICBnZXRUZWFjaGluZ1Rhc2ssDQogIGFkZFRlYWNoaW5nVGFzaywNCiAgdXBkYXRlVGVhY2hpbmdUYXNrLA0KICBkZWxldGVUZWFjaGluZ1Rhc2ssDQogIHB1Ymxpc2hUZWFjaGluZ1Rhc2sNCn0gZnJvbSAnQC9hcGkvdGVhY2hCdXNpbmVzcy90ZWFjaGluZ1Rhc2snDQppbXBvcnQgeyBsaXN0QWxsU2VtZXN0ZXIgfSBmcm9tICdAL2FwaS90ZWFjaEJ1c2luZXNzL3NlbWVzdGVyJw0KDQpleHBvcnQgZGVmYXVsdCB7DQogIG5hbWU6ICdUYXNrUGxhbicsDQogIGRhdGEoKSB7DQogICAgcmV0dXJuIHsNCiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09IDEuIOafpeivouadoeS7tiA9PT09PT09PT09PT09PT09PT09PQ0KICAgICAgc2VhcmNoRm9ybTogew0KICAgICAgICByd21jOiAnJywNCiAgICAgICAgbmQ6IHVuZGVmaW5lZCwNCiAgICAgICAgenQ6ICcnDQogICAgICB9LA0KICAgICAgeWVhck9wdGlvbnM6IFtdLA0KICAgICAgc3RhdHVzT3B0aW9uczogWw0KICAgICAgICB7IGxhYmVsOiAn5pyq5Y+R5biDJywgdmFsdWU6ICfmnKrlj5HluIMnIH0sDQogICAgICAgIHsgbGFiZWw6ICflj5HluIMnLCB2YWx1ZTogJ+WPkeW4gycgfQ0KICAgICAgXSwNCg0KICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT0gMi4g6KGo5qC85pWw5o2uID09PT09PT09PT09PT09PT09PT09DQogICAgICBsb2FkaW5nOiBmYWxzZSwNCiAgICAgIHRhYmxlRGF0YTogW10sDQogICAgICBwYWdlTnVtOiAxLA0KICAgICAgcGFnZVNpemU6IDEwLA0KICAgICAgdG90YWw6IDAsDQoNCiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09IDMuIOaWsOWini/kv67mlLnooajljZUgPT09PT09PT09PT09PT09PT09PT0NCiAgICAgIGRpYWxvZ1Zpc2libGU6IGZhbHNlLA0KICAgICAgZGlhbG9nVGl0bGU6ICfmlrDlu7rmlZnlrabku7vliqEnLA0KICAgICAgaXNFZGl0OiBmYWxzZSwNCiAgICAgIHNhdmluZzogZmFsc2UsDQogICAgICBmb3JtOiB0aGlzLmNyZWF0ZUVtcHR5Rm9ybSgpLA0KICAgICAgcnVsZXM6IHsNCiAgICAgICAgcndtYzogW3sgcmVxdWlyZWQ6IHRydWUsIG1lc3NhZ2U6ICfor7fovpPlhaXku7vliqHlkI3np7AnLCB0cmlnZ2VyOiAnYmx1cicgfV0sDQogICAgICAgIG5kOiBbeyByZXF1aXJlZDogdHJ1ZSwgbWVzc2FnZTogJ+ivt+mAieaLqeW5tOW6picsIHRyaWdnZXI6ICdjaGFuZ2UnIH1dLA0KICAgICAgICB6dDogW3sgcmVxdWlyZWQ6IHRydWUsIG1lc3NhZ2U6ICfor7fpgInmi6nnirbmgIEnLCB0cmlnZ2VyOiAnY2hhbmdlJyB9XQ0KICAgICAgfSwNCg0KICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT0gNC4g6K+m5oOFID09PT09PT09PT09PT09PT09PT09DQogICAgICBkZXRhaWxWaXNpYmxlOiBmYWxzZSwNCiAgICAgIGRldGFpbExvYWRpbmc6IGZhbHNlLA0KICAgICAgZGV0YWlsRGF0YToge30NCiAgICB9DQogIH0sDQogIGNyZWF0ZWQoKSB7DQogICAgdGhpcy5sb2FkWWVhck9wdGlvbnMoKS50aGVuKCgpID0+IHRoaXMuZmV0Y2hMaXN0KCkpDQogIH0sDQogIG1ldGhvZHM6IHsNCiAgICAvKiAtLS0tLS0tLS0tIOW5tOW6puS4i+aLie+8iOaVsOaNruadpeiHqiAvc2VtZXN0ZXIvYWxs77yM56aB5q2i56Gs57yW56CB77yJIC0tLS0tLS0tLS0gKi8NCiAgICBsb2FkWWVhck9wdGlvbnMoKSB7DQogICAgICByZXR1cm4gbGlzdEFsbFNlbWVzdGVyKCkudGhlbihyZXNwb25zZSA9PiB7DQogICAgICAgIGNvbnN0IGxpc3QgPSByZXNwb25zZS5kYXRhIHx8IFtdDQogICAgICAgIGNvbnN0IG1hcCA9IHt9DQogICAgICAgIGxpc3QuZm9yRWFjaChpdGVtID0+IHsNCiAgICAgICAgICBpZiAoaXRlbS5uZCAhPT0gbnVsbCAmJiBpdGVtLm5kICE9PSB1bmRlZmluZWQgJiYgaXRlbS5uZCAhPT0gJycpIG1hcFtpdGVtLm5kXSA9IGl0ZW0NCiAgICAgICAgfSkNCiAgICAgICAgY29uc3QgYXJyID0gT2JqZWN0LmtleXMobWFwKS5zb3J0KChhLCBiKSA9PiBTdHJpbmcoYikubG9jYWxlQ29tcGFyZShTdHJpbmcoYSkpKQ0KICAgICAgICB0aGlzLnllYXJPcHRpb25zID0gYXJyDQogICAgICAgIC8vIOm7mOiupOW5tOW6pu+8muS8mOWFiOW9k+WJjeWtpuacnyhkcXhxPXRydWUp77yM5ZCm5YiZ5Y+W5pyA5paw5bm05bqmDQogICAgICAgIGNvbnN0IGN1cnJlbnQgPSBsaXN0LmZpbmQoaXRlbSA9PiBpdGVtLmRxeHEgPT09IHRydWUpDQogICAgICAgIGNvbnN0IGRlZmF1bHROZCA9IChjdXJyZW50ICYmIGN1cnJlbnQubmQpIHx8IGFyclswXQ0KICAgICAgICBpZiAoIXRoaXMuc2VhcmNoRm9ybS5uZCkgdGhpcy5zZWFyY2hGb3JtLm5kID0gZGVmYXVsdE5kDQogICAgICAgIHJldHVybiBhcnINCiAgICAgIH0pLmNhdGNoKCgpID0+IHsNCiAgICAgICAgdGhpcy55ZWFyT3B0aW9ucyA9IFtdDQogICAgICAgIHJldHVybiBbXQ0KICAgICAgfSkNCiAgICB9LA0KDQogICAgLyogLS0tLS0tLS0tLSDpgJrnlKjmoLzlvI/ljJYgLS0tLS0tLS0tLSAqLw0KICAgIGZtdERhdGVUaW1lKHJvdywgY29sdW1uLCBjZWxsVmFsdWUpIHsNCiAgICAgIGlmIChjZWxsVmFsdWUgPT09IG51bGwgfHwgY2VsbFZhbHVlID09PSB1bmRlZmluZWQgfHwgY2VsbFZhbHVlID09PSAnJykgcmV0dXJuICctJw0KICAgICAgcmV0dXJuIFN0cmluZyhjZWxsVmFsdWUpLnJlcGxhY2UoJ1QnLCAnICcpLnNsaWNlKDAsIDE2KQ0KICAgIH0sDQogICAgZm10VmFsKHZhbCkgew0KICAgICAgaWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCB8fCB2YWwgPT09ICcnKSByZXR1cm4gJy0nDQogICAgICByZXR1cm4gU3RyaW5nKHZhbCkucmVwbGFjZSgnVCcsICcgJykuc2xpY2UoMCwgMTYpDQogICAgfSwNCiAgICAvKiog56e76Zmk56m65YC877yIJycvbnVsbC91bmRlZmluZWTvvInvvIzkv53nlZkgMCDnrYnmnInmlYjlgLwgKi8NCiAgICBjbGVhblBheWxvYWQob2JqKSB7DQogICAgICBjb25zdCBwYXlsb2FkID0ge30NCiAgICAgIE9iamVjdC5rZXlzKG9iaikuZm9yRWFjaChrZXkgPT4gew0KICAgICAgICBjb25zdCB2YWx1ZSA9IG9ialtrZXldDQogICAgICAgIGlmICh2YWx1ZSAhPT0gJycgJiYgdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkgew0KICAgICAgICAgIHBheWxvYWRba2V5XSA9IHZhbHVlDQogICAgICAgIH0NCiAgICAgIH0pDQogICAgICByZXR1cm4gcGF5bG9hZA0KICAgIH0sDQoNCiAgICAvKiAtLS0tLS0tLS0tIOWIl+ihqOWKoOi9vSAtLS0tLS0tLS0tICovDQogICAgZmV0Y2hMaXN0KCkgew0KICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZQ0KICAgICAgY29uc3QgcGFyYW1zID0geyBwYWdlTnVtOiB0aGlzLnBhZ2VOdW0sIHBhZ2VTaXplOiB0aGlzLnBhZ2VTaXplIH0NCiAgICAgIGlmICh0aGlzLnNlYXJjaEZvcm0ucndtYyAmJiB0aGlzLnNlYXJjaEZvcm0ucndtYy50cmltKCkpIHBhcmFtcy5yd21jID0gdGhpcy5zZWFyY2hGb3JtLnJ3bWMudHJpbSgpDQogICAgICBpZiAodGhpcy5zZWFyY2hGb3JtLm5kICE9PSB1bmRlZmluZWQgJiYgdGhpcy5zZWFyY2hGb3JtLm5kICE9PSBudWxsICYmIHRoaXMuc2VhcmNoRm9ybS5uZCAhPT0gJycpIHsNCiAgICAgICAgcGFyYW1zLm5kID0gdGhpcy5zZWFyY2hGb3JtLm5kDQogICAgICB9DQogICAgICBpZiAodGhpcy5zZWFyY2hGb3JtLnp0ICYmIHRoaXMuc2VhcmNoRm9ybS56dC50cmltKCkpIHBhcmFtcy56dCA9IHRoaXMuc2VhcmNoRm9ybS56dC50cmltKCkNCiAgICAgIGxpc3RUZWFjaGluZ1Rhc2socGFyYW1zKS50aGVuKHJlcyA9PiB7DQogICAgICAgIGNvbnN0IGRhdGEgPSAocmVzICYmIHJlcy5kYXRhKSB8fCB7fQ0KICAgICAgICB0aGlzLnRhYmxlRGF0YSA9IGRhdGEucmVjb3JkcyB8fCBbXQ0KICAgICAgICB0aGlzLnRvdGFsID0gZGF0YS50b3RhbCB8fCAwDQogICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlDQogICAgICB9KS5jYXRjaCgoKSA9PiB7DQogICAgICAgIHRoaXMudGFibGVEYXRhID0gW10NCiAgICAgICAgdGhpcy50b3RhbCA9IDANCiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2UNCiAgICAgIH0pDQogICAgfSwNCg0KICAgIGhhbmRsZVF1ZXJ5KCkgew0KICAgICAgdGhpcy5wYWdlTnVtID0gMQ0KICAgICAgdGhpcy5mZXRjaExpc3QoKQ0KICAgIH0sDQoNCiAgICBoYW5kbGVQYWdlQ2hhbmdlKHBhZ2UpIHsNCiAgICAgIHRoaXMucGFnZU51bSA9IHBhZ2UNCiAgICAgIHRoaXMuZmV0Y2hMaXN0KCkNCiAgICB9LA0KDQogICAgaGFuZGxlU2l6ZUNoYW5nZShzaXplKSB7DQogICAgICB0aGlzLnBhZ2VTaXplID0gc2l6ZQ0KICAgICAgdGhpcy5wYWdlTnVtID0gMQ0KICAgICAgdGhpcy5mZXRjaExpc3QoKQ0KICAgIH0sDQoNCiAgICAvKiAtLS0tLS0tLS0tIOaWsOWiniAvIOS/ruaUuSAtLS0tLS0tLS0tICovDQogICAgY3JlYXRlRW1wdHlGb3JtKCkgew0KICAgICAgcmV0dXJuIHsNCiAgICAgICAgYmg6ICcnLA0KICAgICAgICByd21jOiAnJywNCiAgICAgICAgbmQ6IHVuZGVmaW5lZCwNCiAgICAgICAgenQ6ICfmnKrlj5HluIMnLA0KICAgICAgICBmYnNqOiAnJywNCiAgICAgICAganNzajogJycsDQogICAgICAgIGpjeHFzY3NqOiAnJw0KICAgICAgfQ0KICAgIH0sDQoNCiAgICBoYW5kbGVBZGQoKSB7DQogICAgICB0aGlzLmZvcm0gPSB0aGlzLmNyZWF0ZUVtcHR5Rm9ybSgpDQogICAgICBpZiAoIXRoaXMuZm9ybS5uZCAmJiB0aGlzLnNlYXJjaEZvcm0ubmQpIHRoaXMuZm9ybS5uZCA9IHRoaXMuc2VhcmNoRm9ybS5uZA0KICAgICAgdGhpcy5pc0VkaXQgPSBmYWxzZQ0KICAgICAgdGhpcy5kaWFsb2dUaXRsZSA9ICfmlrDlu7rmlZnlrabku7vliqEnDQogICAgICB0aGlzLmRpYWxvZ1Zpc2libGUgPSB0cnVlDQogICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB7DQogICAgICAgIHRoaXMuJHJlZnMuZm9ybVJlZiAmJiB0aGlzLiRyZWZzLmZvcm1SZWYuY2xlYXJWYWxpZGF0ZSgpDQogICAgICB9KQ0KICAgIH0sDQoNCiAgICBoYW5kbGVFZGl0KHJvdykgew0KICAgICAgdGhpcy5mb3JtID0gew0KICAgICAgICBiaDogcm93LmJoIHx8ICcnLA0KICAgICAgICByd21jOiByb3cucndtYyB8fCAnJywNCiAgICAgICAgbmQ6IHJvdy5uZCwNCiAgICAgICAgenQ6IHJvdy56dCB8fCAn5pyq5Y+R5biDJywNCiAgICAgICAgZmJzajogcm93LmZic2ogfHwgJycsDQogICAgICAgIGpzc2o6IHJvdy5qc3NqIHx8ICcnLA0KICAgICAgICBqY3hxc2Nzajogcm93LmpjeHFzY3NqIHx8ICcnDQogICAgICB9DQogICAgICB0aGlzLmlzRWRpdCA9IHRydWUNCiAgICAgIHRoaXMuZGlhbG9nVGl0bGUgPSAn5L+u5pS55pWZ5a2m5Lu75YqhJw0KICAgICAgdGhpcy5kaWFsb2dWaXNpYmxlID0gdHJ1ZQ0KICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4gew0KICAgICAgICB0aGlzLiRyZWZzLmZvcm1SZWYgJiYgdGhpcy4kcmVmcy5mb3JtUmVmLmNsZWFyVmFsaWRhdGUoKQ0KICAgICAgfSkNCiAgICB9LA0KDQogICAgaGFuZGxlU3VibWl0KCkgew0KICAgICAgdGhpcy4kcmVmcy5mb3JtUmVmLnZhbGlkYXRlKHZhbGlkID0+IHsNCiAgICAgICAgaWYgKCF2YWxpZCkgew0KICAgICAgICAgIHRoaXMuJG1lc3NhZ2Uud2FybmluZygn6K+35a6M5ZaE5b+F5aGr6aG55ZCO5YaN5o+Q5LqkJykNCiAgICAgICAgICByZXR1cm4NCiAgICAgICAgfQ0KICAgICAgICBjb25zdCBwYXlsb2FkID0gdGhpcy5jbGVhblBheWxvYWQodGhpcy5idWlsZFBheWxvYWQoKSkNCiAgICAgICAgdGhpcy5zYXZpbmcgPSB0cnVlDQogICAgICAgIGNvbnN0IHJlcSA9IHRoaXMuaXNFZGl0ID8gdXBkYXRlVGVhY2hpbmdUYXNrKHBheWxvYWQpIDogYWRkVGVhY2hpbmdUYXNrKHBheWxvYWQpDQogICAgICAgIHJlcS50aGVuKCgpID0+IHsNCiAgICAgICAgICB0aGlzLiRtZXNzYWdlLnN1Y2Nlc3ModGhpcy5pc0VkaXQgPyAn5L+u5pS55oiQ5YqfJyA6ICfmlrDlu7rmiJDlip8nKQ0KICAgICAgICAgIHRoaXMuZGlhbG9nVmlzaWJsZSA9IGZhbHNlDQogICAgICAgICAgdGhpcy5mZXRjaExpc3QoKQ0KICAgICAgICB9KS5jYXRjaCgoKSA9PiB7fSkuZmluYWxseSgoKSA9PiB7DQogICAgICAgICAgdGhpcy5zYXZpbmcgPSBmYWxzZQ0KICAgICAgICB9KQ0KICAgICAgfSkNCiAgICB9LA0KDQogICAgLyoqIOaehOW7uuivt+axguS9k++8muW5tOW6pui9rOaVsOWtl+S7peWMuemFjeWQjuerryBJbnRlZ2Vy77yM5pe26Ze05a2X5q615pyJ5YC85omN5LygICovDQogICAgYnVpbGRQYXlsb2FkKCkgew0KICAgICAgY29uc3QgZiA9IHRoaXMuZm9ybQ0KICAgICAgY29uc3QgcGF5bG9hZCA9IHt9DQogICAgICBpZiAodGhpcy5pc0VkaXQgJiYgZi5iaCAmJiBTdHJpbmcoZi5iaCkudHJpbSgpKSBwYXlsb2FkLmJoID0gU3RyaW5nKGYuYmgpLnRyaW0oKQ0KICAgICAgaWYgKGYucndtYyAmJiBTdHJpbmcoZi5yd21jKS50cmltKCkpIHBheWxvYWQucndtYyA9IFN0cmluZyhmLnJ3bWMpLnRyaW0oKQ0KICAgICAgaWYgKGYubmQgIT09IHVuZGVmaW5lZCAmJiBmLm5kICE9PSBudWxsICYmIGYubmQgIT09ICcnKSBwYXlsb2FkLm5kID0gTnVtYmVyKGYubmQpDQogICAgICBpZiAoZi56dCAmJiBTdHJpbmcoZi56dCkudHJpbSgpKSBwYXlsb2FkLnp0ID0gU3RyaW5nKGYuenQpLnRyaW0oKQ0KICAgICAgaWYgKGYuZmJzaikgcGF5bG9hZC5mYnNqID0gZi5mYnNqDQogICAgICBpZiAoZi5qc3NqKSBwYXlsb2FkLmpzc2ogPSBmLmpzc2oNCiAgICAgIGlmIChmLmpjeHFzY3NqKSBwYXlsb2FkLmpjeHFzY3NqID0gZi5qY3hxc2Nzag0KICAgICAgcmV0dXJuIHBheWxvYWQNCiAgICB9LA0KDQogICAgLyogLS0tLS0tLS0tLSDor6bmg4UgLS0tLS0tLS0tLSAqLw0KICAgIGhhbmRsZURldGFpbChyb3cpIHsNCiAgICAgIHRoaXMuZGV0YWlsVmlzaWJsZSA9IHRydWUNCiAgICAgIHRoaXMuZGV0YWlsTG9hZGluZyA9IHRydWUNCiAgICAgIHRoaXMuZGV0YWlsRGF0YSA9IHt9DQogICAgICBnZXRUZWFjaGluZ1Rhc2socm93LmJoKS50aGVuKHJlcyA9PiB7DQogICAgICAgIHRoaXMuZGV0YWlsRGF0YSA9IChyZXMgJiYgcmVzLmRhdGEpIHx8IHt9DQogICAgICAgIHRoaXMuZGV0YWlsTG9hZGluZyA9IGZhbHNlDQogICAgICB9KS5jYXRjaCgoKSA9PiB7DQogICAgICAgIHRoaXMuZGV0YWlsTG9hZGluZyA9IGZhbHNlDQogICAgICB9KQ0KICAgIH0sDQoNCiAgICAvKiAtLS0tLS0tLS0tIOWIoOmZpCAtLS0tLS0tLS0tICovDQogICAgaGFuZGxlRGVsZXRlKHJvdykgew0KICAgICAgdGhpcy4kY29uZmlybShg56Gu5a6a6KaB5Yig6Zmk44CMJHtyb3cucndtYyB8fCByb3cuYmggfHwgJ+ivpeiusOW9lSd944CN5ZCX77yf5Yig6Zmk5bCG57qn6IGU5Yig6Zmk5YWz6IGU55qE5pWZ56CU5a6k5Lu75Yqh5Lmm44CCYCwgJ+ezu+e7n+aPkOekuicsIHsNCiAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6ICfnoa7lrponLA0KICAgICAgICBjYW5jZWxCdXR0b25UZXh0OiAn5Y+W5raIJywNCiAgICAgICAgdHlwZTogJ3dhcm5pbmcnDQogICAgICB9KS50aGVuKCgpID0+IGRlbGV0ZVRlYWNoaW5nVGFzayhyb3cuYmgpKS50aGVuKCgpID0+IHsNCiAgICAgICAgdGhpcy4kbWVzc2FnZS5zdWNjZXNzKCfliKDpmaTmiJDlip8nKQ0KICAgICAgICB0aGlzLmZldGNoTGlzdCgpDQogICAgICB9KS5jYXRjaCgoKSA9PiB7fSkNCiAgICB9LA0KDQogICAgLyogLS0tLS0tLS0tLSDlj5HluIMgLS0tLS0tLS0tLSAqLw0KICAgIGhhbmRsZVB1Ymxpc2gocm93KSB7DQogICAgICB0aGlzLiRjb25maXJtKGDnoa7lrpropoHlj5HluIPmlZnlrabku7vliqHjgIwke3Jvdy5yd21jIHx8IHJvdy5iaCB8fCAn6K+l6K6w5b2VJ33jgI3lkJfvvJ/lj5HluIPliY3or7flhYjloavlhpnlhbPogZTnmoTmlZnnoJTlrqTku7vliqHkuabjgIJgLCAn57O757uf5o+Q56S6Jywgew0KICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogJ+ehruWumicsDQogICAgICAgIGNhbmNlbEJ1dHRvblRleHQ6ICflj5bmtognLA0KICAgICAgICB0eXBlOiAnd2FybmluZycNCiAgICAgIH0pLnRoZW4oKCkgPT4gcHVibGlzaFRlYWNoaW5nVGFzayhyb3cuYmgpKS50aGVuKCgpID0+IHsNCiAgICAgICAgdGhpcy4kbWVzc2FnZS5zdWNjZXNzKCflj5HluIPmiJDlip8nKQ0KICAgICAgICB0aGlzLmZldGNoTGlzdCgpDQogICAgICB9KS5jYXRjaCgoKSA9PiB7fSkNCiAgICB9DQogIH0NCn0NCg=="},{"version":3,"sources":["index.vue"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0LA;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;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;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;;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;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;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;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;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"index.vue","sourceRoot":"src/views/teachOffice/taskPlan","sourcesContent":["<template>\r\n <div class=\"app-container task-plan-page\">\r\n <!-- ==================== 页面标题 ==================== -->\r\n <div class=\"page-title\">教学任务计划管理</div>\r\n\r\n <!-- ==================== 1. 查询条件区域 ==================== -->\r\n <el-card shadow=\"never\" class=\"search-card\">\r\n <el-form :inline=\"true\" :model=\"searchForm\" class=\"search-form\">\r\n <el-form-item label=\"任务名称\">\r\n <el-input\r\n v-model=\"searchForm.rwmc\"\r\n placeholder=\"请输入任务名称\"\r\n clearable\r\n style=\"width: 180px\"\r\n @keyup.enter.native=\"handleQuery\"\r\n />\r\n </el-form-item>\r\n <el-form-item label=\"年度\">\r\n <el-select v-model=\"searchForm.nd\" placeholder=\"请选择年度\" clearable style=\"width: 140px\">\r\n <el-option v-for=\"y in yearOptions\" :key=\"y\" :label=\"y\" :value=\"y\" />\r\n </el-select>\r\n </el-form-item>\r\n <el-form-item label=\"状态\">\r\n <el-select v-model=\"searchForm.zt\" placeholder=\"请选择状态\" clearable style=\"width: 140px\">\r\n <el-option\r\n v-for=\"opt in statusOptions\"\r\n :key=\"opt.value\"\r\n :label=\"opt.label\"\r\n :value=\"opt.value\"\r\n />\r\n </el-select>\r\n </el-form-item>\r\n <el-form-item>\r\n <el-button type=\"primary\" icon=\"el-icon-search\" @click=\"handleQuery\">查询</el-button>\r\n </el-form-item>\r\n </el-form>\r\n </el-card>\r\n\r\n <!-- ==================== 2. 操作区域 ==================== -->\r\n <div class=\"list-toolbar\">\r\n <div class=\"left-group\">\r\n <el-button type=\"primary\" icon=\"el-icon-plus\" @click=\"handleAdd\">新建教学任务</el-button>\r\n </div>\r\n </div>\r\n\r\n <!-- ==================== 3. 数据表格 ==================== -->\r\n <el-card shadow=\"never\" class=\"table-card\">\r\n <el-table v-loading=\"loading\" :data=\"tableData\" border stripe class=\"task-table\">\r\n <template slot=\"empty\">\r\n <span>无数据!</span>\r\n </template>\r\n <el-table-column type=\"index\" label=\"序号\" width=\"70\" align=\"center\" />\r\n <el-table-column prop=\"rwmc\" label=\"任务名称\" width=\"250\" align=\"center\" show-overflow-tooltip />\r\n <el-table-column prop=\"nd\" label=\"年度\" width=\"150\" align=\"center\" />\r\n <el-table-column label=\"状态\" width=\"100\" align=\"center\">\r\n <template slot-scope=\"{ row }\">\r\n <el-tag :type=\"row.zt === '发布' ? 'success' : 'info'\" size=\"small\">\r\n {{ row.zt || '-' }}\r\n </el-tag>\r\n </template>\r\n </el-table-column>\r\n <el-table-column prop=\"fbsj\" label=\"发布时间\" width=\"180\" align=\"center\" :formatter=\"fmtDateTime\" />\r\n <el-table-column prop=\"jssj\" label=\"结束时间\" width=\"180\" align=\"center\" :formatter=\"fmtDateTime\" />\r\n <el-table-column prop=\"cjsj\" label=\"创建时间\" width=\"180\" align=\"center\" :formatter=\"fmtDateTime\" />\r\n <el-table-column prop=\"jcxqscsj\" label=\"教材需求生成时间\" align=\"center\" :formatter=\"fmtDateTime\" />\r\n <el-table-column label=\"操作\" width=\"300\" align=\"center\" fixed=\"right\">\r\n <template slot-scope=\"{ row }\">\r\n <el-button type=\"text\" size=\"small\" @click=\"handleDetail(row)\">详情</el-button>\r\n <el-button type=\"text\" size=\"small\" @click=\"handleEdit(row)\">编辑</el-button>\r\n <el-button\r\n type=\"text\"\r\n size=\"small\"\r\n :disabled=\"row.zt === '发布'\"\r\n @click=\"handlePublish(row)\"\r\n >发布</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\"\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=\"dialogVisible\"\r\n :title=\"dialogTitle\"\r\n width=\"560px\"\r\n :close-on-click-modal=\"false\"\r\n @update:visible=\"val => dialogVisible = val\"\r\n >\r\n <el-form ref=\"formRef\" :model=\"form\" :rules=\"rules\" label-width=\"140px\" class=\"add-form\">\r\n <el-form-item v-if=\"isEdit\" label=\"编号\" prop=\"bh\">\r\n <el-input v-model=\"form.bh\" disabled placeholder=\"编号不可修改\" />\r\n </el-form-item>\r\n <el-form-item v-else label=\"编号\">\r\n <el-input disabled placeholder=\"新增后由系统自动生成\" />\r\n </el-form-item>\r\n <el-form-item label=\"任务名称\" prop=\"rwmc\">\r\n <el-input v-model=\"form.rwmc\" placeholder=\"请输入任务名称\" clearable />\r\n </el-form-item>\r\n <el-form-item label=\"年度\" prop=\"nd\">\r\n <el-select v-model=\"form.nd\" placeholder=\"请选择年度\" style=\"width: 100%\">\r\n <el-option v-for=\"y in yearOptions\" :key=\"y\" :label=\"y\" :value=\"y\" />\r\n </el-select>\r\n </el-form-item>\r\n <el-form-item label=\"状态\" prop=\"zt\">\r\n <el-select v-model=\"form.zt\" placeholder=\"请选择状态\" style=\"width: 100%\">\r\n <el-option\r\n v-for=\"opt in statusOptions\"\r\n :key=\"opt.value\"\r\n :label=\"opt.label\"\r\n :value=\"opt.value\"\r\n />\r\n </el-select>\r\n </el-form-item>\r\n <el-form-item label=\"发布时间\">\r\n <el-date-picker\r\n v-model=\"form.fbsj\"\r\n type=\"datetime\"\r\n value-format=\"yyyy-MM-ddTHH:mm:ss\"\r\n placeholder=\"请选择发布时间\"\r\n style=\"width: 100%\"\r\n />\r\n </el-form-item>\r\n <el-form-item label=\"结束时间\">\r\n <el-date-picker\r\n v-model=\"form.jssj\"\r\n type=\"datetime\"\r\n value-format=\"yyyy-MM-ddTHH:mm:ss\"\r\n placeholder=\"请选择结束时间\"\r\n style=\"width: 100%\"\r\n />\r\n </el-form-item>\r\n <el-form-item label=\"教材需求生成时间\">\r\n <el-date-picker\r\n v-model=\"form.jcxqscsj\"\r\n type=\"datetime\"\r\n value-format=\"yyyy-MM-ddTHH:mm:ss\"\r\n placeholder=\"请选择教材需求生成时间\"\r\n style=\"width: 100%\"\r\n />\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\" :loading=\"saving\" @click=\"handleSubmit\">确定</el-button>\r\n </div>\r\n </el-dialog>\r\n\r\n <!-- ==================== 5. 详情对话框 ==================== -->\r\n <el-dialog\r\n :visible=\"detailVisible\"\r\n title=\"教学任务详情\"\r\n width=\"620px\"\r\n :close-on-click-modal=\"false\"\r\n @update:visible=\"val => detailVisible = val\"\r\n >\r\n <el-descriptions v-if=\"detailData.bh\" :column=\"2\" border>\r\n <el-descriptions-item label=\"编号\">{{ detailData.bh || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"任务名称\">{{ detailData.rwmc || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"年度\">{{ fmtVal(detailData.nd) }}</el-descriptions-item>\r\n <el-descriptions-item label=\"状态\">{{ detailData.zt || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"发布时间\">{{ fmtVal(detailData.fbsj) }}</el-descriptions-item>\r\n <el-descriptions-item label=\"结束时间\">{{ fmtVal(detailData.jssj) }}</el-descriptions-item>\r\n <el-descriptions-item label=\"创建时间\">{{ fmtVal(detailData.cjsj) }}</el-descriptions-item>\r\n <el-descriptions-item label=\"教材需求生成时间\">{{ fmtVal(detailData.jcxqscsj) }}</el-descriptions-item>\r\n </el-descriptions>\r\n <div v-else v-loading=\"detailLoading\" class=\"detail-empty\">加载中...</div>\r\n <div slot=\"footer\">\r\n <el-button @click=\"detailVisible = false\">关闭</el-button>\r\n </div>\r\n </el-dialog>\r\n </div>\r\n</template>\r\n\r\n<script>\r\n/**\r\n * 教学任务计划管理(完整管理页)\r\n * 对应菜单:teachOffice/taskPlan\r\n * 提供 teachingTask 全套真实接口操作:分页查询 list、详情 get?bh=、新增 add、编辑 update、\r\n * 发布 batchPublish?bh=(需先填写教研室任务书)、删除 delete?bh=(级联删除教研室任务书)\r\n * 只读查询视图在 src/views/teachBusiness/teachingTask/index.vue(教学任务列表)提供,避免重复操作同一实体\r\n */\r\nimport {\r\n listTeachingTask,\r\n getTeachingTask,\r\n addTeachingTask,\r\n updateTeachingTask,\r\n deleteTeachingTask,\r\n publishTeachingTask\r\n} from '@/api/teachBusiness/teachingTask'\r\nimport { listAllSemester } from '@/api/teachBusiness/semester'\r\n\r\nexport default {\r\n name: 'TaskPlan',\r\n data() {\r\n return {\r\n // ==================== 1. 查询条件 ====================\r\n searchForm: {\r\n rwmc: '',\r\n nd: undefined,\r\n zt: ''\r\n },\r\n yearOptions: [],\r\n statusOptions: [\r\n { label: '未发布', value: '未发布' },\r\n { label: '发布', value: '发布' }\r\n ],\r\n\r\n // ==================== 2. 表格数据 ====================\r\n loading: false,\r\n tableData: [],\r\n pageNum: 1,\r\n pageSize: 10,\r\n total: 0,\r\n\r\n // ==================== 3. 新增/修改表单 ====================\r\n dialogVisible: false,\r\n dialogTitle: '新建教学任务',\r\n isEdit: false,\r\n saving: false,\r\n form: this.createEmptyForm(),\r\n rules: {\r\n rwmc: [{ required: true, message: '请输入任务名称', trigger: 'blur' }],\r\n nd: [{ required: true, message: '请选择年度', trigger: 'change' }],\r\n zt: [{ required: true, message: '请选择状态', trigger: 'change' }]\r\n },\r\n\r\n // ==================== 4. 详情 ====================\r\n detailVisible: false,\r\n detailLoading: false,\r\n detailData: {}\r\n }\r\n },\r\n created() {\r\n this.loadYearOptions().then(() => this.fetchList())\r\n },\r\n methods: {\r\n /* ---------- 年度下拉(数据来自 /semester/all,禁止硬编码) ---------- */\r\n loadYearOptions() {\r\n return listAllSemester().then(response => {\r\n const list = response.data || []\r\n const map = {}\r\n list.forEach(item => {\r\n if (item.nd !== null && item.nd !== undefined && item.nd !== '') map[item.nd] = item\r\n })\r\n const arr = Object.keys(map).sort((a, b) => String(b).localeCompare(String(a)))\r\n this.yearOptions = arr\r\n // 默认年度:优先当前学期(dqxq=true),否则取最新年度\r\n const current = list.find(item => item.dqxq === true)\r\n const defaultNd = (current && current.nd) || arr[0]\r\n if (!this.searchForm.nd) this.searchForm.nd = defaultNd\r\n return arr\r\n }).catch(() => {\r\n this.yearOptions = []\r\n return []\r\n })\r\n },\r\n\r\n /* ---------- 通用格式化 ---------- */\r\n fmtDateTime(row, column, cellValue) {\r\n if (cellValue === null || cellValue === undefined || cellValue === '') return '-'\r\n return String(cellValue).replace('T', ' ').slice(0, 16)\r\n },\r\n fmtVal(val) {\r\n if (val === null || val === undefined || val === '') return '-'\r\n return String(val).replace('T', ' ').slice(0, 16)\r\n },\r\n /** 移除空值(''/null/undefined),保留 0 等有效值 */\r\n cleanPayload(obj) {\r\n const payload = {}\r\n Object.keys(obj).forEach(key => {\r\n const value = obj[key]\r\n if (value !== '' && value !== null && value !== undefined) {\r\n payload[key] = value\r\n }\r\n })\r\n return payload\r\n },\r\n\r\n /* ---------- 列表加载 ---------- */\r\n fetchList() {\r\n this.loading = true\r\n const params = { pageNum: this.pageNum, pageSize: this.pageSize }\r\n if (this.searchForm.rwmc && this.searchForm.rwmc.trim()) params.rwmc = this.searchForm.rwmc.trim()\r\n if (this.searchForm.nd !== undefined && this.searchForm.nd !== null && this.searchForm.nd !== '') {\r\n params.nd = this.searchForm.nd\r\n }\r\n if (this.searchForm.zt && this.searchForm.zt.trim()) params.zt = this.searchForm.zt.trim()\r\n listTeachingTask(params).then(res => {\r\n const data = (res && res.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 handleQuery() {\r\n this.pageNum = 1\r\n this.fetchList()\r\n },\r\n\r\n handlePageChange(page) {\r\n this.pageNum = page\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 createEmptyForm() {\r\n return {\r\n bh: '',\r\n rwmc: '',\r\n nd: undefined,\r\n zt: '未发布',\r\n fbsj: '',\r\n jssj: '',\r\n jcxqscsj: ''\r\n }\r\n },\r\n\r\n handleAdd() {\r\n this.form = this.createEmptyForm()\r\n if (!this.form.nd && this.searchForm.nd) this.form.nd = this.searchForm.nd\r\n this.isEdit = false\r\n this.dialogTitle = '新建教学任务'\r\n this.dialogVisible = 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.form = {\r\n bh: row.bh || '',\r\n rwmc: row.rwmc || '',\r\n nd: row.nd,\r\n zt: row.zt || '未发布',\r\n fbsj: row.fbsj || '',\r\n jssj: row.jssj || '',\r\n jcxqscsj: row.jcxqscsj || ''\r\n }\r\n this.isEdit = true\r\n this.dialogTitle = '修改教学任务'\r\n this.dialogVisible = true\r\n this.$nextTick(() => {\r\n this.$refs.formRef && this.$refs.formRef.clearValidate()\r\n })\r\n },\r\n\r\n handleSubmit() {\r\n this.$refs.formRef.validate(valid => {\r\n if (!valid) {\r\n this.$message.warning('请完善必填项后再提交')\r\n return\r\n }\r\n const payload = this.cleanPayload(this.buildPayload())\r\n this.saving = true\r\n const req = this.isEdit ? updateTeachingTask(payload) : addTeachingTask(payload)\r\n req.then(() => {\r\n this.$message.success(this.isEdit ? '修改成功' : '新建成功')\r\n this.dialogVisible = false\r\n this.fetchList()\r\n }).catch(() => {}).finally(() => {\r\n this.saving = false\r\n })\r\n })\r\n },\r\n\r\n /** 构建请求体:年度转数字以匹配后端 Integer,时间字段有值才传 */\r\n buildPayload() {\r\n const f = this.form\r\n const payload = {}\r\n if (this.isEdit && f.bh && String(f.bh).trim()) payload.bh = String(f.bh).trim()\r\n if (f.rwmc && String(f.rwmc).trim()) payload.rwmc = String(f.rwmc).trim()\r\n if (f.nd !== undefined && f.nd !== null && f.nd !== '') payload.nd = Number(f.nd)\r\n if (f.zt && String(f.zt).trim()) payload.zt = String(f.zt).trim()\r\n if (f.fbsj) payload.fbsj = f.fbsj\r\n if (f.jssj) payload.jssj = f.jssj\r\n if (f.jcxqscsj) payload.jcxqscsj = f.jcxqscsj\r\n return payload\r\n },\r\n\r\n /* ---------- 详情 ---------- */\r\n handleDetail(row) {\r\n this.detailVisible = true\r\n this.detailLoading = true\r\n this.detailData = {}\r\n getTeachingTask(row.bh).then(res => {\r\n this.detailData = (res && res.data) || {}\r\n this.detailLoading = false\r\n }).catch(() => {\r\n this.detailLoading = false\r\n })\r\n },\r\n\r\n /* ---------- 删除 ---------- */\r\n handleDelete(row) {\r\n this.$confirm(`确定要删除「${row.rwmc || row.bh || '该记录'}」吗?删除将级联删除关联的教研室任务书。`, '系统提示', {\r\n confirmButtonText: '确定',\r\n cancelButtonText: '取消',\r\n type: 'warning'\r\n }).then(() => deleteTeachingTask(row.bh)).then(() => {\r\n this.$message.success('删除成功')\r\n this.fetchList()\r\n }).catch(() => {})\r\n },\r\n\r\n /* ---------- 发布 ---------- */\r\n handlePublish(row) {\r\n this.$confirm(`确定要发布教学任务「${row.rwmc || row.bh || '该记录'}」吗?发布前请先填写关联的教研室任务书。`, '系统提示', {\r\n confirmButtonText: '确定',\r\n cancelButtonText: '取消',\r\n type: 'warning'\r\n }).then(() => publishTeachingTask(row.bh)).then(() => {\r\n this.$message.success('发布成功')\r\n this.fetchList()\r\n }).catch(() => {})\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.task-plan-page {\r\n .page-title {\r\n text-align: center;\r\n font-size: 20px;\r\n font-weight: 600;\r\n color: #303133;\r\n margin-bottom: 20px;\r\n }\r\n\r\n // ========== 1. 查询条件区域 ==========\r\n .search-card {\r\n margin-bottom: 16px;\r\n\r\n .search-form {\r\n .el-form-item {\r\n margin-bottom: 0;\r\n margin-right: 24px;\r\n }\r\n }\r\n }\r\n\r\n // ========== 2. 工具栏 ==========\r\n .list-toolbar {\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 margin-bottom: 16px;\r\n\r\n .left-group,\r\n .right-group {\r\n display: flex;\r\n align-items: center;\r\n flex-wrap: wrap;\r\n gap: 10px;\r\n }\r\n }\r\n\r\n // ========== 3. 数据表格区域 ==========\r\n .table-card {\r\n .task-table {\r\n width: 100%;\r\n }\r\n\r\n .pagination {\r\n display: flex;\r\n justify-content: flex-end;\r\n margin-top: 12px;\r\n }\r\n\r\n .text-danger {\r\n color: #f56c6c;\r\n }\r\n }\r\n\r\n // ========== 4. 详情 ==========\r\n .detail-empty {\r\n min-height: 120px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n color: #909399;\r\n }\r\n}\r\n</style>\r\n"]}]} |