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

1 line
45 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\\subject\\index.vue?vue&type=script&lang=js","dependencies":[{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\src\\views\\teachOffice\\subject\\index.vue","mtime":1787567993852},{"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:Ly8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KDQppbXBvcnQgeyBsaXN0S2IgYXMgbGlzdFN1YmplY3QsIGFkZEtiIGFzIGFkZFN1YmplY3QsIHVwZGF0ZUtiIGFzIHVwZGF0ZVN1YmplY3QsIGRlbGV0ZUtiIGFzIGRlbGV0ZVN1YmplY3QsIGdldEtiIH0gZnJvbSAnQC9hcGkvdGVhY2hPZmZpY2Uva2InDQoNCmV4cG9ydCBkZWZhdWx0IHsNCiAgbmFtZTogJ1N1YmplY3RJbmRleCcsDQogIGRhdGEoKSB7DQogICAgcmV0dXJuIHsNCiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09IDEuIOmhtumDqOeKtuaAgeaPkOekuiA9PT09PT09PT09PT09PT09PT09PQ0KICAgICAgc3RhdHVzVGlwOiAn6K+36L6T5YWl5p+l6K+i5p2h5Lu2JywNCg0KICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT0gMi4g5p+l6K+i5p2h5Lu2ID09PT09PT09PT09PT09PT09PT09DQogICAgICBzZWFyY2hGb3JtOiB7DQogICAgICAgIGttYzogJycsDQogICAgICAgIGpjOiAnJywNCiAgICAgICAga21kbTogJycsDQogICAgICAgIGp5c2RoOiAnJywNCiAgICAgICAga2NseDogJycsDQogICAgICAgIHB4bHg6ICcnLA0KICAgICAgICBweGNjOiAnJw0KICAgICAgfSwNCg0KICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT0g5YiX6KGo5pWw5o2uID09PT09PT09PT09PT09PT09PT09DQogICAgICBsb2FkaW5nOiBmYWxzZSwNCiAgICAgIHRhYmxlRGF0YTogW10sDQogICAgICB0b3RhbDogMCwNCiAgICAgIHBhZ2VOdW06IDEsDQogICAgICBwYWdlU2l6ZTogMjAsDQogICAgICBzZWxlY3RlZFJvd3M6IFtdLA0KDQogICAgICAvLyA9PT09PT09PT09PT09PT09PT09PSDmlofku7bkuIrkvKAgPT09PT09PT09PT09PT09PT09PT0NCiAgICAgIHNlbGVjdGVkRmlsZTogbnVsbCwNCiAgICAgIGNvdmVyRXhpc3Q6IGZhbHNlLA0KDQogICAgICAvLyA9PT09PT09PT09PT09PT09PT09PSDmlrDlop4v57yW6L6R5by556qXID09PT09PT09PT09PT09PT09PT09DQogICAgICBkaWFsb2dWaXNpYmxlOiBmYWxzZSwNCiAgICAgIGFkZExvYWRpbmc6IGZhbHNlLA0KICAgICAgaXNFZGl0OiBmYWxzZSwNCiAgICAgIGFkZEZvcm06IHRoaXMuY3JlYXRlRW1wdHlGb3JtKCksDQogICAgICBydWxlczogew0KICAgICAgICBrbWM6IFt7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAn6K+36L6T5YWl6K++5ZCN56ewJywgdHJpZ2dlcjogJ2JsdXInIH1dLA0KICAgICAgICBqeXNkaDogW3sgcmVxdWlyZWQ6IHRydWUsIG1lc3NhZ2U6ICfor7fovpPlhaXmlZnnoJTlrqTku6Plj7cnLCB0cmlnZ2VyOiAnYmx1cicgfV0sDQogICAgICAgIHhmOiBbeyByZXF1aXJlZDogdHJ1ZSwgbWVzc2FnZTogJ+ivt+i+k+WFpeWtpuWIhicsIHRyaWdnZXI6ICdibHVyJyB9XSwNCiAgICAgICAgcHhjYzogW3sgcmVxdWlyZWQ6IHRydWUsIG1lc3NhZ2U6ICfor7fovpPlhaXln7norq3lsYLmrKEnLCB0cmlnZ2VyOiAnYmx1cicgfV0sDQogICAgICAgIHB4bHg6IFt7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAn6K+36L6T5YWl5Z+56K6t57G75Z6LJywgdHJpZ2dlcjogJ2JsdXInIH1dLA0KICAgICAgICBrY2x4OiBbeyByZXF1aXJlZDogdHJ1ZSwgbWVzc2FnZTogJ+ivt+i+k+WFpeivvueoi+exu+WeiycsIHRyaWdnZXI6ICdibHVyJyB9XSwNCiAgICAgICAga3NrczogW3sgcmVxdWlyZWQ6IHRydWUsIG1lc3NhZ2U6ICfor7fovpPlhaXogIPor5Xor77ml7YnLCB0cmlnZ2VyOiAnYmx1cicgfV0sDQogICAgICAgIGNqZno6IFt7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAn6K+36L6T5YWl5oiQ57up5YiG5Yi2JywgdHJpZ2dlcjogJ2JsdXInIH1dLA0KICAgICAgICBsbHhzOiBbeyByZXF1aXJlZDogdHJ1ZSwgbWVzc2FnZTogJ+ivt+i+k+WFpeeQhuiuuuWtpuaXticsIHRyaWdnZXI6ICdibHVyJyB9XSwNCiAgICAgICAgc2p4czogW3sgcmVxdWlyZWQ6IHRydWUsIG1lc3NhZ2U6ICfor7fovpPlhaXlrp7ot7Xlrabml7YnLCB0cmlnZ2VyOiAnYmx1cicgfV0sDQogICAgICAgIHprczogW3sgcmVxdWlyZWQ6IHRydWUsIG1lc3NhZ2U6ICfor7fovpPlhaXlkajor77ml7YnLCB0cmlnZ2VyOiAnYmx1cicgfV0sDQogICAgICAgIGtseDogW3sgcmVxdWlyZWQ6IHRydWUsIG1lc3NhZ2U6ICfor7fovpPlhaXor77nsbvlnosnLCB0cmlnZ2VyOiAnYmx1cicgfV0sDQogICAgICAgIGtjdHliaDogW3sgcmVxdWlyZWQ6IHRydWUsIG1lc3NhZ2U6ICfor7fovpPlhaXor77nqIvnu5/kuIDnvJblj7cnLCB0cmlnZ2VyOiAnYmx1cicgfV0sDQogICAgICAgIGZkZHlrczogW3sgcmVxdWlyZWQ6IHRydWUsIG1lc3NhZ2U6ICfor7fovpPlhaXovoXlr7znrZTnlpHor77ml7YnLCB0cmlnZ2VyOiAnYmx1cicgfV0sDQogICAgICAgIHp4a3M6IFt7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAn6K+36L6T5YWl6Ieq5L+u6K++5pe2JywgdHJpZ2dlcjogJ2JsdXInIH1dLA0KICAgICAgICB4ZHJxOiBbeyByZXF1aXJlZDogdHJ1ZSwgbWVzc2FnZTogJ+ivt+i+k+WFpeS/ruiuouaXpeacnycsIHRyaWdnZXI6ICdibHVyJyB9XSwNCiAgICAgICAgamN5eGo6IFt7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAn6K+36L6T5YWl6IqC5qyh5LyY6YCJ57qnJywgdHJpZ2dlcjogJ2JsdXInIH1dLA0KICAgICAgICBrY3pjZnM6IFt7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAn6K+36L6T5YWl6K++56iL5pSv5oyB5pa55byPJywgdHJpZ2dlcjogJ2JsdXInIH1dLA0KICAgICAgICBrY2pzZnM6IFt7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAn6K+36L6T5YWl6K++56iL5bu66K6+5pa55byPJywgdHJpZ2dlcjogJ2JsdXInIH1dLA0KICAgICAgICBraGZzOiBbeyByZXF1aXJlZDogdHJ1ZSwgbWVzc2FnZTogJ+ivt+i+k+WFpeiAg+aguOaWueW8jycsIHRyaWdnZXI6ICdibHVyJyB9XSwNCiAgICAgICAgeGN4Y2pmejogW3sgcmVxdWlyZWQ6IHRydWUsIG1lc3NhZ2U6ICfor7fovpPlhaXlvaLmiJDmgKfmiJDnu6nliIblgLwnLCB0cmlnZ2VyOiAnYmx1cicgfV0sDQogICAgICAgIHpqeGNqZno6IFt7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAn6K+36L6T5YWl57uI57uT5oCn5oiQ57up5YiG5YC8JywgdHJpZ2dlcjogJ2JsdXInIH1dLA0KICAgICAgICBtajogW3sgcmVxdWlyZWQ6IHRydWUsIG1lc3NhZ2U6ICfor7fovpPlhaXlr4bnuqcnLCB0cmlnZ2VyOiAnYmx1cicgfV0sDQogICAgICAgIHB4cWs6IFt7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAn6K+36L6T5YWl6K+E6YCJ5oOF5Ya1JywgdHJpZ2dlcjogJ2JsdXInIH1dDQogICAgICB9DQogICAgfQ0KICB9LA0KICBjb21wdXRlZDogew0KICAgIGRpYWxvZ1RpdGxlKCkgew0KICAgICAgcmV0dXJuIHRoaXMuaXNFZGl0ID8gJ+e8lui+keivvueoi+enkeebricgOiAn5paw5aKe6K++56iL56eR55uuJw0KICAgIH0sDQogICAgZmlsZU5hbWUoKSB7DQogICAgICByZXR1cm4gKHRoaXMuc2VsZWN0ZWRGaWxlICYmIHRoaXMuc2VsZWN0ZWRGaWxlLm5hbWUpIHx8ICfmnKrpgInmi6nku7vkvZXmlofku7YnDQogICAgfQ0KICB9LA0KICBtb3VudGVkKCkgew0KICAgIHRoaXMuZmV0Y2hMaXN0KCkNCiAgfSwNCiAgbWV0aG9kczogew0KICAgIC8qKiDnp7vpmaTnqbrlgLwgKi8NCiAgICBjbGVhblBheWxvYWQob2JqKSB7DQogICAgICBjb25zdCBwYXlsb2FkID0ge30NCiAgICAgIE9iamVjdC5rZXlzKG9iaikuZm9yRWFjaChrZXkgPT4gew0KICAgICAgICBjb25zdCB2YWx1ZSA9IG9ialtrZXldDQogICAgICAgIGlmICh2YWx1ZSAhPT0gJycgJiYgdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkgew0KICAgICAgICAgIHBheWxvYWRba2V5XSA9IHZhbHVlDQogICAgICAgIH0NCiAgICAgIH0pDQogICAgICByZXR1cm4gcGF5bG9hZA0KICAgIH0sDQoNCiAgICAvKiog5Yib5bu656m655m96K++56iL56eR55uu6KGo5Y2VICovDQogICAgY3JlYXRlRW1wdHlGb3JtKCkgew0KICAgICAgcmV0dXJuIHsNCiAgICAgICAga2JoOiAnJywga21jOiAnJywganlzZGg6ICcnLCBiejogJycsIHhoOiAnJywgeGY6IDAsIGpjOiAnJywgeHM6IDAsDQogICAgICAgIHB4Y2M6ICcnLCBweGx4OiAnJywga2NseDogJycsIGtza3M6IDAsIHB5OiAnJywgZ2ZtYzogJycsIGNqZno6ICcnLA0KICAgICAgICBianJ4eXBqZjogMCwganhnbGJtYmg6ICcnLCBsbHhzOiAwLCBzanhzOiAwLCBrbWRtOiAnJywgemtzOiAwLCBrbHg6ICcnLA0KICAgICAgICBrc2tzYnhzOiAwLCBrY3R5Ymg6ICcnLCBzeWR4OiAnJywgZmRkeWtzOiAwLCB6eGtzOiAwLCBiYjogJycsIHhkcnE6ICcnLA0KICAgICAgICBqY3l4ajogJycsIGtjemNmczogJycsIGtjanNmczogJycsIGpzb256ZDogJycsIHp6bGtjOiAwLCBraGZzOiAnJywNCiAgICAgICAgeGN4Y2pmejogMCwgemp4Y2pmejogMCwgbWo6ICcnLCBweHFrOiAnJw0KICAgICAgfQ0KICAgIH0sDQoNCiAgICByZXNldEZvcm0oKSB7DQogICAgICB0aGlzLmFkZEZvcm0gPSB0aGlzLmNyZWF0ZUVtcHR5Rm9ybSgpDQogICAgfSwNCg0KICAgIC8vID09PT09PT09PT09PT09PT09PT09IOWIl+ihqOWKoOi9vSA9PT09PT09PT09PT09PT09PT09PQ0KICAgIGJ1aWxkUXVlcnkoKSB7DQogICAgICByZXR1cm4gdGhpcy5jbGVhblBheWxvYWQoew0KICAgICAgICBwYWdlTnVtOiB0aGlzLnBhZ2VOdW0sDQogICAgICAgIHBhZ2VTaXplOiB0aGlzLnBhZ2VTaXplLA0KICAgICAgICBrbWM6IHRoaXMuc2VhcmNoRm9ybS5rbWMsDQogICAgICAgIGpjOiB0aGlzLnNlYXJjaEZvcm0uamMsDQogICAgICAgIGttZG06IHRoaXMuc2VhcmNoRm9ybS5rbWRtLA0KICAgICAgICBqeXNkaDogdGhpcy5zZWFyY2hGb3JtLmp5c2RoLA0KICAgICAgICBrY2x4OiB0aGlzLnNlYXJjaEZvcm0ua2NseCwNCiAgICAgICAgcHhseDogdGhpcy5zZWFyY2hGb3JtLnB4bHgsDQogICAgICAgIHB4Y2M6IHRoaXMuc2VhcmNoRm9ybS5weGNjDQogICAgICB9KQ0KICAgIH0sDQoNCiAgICBmZXRjaExpc3QoKSB7DQogICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlDQogICAgICBsaXN0U3ViamVjdCh0aGlzLmJ1aWxkUXVlcnkoKSkNCiAgICAgICAgLnRoZW4ocmVzID0+IHsNCiAgICAgICAgICBjb25zdCBkYXRhID0gKHJlcyAmJiByZXMuZGF0YSkgfHwge30NCiAgICAgICAgICB0aGlzLnRhYmxlRGF0YSA9IGRhdGEucmVjb3JkcyB8fCBbXQ0KICAgICAgICAgIHRoaXMudG90YWwgPSBkYXRhLnRvdGFsIHx8IDANCiAgICAgICAgICB0aGlzLnN0YXR1c1RpcCA9IGDlhbHmo4DntKLliLAgJHt0aGlzLnRvdGFsfSDmnaHorrDlvZVgDQogICAgICAgIH0pDQogICAgICAgIC5maW5hbGx5KCgpID0+IHsNCiAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZQ0KICAgICAgICB9KQ0KICAgIH0sDQoNCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PSDmn6Xor6IgPT09PT09PT09PT09PT09PT09PT0NCiAgICBoYW5kbGVRdWVyeSgpIHsNCiAgICAgIHRoaXMucGFnZU51bSA9IDENCiAgICAgIHRoaXMuZmV0Y2hMaXN0KCkNCiAgICB9LA0KDQogICAgaGFuZGxlUGFnZUNoYW5nZShjdXJyZW50KSB7DQogICAgICB0aGlzLnBhZ2VOdW0gPSBjdXJyZW50DQogICAgICB0aGlzLmZldGNoTGlzdCgpDQogICAgfSwNCiAgICBoYW5kbGVTaXplQ2hhbmdlKHNpemUpIHsNCiAgICAgIHRoaXMucGFnZVNpemUgPSBzaXplDQogICAgICB0aGlzLnBhZ2VOdW0gPSAxDQogICAgICB0aGlzLmZldGNoTGlzdCgpDQogICAgfSwNCiAgICBoYW5kbGVTZWxlY3Rpb25DaGFuZ2Uocm93cykgew0KICAgICAgdGhpcy5zZWxlY3RlZFJvd3MgPSByb3dzDQogICAgfSwNCg0KICAgIC8vID09PT09PT09PT09PT09PT09PT09IOWIoOmZpOaJgOmAiSA9PT09PT09PT09PT09PT09PT09PQ0KICAgIGhhbmRsZUJhdGNoRGVsZXRlKCkgew0KICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRSb3dzLmxlbmd0aCA9PT0gMCkgew0KICAgICAgICB0aGlzLiRtZXNzYWdlLndhcm5pbmcoJ+ivt+WFiOmAieaLqeimgeWIoOmZpOeahOiusOW9lScpDQogICAgICAgIHJldHVybg0KICAgICAgfQ0KICAgICAgY29uc3Qga2JoTGlzdCA9IHRoaXMuc2VsZWN0ZWRSb3dzLm1hcChyID0+IHIua2JoKQ0KICAgICAgdGhpcy4kY29uZmlybShg56Gu5a6a5Yig6Zmk5omA6YCJICR7a2JoTGlzdC5sZW5ndGh9IOadoeivvueoi+enkeebruWQl++8n2AsICfmj5DnpLonLCB7DQogICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiAn56Gu5a6aJywNCiAgICAgICAgY2FuY2VsQnV0dG9uVGV4dDogJ+WPlua2iCcsDQogICAgICAgIHR5cGU6ICd3YXJuaW5nJw0KICAgICAgfSkudGhlbigoKSA9PiB7DQogICAgICAgIGNvbnN0IHRhc2tzID0ga2JoTGlzdC5tYXAoa2JoID0+IGRlbGV0ZVN1YmplY3Qoa2JoKSkNCiAgICAgICAgUHJvbWlzZS5hbGwodGFza3MpDQogICAgICAgICAgLnRoZW4oKCkgPT4gew0KICAgICAgICAgICAgdGhpcy4kbWVzc2FnZS5zdWNjZXNzKGDlt7LliKDpmaQgJHtrYmhMaXN0Lmxlbmd0aH0g5p2h6K6w5b2VYCkNCiAgICAgICAgICAgIHRoaXMuZmV0Y2hMaXN0KCkNCiAgICAgICAgICB9KQ0KICAgICAgICAgIC5jYXRjaCgoKSA9PiB7DQogICAgICAgICAgICB0aGlzLiRtZXNzYWdlLmVycm9yKCfliKDpmaTlpLHotKUnKQ0KICAgICAgICAgIH0pDQogICAgICB9KS5jYXRjaCgoKSA9PiB7fSkNCiAgICB9LA0KDQogICAgLyoqIOWNleadoeWIoOmZpCAqLw0KICAgIGhhbmRsZURlbGV0ZShyb3cpIHsNCiAgICAgIHRoaXMuJGNvbmZpcm0oYOehruWumuWIoOmZpOivvueoi+enkeebruOAjCR7cm93LmttYyB8fCByb3cua2JofeOAjeWQl++8n2AsICfmj5DnpLonLCB7DQogICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiAn56Gu5a6aJywNCiAgICAgICAgY2FuY2VsQnV0dG9uVGV4dDogJ+WPlua2iCcsDQogICAgICAgIHR5cGU6ICd3YXJuaW5nJw0KICAgICAgfSkudGhlbigoKSA9PiB7DQogICAgICAgIHJldHVybiBkZWxldGVTdWJqZWN0KHJvdy5rYmgpDQogICAgICB9KS50aGVuKCgpID0+IHsNCiAgICAgICAgdGhpcy4kbWVzc2FnZS5zdWNjZXNzKCfliKDpmaTmiJDlip8nKQ0KICAgICAgICB0aGlzLmZldGNoTGlzdCgpDQogICAgICB9KS5jYXRjaCgoZXJyKSA9PiB7DQogICAgICAgIGlmIChlcnIgJiYgZXJyICE9PSAnY2FuY2VsJykgew0KICAgICAgICAgIHRoaXMuJG1lc3NhZ2UuZXJyb3IoJ+WIoOmZpOWksei0pScpDQogICAgICAgIH0NCiAgICAgIH0pDQogICAgfSwNCg0KICAgIC8vID09PT09PT09PT09PT09PT09PT09IOS4i+i9ve+8iOWQjuerr+aaguacquaPkOS+m++8iSA9PT09PT09PT09PT09PT09PT09PQ0KICAgIGhhbmRsZURvd25sb2FkQ291cnNlKCkgew0KICAgICAgdGhpcy4kbWVzc2FnZS53YXJuaW5nKCflkI7nq6/mmoLmnKrmj5Dkvpvor6XmjqXlj6MnKQ0KICAgIH0sDQogICAgaGFuZGxlRG93bmxvYWRUZXh0Ym9vaygpIHsNCiAgICAgIHRoaXMuJG1lc3NhZ2Uud2FybmluZygn5ZCO56uv5pqC5pyq5o+Q5L6b6K+l5o6l5Y+jJykNCiAgICB9LA0KICAgIGhhbmRsZURvd25sb2FkVGVtcGxhdGUoKSB7DQogICAgICB0aGlzLiRtZXNzYWdlLndhcm5pbmcoJ+WQjuerr+aaguacquaPkOS+m+ivpeaOpeWPoycpDQogICAgfSwNCg0KICAgIC8vID09PT09PT09PT09PT09PT09PT09IOaWh+S7tuS4iuS8oO+8iOWQjuerr+aaguacquaPkOS+m++8iSA9PT09PT09PT09PT09PT09PT09PQ0KICAgIGhhbmRsZVNlbGVjdEZpbGUoKSB7DQogICAgICB0aGlzLiRyZWZzLmZpbGVJbnB1dFJlZiAmJiB0aGlzLiRyZWZzLmZpbGVJbnB1dFJlZi5jbGljaygpDQogICAgfSwNCg0KICAgIGhhbmRsZUZpbGVDaGFuZ2UoZSkgew0KICAgICAgY29uc3QgaW5wdXQgPSBlLnRhcmdldA0KICAgICAgdGhpcy5zZWxlY3RlZEZpbGUgPSAoaW5wdXQuZmlsZXMgJiYgaW5wdXQuZmlsZXNbMF0pIHx8IG51bGwNCiAgICB9LA0KDQogICAgaGFuZGxlVXBsb2FkKCkgew0KICAgICAgdGhpcy4kbWVzc2FnZS53YXJuaW5nKCflkI7nq6/mmoLmnKrmj5Dkvpvor6XmjqXlj6MnKQ0KICAgIH0sDQoNCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PSDmlrDlop4v57yW6L6R5by556qXID09PT09PT09PT09PT09PT09PT09DQogICAgaGFuZGxlT3BlbkRpYWxvZygpIHsNCiAgICAgIHRoaXMuaXNFZGl0ID0gZmFsc2UNCiAgICAgIHRoaXMucmVzZXRGb3JtKCkNCiAgICAgIHRoaXMuZGlhbG9nVmlzaWJsZSA9IHRydWUNCiAgICB9LA0KDQogICAgaGFuZGxlRWRpdChyb3cpIHsNCiAgICAgIHRoaXMuYWRkTG9hZGluZyA9IHRydWUNCiAgICAgIGdldEtiKHJvdy5rYmgpDQogICAgICAgIC50aGVuKHJlcyA9PiB7DQogICAgICAgICAgY29uc3QgZGF0YSA9IChyZXMgJiYgcmVzLmRhdGEpIHx8IHJvdw0KICAgICAgICAgIHRoaXMuaXNFZGl0ID0gdHJ1ZQ0KICAgICAgICAgIHRoaXMuYWRkRm9ybSA9IE9iamVjdC5hc3NpZ24odGhpcy5jcmVhdGVFbXB0eUZvcm0oKSwgZGF0YSkNCiAgICAgICAgICB0aGlzLmRpYWxvZ1Zpc2libGUgPSB0cnVlDQogICAgICAgIH0pDQogICAgICAgIC5maW5hbGx5KCgpID0+IHsNCiAgICAgICAgICB0aGlzLmFkZExvYWRpbmcgPSBmYWxzZQ0KICAgICAgICB9KQ0KICAgIH0sDQoNCiAgICBoYW5kbGVTdWJtaXQoKSB7DQogICAgICB0aGlzLiRyZWZzLmFkZEZvcm1SZWYudmFsaWRhdGUoKHZhbGlkKSA9PiB7DQogICAgICAgIGlmICghdmFsaWQpIHJldHVybg0KICAgICAgICB0aGlzLmFkZExvYWRpbmcgPSB0cnVlDQogICAgICAgIGNvbnN0IHBheWxvYWQgPSB0aGlzLmNsZWFuUGF5bG9hZCh7IC4uLnRoaXMuYWRkRm9ybSB9KQ0KICAgICAgICBjb25zdCByZXF1ZXN0Rm4gPSB0aGlzLmlzRWRpdCA/IHVwZGF0ZVN1YmplY3QgOiBhZGRTdWJqZWN0DQogICAgICAgIHJlcXVlc3RGbihwYXlsb2FkKQ0KICAgICAgICAgIC50aGVuKCgpID0+IHsNCiAgICAgICAgICAgIHRoaXMuJG1lc3NhZ2Uuc3VjY2Vzcyh0aGlzLmlzRWRpdCA/ICfkv67mlLnmiJDlip8nIDogJ+S/neWtmOaIkOWKnycpDQogICAgICAgICAgICB0aGlzLmRpYWxvZ1Zpc2libGUgPSBmYWxzZQ0KICAgICAgICAgICAgdGhpcy5mZXRjaExpc3QoKQ0KICAgICAgICAgIH0pDQogICAgICAgICAgLmZpbmFsbHkoKCkgPT4gew0KICAgICAgICAgICAgdGhpcy5hZGRMb2FkaW5nID0gZmFsc2UNCiAgICAgICAgICB9KQ0KICAgICAgfSkNCiAgICB9LA0KDQogICAgaGFuZGxlQ2FuY2VsKCkgew0KICAgICAgdGhpcy5kaWFsb2dWaXNpYmxlID0gZmFsc2UNCiAgICB9DQogIH0NCn0NCg=="},{"version":3,"sources":["index.vue"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkUA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;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;;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;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;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;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;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA","file":"index.vue","sourceRoot":"src/views/teachOffice/subject","sourcesContent":["<template>\r\n <div class=\"app-container management-page subject-page\">\r\n\r\n <!-- ==================== 2. 查询条件区域 ==================== -->\r\n <el-card shadow=\"never\" class=\"search-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 :model=\"searchForm\">\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.kmc\" 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.kmdm\" 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.pxcc\" 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.kclx\" placeholder=\"请输入课程类型\" clearable class=\"q-control\" />\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.jc\" 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.jysdh\" 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.pxlx\" placeholder=\"请输入培训类型\" clearable class=\"q-control\" />\r\n </div>\r\n </el-col>\r\n </el-row>\r\n </el-form>\r\n\r\n </el-card>\r\n\r\n <!-- ==================== 3. 操作按钮区域 ==================== -->\r\n <el-card shadow=\"never\" class=\"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=\"handleOpenDialog\">新建课程科目</el-button>\r\n <el-button type=\"danger\" plain icon=\"el-icon-delete\" @click=\"handleBatchDelete\">删除所选</el-button>\r\n <el-button icon=\"el-icon-download\" @click=\"handleDownloadCourse\">下载课程科目基本信息</el-button>\r\n <el-button icon=\"el-icon-download\" @click=\"handleDownloadTextbook\">下载课程教材基本信息</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 </el-card>\r\n\r\n <!-- ==================== 4. 文件上传区域 ==================== -->\r\n <el-card shadow=\"never\" class=\"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-checkbox v-model=\"coverExist\">覆盖已存在课程科目</el-checkbox>\r\n <el-button type=\"primary\" icon=\"el-icon-upload2\" @click=\"handleUpload\">上传数据</el-button>\r\n </div>\r\n </div>\r\n </el-card>\r\n\r\n <!-- ==================== 6. 数据表格区域 ==================== -->\r\n <el-card shadow=\"never\" class=\"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\" stripe border highlight-current-row\r\n @selection-change=\"handleSelectionChange\">\r\n <el-table-column type=\"selection\" width=\"40\" align=\"center\" />\r\n <el-table-column prop=\"kbh\" label=\"课编号\" width=\"130\" show-overflow-tooltip />\r\n <el-table-column prop=\"kmc\" label=\"课名称\" width=\"200\" show-overflow-tooltip />\r\n <el-table-column prop=\"jc\" label=\"简称\" width=\"130\" show-overflow-tooltip />\r\n <el-table-column prop=\"jysdh\" label=\"教研室代号\" width=\"150\" show-overflow-tooltip />\r\n <el-table-column prop=\"kclx\" label=\"课程类型\" width=\"150\" align=\"center\" />\r\n <el-table-column prop=\"pxlx\" label=\"培训类型\" width=\"150\" align=\"center\" />\r\n <el-table-column prop=\"pxcc\" label=\"培训层次\" width=\"200\" align=\"center\" />\r\n <el-table-column prop=\"xf\" label=\"学分\" align=\"center\" />\r\n <el-table-column prop=\"xs\" label=\"学时\" width=\"160\" align=\"center\" />\r\n <el-table-column label=\"操作\" width=\"150\" align=\"center\" fixed=\"right\">\r\n <template slot-scope=\"{ row }\">\r\n <el-button type=\"text\" size=\"small\" @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 <!-- 新增/编辑课程科目弹窗 -->\r\n <el-dialog\r\n :visible=\"dialogVisible\"\r\n :title=\"dialogTitle\"\r\n width=\"1000px\"\r\n :close-on-click-modal=\"false\"\r\n class=\"add-dialog\"\r\n @update:visible=\"val => dialogVisible = val\"\r\n >\r\n <el-form ref=\"addFormRef\" :model=\"addForm\" :rules=\"rules\" label-width=\"120px\" class=\"add-form\" :status-icon=\"false\">\r\n <el-row :gutter=\"24\">\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"8\">\r\n <el-form-item label=\"课编号\" prop=\"kbh\">\r\n <el-input v-model=\"addForm.kbh\" :disabled=\"isEdit\" placeholder=\"新增时留空自动生成\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"8\">\r\n <el-form-item label=\"课名称\" prop=\"kmc\">\r\n <el-input v-model=\"addForm.kmc\" placeholder=\"请输入课名称\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"8\">\r\n <el-form-item label=\"简称\" prop=\"jc\">\r\n <el-input v-model=\"addForm.jc\" placeholder=\"请输入简称\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"8\">\r\n <el-form-item label=\"教研室代号\" prop=\"jysdh\">\r\n <el-input v-model=\"addForm.jysdh\" placeholder=\"请输入教研室代号\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"8\">\r\n <el-form-item label=\"学分\" prop=\"xf\">\r\n <el-input-number v-model=\"addForm.xf\" :min=\"0\" :precision=\"1\" controls-position=\"right\" class=\"w-full\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"8\">\r\n <el-form-item label=\"学时\" prop=\"xs\">\r\n <el-input-number v-model=\"addForm.xs\" :min=\"0\" controls-position=\"right\" class=\"w-full\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"8\">\r\n <el-form-item label=\"培训层次\" prop=\"pxcc\">\r\n <el-input v-model=\"addForm.pxcc\" placeholder=\"请输入培训层次\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"8\">\r\n <el-form-item label=\"培训类型\" prop=\"pxlx\">\r\n <el-input v-model=\"addForm.pxlx\" placeholder=\"请输入培训类型\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"8\">\r\n <el-form-item label=\"课程类型\" prop=\"kclx\">\r\n <el-input v-model=\"addForm.kclx\" placeholder=\"请输入课程类型\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"8\">\r\n <el-form-item label=\"考试课时\" prop=\"ksks\">\r\n <el-input-number v-model=\"addForm.ksks\" :min=\"0\" controls-position=\"right\" class=\"w-full\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"8\">\r\n <el-form-item label=\"成绩分制\" prop=\"cjfz\">\r\n <el-input v-model=\"addForm.cjfz\" placeholder=\"请输入成绩分制\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"8\">\r\n <el-form-item label=\"不计入学员平均分\" prop=\"bjrxypjf\">\r\n <el-select v-model=\"addForm.bjrxypjf\" 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 :xs=\"24\" :sm=\"12\" :md=\"8\">\r\n <el-form-item label=\"理论学时\" prop=\"llxs\">\r\n <el-input-number v-model=\"addForm.llxs\" :min=\"0\" controls-position=\"right\" class=\"w-full\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"8\">\r\n <el-form-item label=\"实践学时\" prop=\"sjxs\">\r\n <el-input-number v-model=\"addForm.sjxs\" :min=\"0\" controls-position=\"right\" class=\"w-full\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"8\">\r\n <el-form-item label=\"周课时\" prop=\"zks\">\r\n <el-input-number v-model=\"addForm.zks\" :min=\"0\" controls-position=\"right\" class=\"w-full\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"8\">\r\n <el-form-item label=\"课类型\" prop=\"klx\">\r\n <el-input v-model=\"addForm.klx\" placeholder=\"请输入课类型\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"8\">\r\n <el-form-item label=\"考试课时不显示\" prop=\"ksksbxs\">\r\n <el-select v-model=\"addForm.ksksbxs\" 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 :xs=\"24\" :sm=\"12\" :md=\"8\">\r\n <el-form-item label=\"课程统一编号\" prop=\"kctybh\">\r\n <el-input v-model=\"addForm.kctybh\" placeholder=\"请输入课程统一编号\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"8\">\r\n <el-form-item label=\"辅导答疑课时\" prop=\"fddyks\">\r\n <el-input-number v-model=\"addForm.fddyks\" :min=\"0\" controls-position=\"right\" class=\"w-full\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"8\">\r\n <el-form-item label=\"自修课时\" prop=\"zxks\">\r\n <el-input-number v-model=\"addForm.zxks\" :min=\"0\" controls-position=\"right\" class=\"w-full\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"8\">\r\n <el-form-item label=\"修订日期\" prop=\"xdrq\">\r\n <el-input v-model=\"addForm.xdrq\" placeholder=\"如 2026-08-24\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"8\">\r\n <el-form-item label=\"节次优选级\" prop=\"jcyxj\">\r\n <el-input v-model=\"addForm.jcyxj\" placeholder=\"请输入节次优选级\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"8\">\r\n <el-form-item label=\"课程支持方式\" prop=\"kczcfs\">\r\n <el-input v-model=\"addForm.kczcfs\" placeholder=\"请输入课程支持方式\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"8\">\r\n <el-form-item label=\"课程建设方式\" prop=\"kcjsfs\">\r\n <el-input v-model=\"addForm.kcjsfs\" placeholder=\"请输入课程建设方式\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"8\">\r\n <el-form-item label=\"政治类课程\" prop=\"zzlkc\">\r\n <el-select v-model=\"addForm.zzlkc\" 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 :xs=\"24\" :sm=\"12\" :md=\"8\">\r\n <el-form-item label=\"考核方式\" prop=\"khfs\">\r\n <el-input v-model=\"addForm.khfs\" placeholder=\"请输入考核方式\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"8\">\r\n <el-form-item label=\"形成性成绩分值\" prop=\"xcxcjfz\">\r\n <el-input-number v-model=\"addForm.xcxcjfz\" :min=\"0\" controls-position=\"right\" class=\"w-full\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"8\">\r\n <el-form-item label=\"终结性成绩分值\" prop=\"zjxcjfz\">\r\n <el-input-number v-model=\"addForm.zjxcjfz\" :min=\"0\" controls-position=\"right\" class=\"w-full\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"8\">\r\n <el-form-item label=\"密级\" prop=\"mj\">\r\n <el-input v-model=\"addForm.mj\" placeholder=\"请输入密级\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"8\">\r\n <el-form-item label=\"评选情况\" prop=\"pxqk\">\r\n <el-input v-model=\"addForm.pxqk\" placeholder=\"请输入评选情况\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"24\" :md=\"24\">\r\n <el-form-item label=\"备注\">\r\n <el-input v-model=\"addForm.bz\" type=\"textarea\" :rows=\"2\" placeholder=\"请输入备注\" />\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n </el-form>\r\n <div slot=\"footer\">\r\n <div class=\"dialog-footer\">\r\n <el-button @click=\"handleCancel\">取消</el-button>\r\n <el-button type=\"primary\" :loading=\"addLoading\" @click=\"handleSubmit\">保存</el-button>\r\n </div>\r\n </div>\r\n </el-dialog>\r\n </div>\r\n</template>\r\n\r\n<script>\r\nimport { listKb as listSubject, addKb as addSubject, updateKb as updateSubject, deleteKb as deleteSubject, getKb } from '@/api/teachOffice/kb'\r\n\r\nexport default {\r\n name: 'SubjectIndex',\r\n data() {\r\n return {\r\n // ==================== 1. 顶部状态提示 ====================\r\n statusTip: '请输入查询条件',\r\n\r\n // ==================== 2. 查询条件 ====================\r\n searchForm: {\r\n kmc: '',\r\n jc: '',\r\n kmdm: '',\r\n jysdh: '',\r\n kclx: '',\r\n pxlx: '',\r\n pxcc: ''\r\n },\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 selectedRows: [],\r\n\r\n // ==================== 文件上传 ====================\r\n selectedFile: null,\r\n coverExist: false,\r\n\r\n // ==================== 新增/编辑弹窗 ====================\r\n dialogVisible: false,\r\n addLoading: false,\r\n isEdit: false,\r\n addForm: this.createEmptyForm(),\r\n rules: {\r\n kmc: [{ required: true, message: '请输入课名称', trigger: 'blur' }],\r\n jysdh: [{ required: true, message: '请输入教研室代号', trigger: 'blur' }],\r\n xf: [{ required: true, message: '请输入学分', trigger: 'blur' }],\r\n pxcc: [{ required: true, message: '请输入培训层次', trigger: 'blur' }],\r\n pxlx: [{ required: true, message: '请输入培训类型', trigger: 'blur' }],\r\n kclx: [{ required: true, message: '请输入课程类型', trigger: 'blur' }],\r\n ksks: [{ required: true, message: '请输入考试课时', trigger: 'blur' }],\r\n cjfz: [{ required: true, message: '请输入成绩分制', trigger: 'blur' }],\r\n llxs: [{ required: true, message: '请输入理论学时', trigger: 'blur' }],\r\n sjxs: [{ required: true, message: '请输入实践学时', trigger: 'blur' }],\r\n zks: [{ required: true, message: '请输入周课时', trigger: 'blur' }],\r\n klx: [{ required: true, message: '请输入课类型', trigger: 'blur' }],\r\n kctybh: [{ required: true, message: '请输入课程统一编号', trigger: 'blur' }],\r\n fddyks: [{ required: true, message: '请输入辅导答疑课时', trigger: 'blur' }],\r\n zxks: [{ required: true, message: '请输入自修课时', trigger: 'blur' }],\r\n xdrq: [{ required: true, message: '请输入修订日期', trigger: 'blur' }],\r\n jcyxj: [{ required: true, message: '请输入节次优选级', trigger: 'blur' }],\r\n kczcfs: [{ required: true, message: '请输入课程支持方式', trigger: 'blur' }],\r\n kcjsfs: [{ required: true, message: '请输入课程建设方式', trigger: 'blur' }],\r\n khfs: [{ required: true, message: '请输入考核方式', trigger: 'blur' }],\r\n xcxcjfz: [{ required: true, message: '请输入形成性成绩分值', trigger: 'blur' }],\r\n zjxcjfz: [{ required: true, message: '请输入终结性成绩分值', trigger: 'blur' }],\r\n mj: [{ required: true, message: '请输入密级', trigger: 'blur' }],\r\n pxqk: [{ required: true, message: '请输入评选情况', trigger: 'blur' }]\r\n }\r\n }\r\n },\r\n computed: {\r\n dialogTitle() {\r\n return this.isEdit ? '编辑课程科目' : '新增课程科目'\r\n },\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 /** 移除空值 */\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 createEmptyForm() {\r\n return {\r\n kbh: '', kmc: '', jysdh: '', bz: '', xh: '', xf: 0, jc: '', xs: 0,\r\n pxcc: '', pxlx: '', kclx: '', ksks: 0, py: '', gfmc: '', cjfz: '',\r\n bjrxypjf: 0, jxglbmbh: '', llxs: 0, sjxs: 0, kmdm: '', zks: 0, klx: '',\r\n ksksbxs: 0, kctybh: '', sydx: '', fddyks: 0, zxks: 0, bb: '', xdrq: '',\r\n jcyxj: '', kczcfs: '', kcjsfs: '', jsonzd: '', zzlkc: 0, khfs: '',\r\n xcxcjfz: 0, zjxcjfz: 0, mj: '', pxqk: ''\r\n }\r\n },\r\n\r\n resetForm() {\r\n this.addForm = this.createEmptyForm()\r\n },\r\n\r\n // ==================== 列表加载 ====================\r\n buildQuery() {\r\n return this.cleanPayload({\r\n pageNum: this.pageNum,\r\n pageSize: this.pageSize,\r\n kmc: this.searchForm.kmc,\r\n jc: this.searchForm.jc,\r\n kmdm: this.searchForm.kmdm,\r\n jysdh: this.searchForm.jysdh,\r\n kclx: this.searchForm.kclx,\r\n pxlx: this.searchForm.pxlx,\r\n pxcc: this.searchForm.pxcc\r\n })\r\n },\r\n\r\n fetchList() {\r\n this.loading = true\r\n listSubject(this.buildQuery())\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 this.statusTip = `共检索到 ${this.total} 条记录`\r\n })\r\n .finally(() => {\r\n this.loading = false\r\n })\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(current) {\r\n this.pageNum = current\r\n this.fetchList()\r\n },\r\n handleSizeChange(size) {\r\n this.pageSize = size\r\n this.pageNum = 1\r\n this.fetchList()\r\n },\r\n handleSelectionChange(rows) {\r\n this.selectedRows = rows\r\n },\r\n\r\n // ==================== 删除所选 ====================\r\n handleBatchDelete() {\r\n if (this.selectedRows.length === 0) {\r\n this.$message.warning('请先选择要删除的记录')\r\n return\r\n }\r\n const kbhList = this.selectedRows.map(r => r.kbh)\r\n this.$confirm(`确定删除所选 ${kbhList.length} 条课程科目吗?`, '提示', {\r\n confirmButtonText: '确定',\r\n cancelButtonText: '取消',\r\n type: 'warning'\r\n }).then(() => {\r\n const tasks = kbhList.map(kbh => deleteSubject(kbh))\r\n Promise.all(tasks)\r\n .then(() => {\r\n this.$message.success(`已删除 ${kbhList.length} 条记录`)\r\n this.fetchList()\r\n })\r\n .catch(() => {\r\n this.$message.error('删除失败')\r\n })\r\n }).catch(() => {})\r\n },\r\n\r\n /** 单条删除 */\r\n handleDelete(row) {\r\n this.$confirm(`确定删除课程科目「${row.kmc || row.kbh}」吗?`, '提示', {\r\n confirmButtonText: '确定',\r\n cancelButtonText: '取消',\r\n type: 'warning'\r\n }).then(() => {\r\n return deleteSubject(row.kbh)\r\n }).then(() => {\r\n this.$message.success('删除成功')\r\n this.fetchList()\r\n }).catch((err) => {\r\n if (err && err !== 'cancel') {\r\n this.$message.error('删除失败')\r\n }\r\n })\r\n },\r\n\r\n // ==================== 下载(后端暂未提供) ====================\r\n handleDownloadCourse() {\r\n this.$message.warning('后端暂未提供该接口')\r\n },\r\n handleDownloadTextbook() {\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\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 this.$message.warning('后端暂未提供该接口')\r\n },\r\n\r\n // ==================== 新增/编辑弹窗 ====================\r\n handleOpenDialog() {\r\n this.isEdit = false\r\n this.resetForm()\r\n this.dialogVisible = true\r\n },\r\n\r\n handleEdit(row) {\r\n this.addLoading = true\r\n getKb(row.kbh)\r\n .then(res => {\r\n const data = (res && res.data) || row\r\n this.isEdit = true\r\n this.addForm = Object.assign(this.createEmptyForm(), data)\r\n this.dialogVisible = true\r\n })\r\n .finally(() => {\r\n this.addLoading = false\r\n })\r\n },\r\n\r\n handleSubmit() {\r\n this.$refs.addFormRef.validate((valid) => {\r\n if (!valid) return\r\n this.addLoading = true\r\n const payload = this.cleanPayload({ ...this.addForm })\r\n const requestFn = this.isEdit ? updateSubject : addSubject\r\n requestFn(payload)\r\n .then(() => {\r\n this.$message.success(this.isEdit ? '修改成功' : '保存成功')\r\n this.dialogVisible = false\r\n this.fetchList()\r\n })\r\n .finally(() => {\r\n this.addLoading = false\r\n })\r\n })\r\n },\r\n\r\n handleCancel() {\r\n this.dialogVisible = false\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// ==================== 1. 顶部状态提示 ====================\r\n.status-tip {\r\n display: inline-block;\r\n background: #dc3545;\r\n color: #fff;\r\n font-size: 12px;\r\n padding: 3px 10px;\r\n border-radius: 4px;\r\n margin-bottom: 12px;\r\n}\r\n\r\n// ==================== 2. 查询条件区域 ====================\r\n.search-card {\r\n margin-bottom: 16px;\r\n\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 ::v-deep(.el-checkbox) {\r\n margin-right: 6px;\r\n flex-shrink: 0;\r\n }\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 &.no-check {\r\n margin-left: 24px;\r\n }\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 .notice {\r\n font-size: 12px;\r\n color: #f56c6c;\r\n margin-top: 8px;\r\n text-align: left;\r\n }\r\n\r\n}\r\n\r\n// ==================== 3. 操作按钮区域 ====================\r\n.action-card {\r\n margin-bottom: 16px;\r\n\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// ==================== 4. 文件上传区域 ====================\r\n.upload-card {\r\n margin-bottom: 16px;\r\n\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 gap: 12px;\r\n }\r\n }\r\n}\r\n\r\n// ==================== 5. 红色提示文字 ====================\r\n.red-tip {\r\n font-size: 14px;\r\n color: #f56c6c;\r\n margin-bottom: 16px;\r\n line-height: 1.6;\r\n}\r\n\r\n// ==================== 6. 数据表格区域 ====================\r\n.table-card {\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 ::v-deep(.el-table .cell) {\r\n font-size: 12px;\r\n }\r\n\r\n .text-danger {\r\n color: #f56c6c;\r\n }\r\n}\r\n\r\n// ==================== 新增/编辑弹窗 ====================\r\n.add-dialog {\r\n ::v-deep(.el-dialog__body) {\r\n max-height: 70vh;\r\n overflow: auto;\r\n }\r\n}\r\n\r\n.add-form {\r\n .w-full {\r\n width: 100%;\r\n }\r\n}\r\n\r\n.dialog-footer {\r\n display: flex;\r\n justify-content: flex-end;\r\n gap: 12px;\r\n}\r\n\r\n</style>\r\n"]}]}