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

1 line
74 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"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\\teacher\\index.vue?vue&type=script&lang=js","dependencies":[{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\src\\views\\teachOffice\\teacher\\index.vue","mtime":1787653241904},{"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:Ly8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KDQppbXBvcnQgew0KICBsaXN0VGVhY2hlciwNCiAgZ2V0VGVhY2hlciwNCiAgYWRkVGVhY2hlciwNCiAgdXBkYXRlVGVhY2hlciwNCiAgZGlzYWJsZVRlYWNoZXIsDQogIGdldFRlYWNoZXJBdHRyaWJ1dGUsDQogIHVwZGF0ZVRlYWNoZXJBdHRyaWJ1dGUNCn0gZnJvbSAnQC9hcGkvdGVhY2hPZmZpY2UvdGVhY2hlcicNCmltcG9ydCB7IGdldERpY3RzIH0gZnJvbSAnQC9hcGkvc3lzdGVtL2RpY3QvZGF0YScNCg0KZXhwb3J0IGRlZmF1bHQgew0KICBuYW1lOiAnVGVhY2hlcicsDQogIGRhdGEoKSB7DQogICAgcmV0dXJuIHsNCiAgICAgIC8vIOafpeivouadoeS7tu+8iOS7heWQjuerryBKWUJNYXBwZXIueG1sIOaUr+aMgeeahOWtl+aute+8mmp5eG0g5qih57OKIC8ganlzZGgg562J5YC8IC8gemMg5qih57OKIC8ganlsYiDnrYnlgLzvvIkNCiAgICAgIHNlYXJjaEZvcm06IHsganl4bTogJycsIGp5c2RoOiAnJywgemM6ICcnLCBqeWxiOiAnJyB9LA0KDQogICAgICAvLyDliJfooagNCiAgICAgIGxvYWRpbmc6IGZhbHNlLA0KICAgICAgdGFibGVEYXRhOiBbXSwNCiAgICAgIHNlbGVjdGVkUm93czogW10sDQogICAgICBwYWdpbmF0aW9uOiB7IHBhZ2VOdW06IDEsIHBhZ2VTaXplOiAyMCwgdG90YWw6IDAgfSwNCg0KICAgICAgLy8g5paw5bu6DQogICAgICBhZGREaWFsb2dWaXNpYmxlOiBmYWxzZSwNCiAgICAgIGFkZFNhdmluZzogZmFsc2UsDQogICAgICBhZGRGb3JtOiB0aGlzLmNyZWF0ZUVtcHR5QWRkRm9ybSgpLA0KICAgICAgYWRkUnVsZXM6IHsNCiAgICAgICAgJ3RlYWNoZXIuanl4bSc6IFt7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAn6K+36L6T5YWl5pWZ5ZGY5aeT5ZCNJywgdHJpZ2dlcjogJ2JsdXInIH1dLA0KICAgICAgICANCiAgICAgICAgJ3RlYWNoZXIueGgnOiBbeyByZXF1aXJlZDogdHJ1ZSwgbWVzc2FnZTogJ+ivt+i+k+WFpeW6j+WPtycsIHRyaWdnZXI6ICdibHVyJyB9XSwNCiAgICAgICAgJ3RlYWNoZXIuenlqc3p3ZGonOiBbeyByZXF1aXJlZDogdHJ1ZSwgbWVzc2FnZTogJ+ivt+i+k+WFpeS4k+S4muaKgOacr+iBjOWKoeetiee6pycsIHRyaWdnZXI6ICdibHVyJyB9XSwNCiAgICAgICAgJ3RlYWNoZXIueHNseCc6IFt7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAn6K+36YCJ5oup6Jma5a6e57G75Z6LJywgdHJpZ2dlcjogJ2NoYW5nZScgfV0sDQogICAgICAgICd0ZWFjaGVyLmp5bGInOiBbeyByZXF1aXJlZDogdHJ1ZSwgbWVzc2FnZTogJ+ivt+mAieaLqeaVmeWRmOexu+WIqycsIHRyaWdnZXI6ICdjaGFuZ2UnIH1dLA0KICAgICAgICAndGVhY2hlci56emxiJzogW3sgcmVxdWlyZWQ6IHRydWUsIG1lc3NhZ2U6ICfor7fpgInmi6nlnKjogYznsbvliKsnLCB0cmlnZ2VyOiAnY2hhbmdlJyB9XSwNCiAgICAgICAgJ3RlYWNoZXIuZXd5eGticyc6IFt7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAn6K+36L6T5YWl6aKd5aSW5YWB6K645byA54+t5pWwJywgdHJpZ2dlcjogJ2NoYW5nZScgfV0sDQogICAgICAgICd0ZWFjaGVyLmRzbGInOiBbeyByZXF1aXJlZDogdHJ1ZSwgbWVzc2FnZTogJ+ivt+mAieaLqeWvvOW4iOexu+WIqycsIHRyaWdnZXI6ICdjaGFuZ2UnIH1dLA0KICAgICAgICAndGVhY2hlci54eSc6IFt7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAn6K+36L6T5YWl5a2m57yYJywgdHJpZ2dlcjogJ2JsdXInIH1dLA0KICAgICAgICAndGVhY2hlci5zZnpoJzogW3sgcmVxdWlyZWQ6IHRydWUsIG1lc3NhZ2U6ICfor7fovpPlhaXouqvku73or4Hlj7cnLCB0cmlnZ2VyOiAnYmx1cicgfV0sDQogICAgICAgICd0ZWFjaGVyLnhiJzogW3sgcmVxdWlyZWQ6IHRydWUsIG1lc3NhZ2U6ICfor7fpgInmi6nmgKfliKsnLCB0cmlnZ2VyOiAnY2hhbmdlJyB9XSwNCiAgICAgICAgJ3RlYWNoZXIud3hqeSc6IFt7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAn6K+36YCJ5oup5aSW6K6t5pWZ5ZGYJywgdHJpZ2dlcjogJ2NoYW5nZScgfV0sDQogICAgICAgICd0ZWFjaGVyLnd4eXknOiBbeyByZXF1aXJlZDogdHJ1ZSwgbWVzc2FnZTogJ+ivt+mAieaLqeWkluiureivkeWRmCcsIHRyaWdnZXI6ICdjaGFuZ2UnIH1dLA0KICAgICAgICAndGVhY2hlci56emxqeSc6IFt7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAn6K+36YCJ5oup5pS/5rK757G75pWZ5ZGYJywgdHJpZ2dlcjogJ2NoYW5nZScgfV0NCiAgICAgIH0sDQoNCiAgICAgIC8vIOe8lui+kQ0KICAgICAgZWRpdERpYWxvZ1Zpc2libGU6IGZhbHNlLA0KICAgICAgZWRpdExvYWRpbmc6IGZhbHNlLA0KICAgICAgZWRpdFNhdmluZzogZmFsc2UsDQogICAgICBlZGl0Rm9ybToge30sDQogICAgICBlZGl0UnVsZXM6IHsNCiAgICAgICAganl4bTogW3sgcmVxdWlyZWQ6IHRydWUsIG1lc3NhZ2U6ICfor7fovpPlhaXmlZnlkZjlp5PlkI0nLCB0cmlnZ2VyOiAnYmx1cicgfV0sDQogICAgICAgIGp5c2RoOiBbeyByZXF1aXJlZDogdHJ1ZSwgbWVzc2FnZTogJ+ivt+i+k+WFpeaVmeeglOWupOS7o+WPtycsIHRyaWdnZXI6ICdibHVyJyB9XSwNCiAgICAgICAgeGI6IFt7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAn6K+36YCJ5oup5oCn5YirJywgdHJpZ2dlcjogJ2NoYW5nZScgfV0sDQogICAgICAgIHNmemg6IFt7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAn6K+36L6T5YWl6Lqr5Lu96K+B5Y+3JywgdHJpZ2dlcjogJ2JsdXInIH1dLA0KICAgICAgICB6eWpzendkajogW3sgcmVxdWlyZWQ6IHRydWUsIG1lc3NhZ2U6ICfor7fovpPlhaXkuJPkuJrmioDmnK/ogYzliqHnrYnnuqcnLCB0cmlnZ2VyOiAnYmx1cicgfV0sDQogICAgICAgIHhzbHg6IFt7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAn6K+36YCJ5oup6Jma5a6e57G75Z6LJywgdHJpZ2dlcjogJ2NoYW5nZScgfV0sDQogICAgICAgIGp5bGI6IFt7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAn6K+36L6T5YWl5pWZ5ZGY57G75YirJywgdHJpZ2dlcjogJ2JsdXInIH1dLA0KICAgICAgICB6emxiOiBbeyByZXF1aXJlZDogdHJ1ZSwgbWVzc2FnZTogJ+ivt+i+k+WFpeWcqOiBjOexu+WIqycsIHRyaWdnZXI6ICdibHVyJyB9XSwNCiAgICAgICAgZHNsYjogW3sgcmVxdWlyZWQ6IHRydWUsIG1lc3NhZ2U6ICfor7fovpPlhaXlr7zluIjnsbvliKsnLCB0cmlnZ2VyOiAnYmx1cicgfV0sDQogICAgICAgIHh5OiBbeyByZXF1aXJlZDogdHJ1ZSwgbWVzc2FnZTogJ+ivt+i+k+WFpeWtpue8mCcsIHRyaWdnZXI6ICdibHVyJyB9XSwNCiAgICAgICAgZXd5eGticzogW3sgcmVxdWlyZWQ6IHRydWUsIG1lc3NhZ2U6ICfor7fovpPlhaXpop3lpJblhYHorrjlvIDnj63mlbAnLCB0cmlnZ2VyOiAnY2hhbmdlJyB9XSwNCiAgICAgICAgd3hqeTogW3sgcmVxdWlyZWQ6IHRydWUsIG1lc3NhZ2U6ICfor7fpgInmi6nlpJborq3mlZnlkZgnLCB0cmlnZ2VyOiAnY2hhbmdlJyB9XSwNCiAgICAgICAgd3h5eTogW3sgcmVxdWlyZWQ6IHRydWUsIG1lc3NhZ2U6ICfor7fpgInmi6nlpJborq3or5HlkZgnLCB0cmlnZ2VyOiAnY2hhbmdlJyB9XSwNCiAgICAgICAgenpsank6IFt7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAn6K+36YCJ5oup5pS/5rK757G75pWZ5ZGYJywgdHJpZ2dlcjogJ2NoYW5nZScgfV0NCiAgICAgIH0sDQoNCiAgICAgIC8vIOaVmeWRmOWxnuaApw0KICAgICAgYXR0cmlidXRlVmlzaWJsZTogZmFsc2UsDQogICAgICBhdHRyaWJ1dGVNb2RlOiAndmlldycsDQogICAgICBhdHRyaWJ1dGVEYXRhOiB7fSwNCiAgICAgIGF0dHJpYnV0ZUZvcm06IHt9LA0KICAgICAgYXR0cmlidXRlTG9hZGluZzogZmFsc2UsDQogICAgICBhdHRyaWJ1dGVTYXZpbmc6IGZhbHNlLA0KICAgICAgYXR0cmlidXRlSnliaDogJycsDQogICAgICAvLyDlrZflhbjpgInpobkNCiAgICAgIHp5anN6d2RqT3B0aW9uczogW10sDQogICAgICBqeWxiT3B0aW9uczogW10sDQogICAgICB6emxiT3B0aW9uczogW10sDQogICAgICBkc2xiT3B0aW9uczogW10NCiAgICB9DQogIH0sDQogIG1vdW50ZWQoKSB7DQogICAgdGhpcy5mZXRjaExpc3QoKQ0KICAgIHRoaXMubG9hZERpY3RzKCkNCiAgfSwNCiAgbWV0aG9kczogew0KICAgIC8qKiDnu5/kuIDmoLzlvI/ljJblkI7nq68gTG9jYWxEYXRlVGltZe+8iOWOu+mZpCBU44CB5oiq5pat5Yiw56eS77yJICovDQogICAgZm10RGF0ZVRpbWUodmFsKSB7DQogICAgICBpZiAodmFsID09PSBudWxsIHx8IHZhbCA9PT0gdW5kZWZpbmVkIHx8IHZhbCA9PT0gJycpIHJldHVybiAnJw0KICAgICAgcmV0dXJuIFN0cmluZyh2YWwpLnJlcGxhY2UoJ1QnLCAnICcpLnNsaWNlKDAsIDE5KQ0KICAgIH0sDQoNCiAgICAvKiog56m65YC85pi+56S65Li6ICctJyAqLw0KICAgIGZtdFZhbCh2YWwpIHsNCiAgICAgIHJldHVybiAodmFsID09PSBudWxsIHx8IHZhbCA9PT0gdW5kZWZpbmVkIHx8IHZhbCA9PT0gJycpID8gJy0nIDogdmFsDQogICAgfSwNCg0KICAgIC8qKiDmgKfliKvvvJoxLeeUtyAwLeWls++8iOS4juWQjuerryBUZWFjaGVyTGlzdFZPIOazqOmHiuWPiuWtpuWRmOmhtee6puWumuS4gOiHtO+8iSAqLw0KICAgIGZtdEdlbmRlcih2YWwpIHsNCiAgICAgIGlmICh2YWwgPT09IG51bGwgfHwgdmFsID09PSB1bmRlZmluZWQgfHwgdmFsID09PSAnJykgcmV0dXJuICctJw0KICAgICAgcmV0dXJuIE51bWJlcih2YWwpID09PSAxID8gJ+eUtycgOiBOdW1iZXIodmFsKSA9PT0gMCA/ICflpbMnIDogU3RyaW5nKHZhbCkNCiAgICB9LA0KDQogICAgLyoqIOiZmuWunuexu+Wei++8mjEt5a6e5pWZIDAt6Z2e5a6e5pWZ77yI6aG555uu57qm5a6aIDEt5a6eIDAt6Jma77yJICovDQogICAgZm10WHNseCh2YWwpIHsNCiAgICAgIGlmICh2YWwgPT09IG51bGwgfHwgdmFsID09PSB1bmRlZmluZWQgfHwgdmFsID09PSAnJykgcmV0dXJuICctJw0KICAgICAgcmV0dXJuIE51bWJlcih2YWwpID09PSAxID8gJ+WunuaVmScgOiBOdW1iZXIodmFsKSA9PT0gMCA/ICfpnZ7lrp7mlZknIDogU3RyaW5nKHZhbCkNCiAgICB9LA0KDQogICAgLyoqIDAvMSDmoIflv5fkvY3moLzlvI/ljJYgKi8NCiAgICBmbXRGbGFnKHZhbCwgeWVzTGFiZWwsIG5vTGFiZWwpIHsNCiAgICAgIGlmICh2YWwgPT09IG51bGwgfHwgdmFsID09PSB1bmRlZmluZWQgfHwgdmFsID09PSAnJykgcmV0dXJuICctJw0KICAgICAgcmV0dXJuIE51bWJlcih2YWwpID09PSAxID8geWVzTGFiZWwgOiBOdW1iZXIodmFsKSA9PT0gMCA/IG5vTGFiZWwgOiBTdHJpbmcodmFsKQ0KICAgIH0sDQoNCiAgICAvKiog56e76Zmk56m65YC8ICovDQogICAgDQoNCiAgICBsb2FkRGljdHMoKSB7DQogICAgICBnZXREaWN0cygndGVhY2hlcl96eWpzendkaicpLnRoZW4ocmVzID0+IHsgdGhpcy56eWpzendkak9wdGlvbnMgPSByZXMuZGF0YSB8fCBbXSB9KS5jYXRjaCgoKSA9PiB7fSkNCiAgICAgIGdldERpY3RzKCd0ZWFjaGVyX2p5bGInKS50aGVuKHJlcyA9PiB7IHRoaXMuanlsYk9wdGlvbnMgPSByZXMuZGF0YSB8fCBbXSB9KS5jYXRjaCgoKSA9PiB7fSkNCiAgICAgIGdldERpY3RzKCd0ZWFjaGVyX3p6bGInKS50aGVuKHJlcyA9PiB7IHRoaXMuenpsYk9wdGlvbnMgPSByZXMuZGF0YSB8fCBbXSB9KS5jYXRjaCgoKSA9PiB7fSkNCiAgICAgIGdldERpY3RzKCd0ZWFjaGVyX2RzbGInKS50aGVuKHJlcyA9PiB7IHRoaXMuZHNsYk9wdGlvbnMgPSByZXMuZGF0YSB8fCBbXSB9KS5jYXRjaCgoKSA9PiB7fSkNCiAgICB9LA0KDQogICAgY2xlYW5QYXlsb2FkKG9iaikgew0KICAgICAgY29uc3QgcGF5bG9hZCA9IHt9DQogICAgICBPYmplY3Qua2V5cyhvYmopLmZvckVhY2goa2V5ID0+IHsNCiAgICAgICAgY29uc3QgdmFsdWUgPSBvYmpba2V5XQ0KICAgICAgICBpZiAodmFsdWUgIT09ICcnICYmIHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHsNCiAgICAgICAgICBwYXlsb2FkW2tleV0gPSB2YWx1ZQ0KICAgICAgICB9DQogICAgICB9KQ0KICAgICAgcmV0dXJuIHBheWxvYWQNCiAgICB9LA0KDQogICAgLyoqIOWIm+W7uuepuueZveaWsOWinuihqOWNlSAqLw0KICAgIGNyZWF0ZUVtcHR5QWRkRm9ybSgpIHsNCiAgICAgIHJldHVybiB7DQogICAgICAgIHRlYWNoZXI6IHsNCiAgICAgICAgICBqeWJoOiAnJywganl4bTogJycsIGp5c2RoOiAnJywgeGg6ICcnLCB6eWpzendkajogJycsIHp5anN6d2Rqc2o6ICcnLA0KICAgICAgICAgIHhzbHg6IDEsIGp5bGI6ICcnLCB6emxiOiAnJywgZHNsYjogJycsIHh5OiAnJywgc2Z6aDogJycsIHhiOiAxLA0KICAgICAgICAgIHd4ank6IDAsIHd4eXk6IDAsIHp6bGp5OiAwLCBld3l4a2JzOiAwLCB6YzogJycsIHNqaDogJycsIGtoOiAnJywgcHk6ICcnLA0KICAgICAgICAgIHpjc2o6ICcnLCBiejogJycNCiAgICAgICAgfSwNCiAgICAgICAgYXR0cmlidXRlczogew0KICAgICAgICAgIHhsOiAnJywgeHc6ICcnLCBqbDogMCwgamxqc3JxOiAnJywgenI6IDAsIHp3OiAnJywgendzajogJycsIGpzenc6ICcnLA0KICAgICAgICAgIGpzendzajogJycsIGpzZGo6ICcnLCBqc2Rqc2o6ICcnLCBqeHd6OiAnJywganh3enNqOiAnJywgY3NzajogJycsDQogICAgICAgICAgcndnenNqOiAnJywgcmR6amw6ICcnLCBmYmx3OiAnJw0KICAgICAgICB9DQogICAgICB9DQogICAgfSwNCg0KICAgIC8vID09PT09PT09PT09PT09PT09PT09IOWIl+ihqCA9PT09PT09PT09PT09PT09PT09PQ0KICAgIGJ1aWxkUXVlcnkoKSB7DQogICAgICBjb25zdCBwYXJhbXMgPSB7fQ0KICAgICAgO1snanl4bScsICdqeXNkaCcsICd6YycsICdqeWxiJ10uZm9yRWFjaChrZXkgPT4gew0KICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuc2VhcmNoRm9ybVtrZXldDQogICAgICAgIGlmICh2YWx1ZSAhPT0gJycgJiYgdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkgew0KICAgICAgICAgIHBhcmFtc1trZXldID0gU3RyaW5nKHZhbHVlKS50cmltKCkNCiAgICAgICAgfQ0KICAgICAgfSkNCiAgICAgIHJldHVybiBwYXJhbXMNCiAgICB9LA0KDQogICAgZmV0Y2hMaXN0KCkgew0KICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZQ0KICAgICAgY29uc3QgcGFyYW1zID0gew0KICAgICAgICBwYWdlTnVtOiB0aGlzLnBhZ2luYXRpb24ucGFnZU51bSwNCiAgICAgICAgcGFnZVNpemU6IHRoaXMucGFnaW5hdGlvbi5wYWdlU2l6ZSwNCiAgICAgICAgLi4udGhpcy5idWlsZFF1ZXJ5KCkNCiAgICAgIH0NCiAgICAgIGxpc3RUZWFjaGVyKHBhcmFtcykudGhlbihyZXNwb25zZSA9PiB7DQogICAgICAgIGNvbnN0IGRhdGEgPSByZXNwb25zZS5kYXRhIHx8IHt9DQogICAgICAgIHRoaXMudGFibGVEYXRhID0gZGF0YS5yZWNvcmRzIHx8IFtdDQogICAgICAgIHRoaXMucGFnaW5hdGlvbi50b3RhbCA9IGRhdGEudG90YWwgfHwgMA0KICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZQ0KICAgICAgfSkuY2F0Y2goKCkgPT4gew0KICAgICAgICB0aGlzLnRhYmxlRGF0YSA9IFtdDQogICAgICAgIHRoaXMucGFnaW5hdGlvbi50b3RhbCA9IDANCiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2UNCiAgICAgIH0pDQogICAgfSwNCg0KICAgIGhhbmRsZVNlYXJjaCgpIHsNCiAgICAgIHRoaXMucGFnaW5hdGlvbi5wYWdlTnVtID0gMQ0KICAgICAgdGhpcy5mZXRjaExpc3QoKQ0KICAgIH0sDQoNCiAgICBoYW5kbGVSZXNldCgpIHsNCiAgICAgIHRoaXMuc2VhcmNoRm9ybSA9IHsganl4bTogJycsIGp5c2RoOiAnJywgemM6ICcnLCBqeWxiOiAnJyB9DQogICAgICB0aGlzLnBhZ2luYXRpb24ucGFnZU51bSA9IDENCiAgICAgIHRoaXMuZmV0Y2hMaXN0KCkNCiAgICB9LA0KDQogICAgaGFuZGxlU2l6ZUNoYW5nZShzaXplKSB7DQogICAgICB0aGlzLnBhZ2luYXRpb24ucGFnZVNpemUgPSBzaXplDQogICAgICB0aGlzLnBhZ2luYXRpb24ucGFnZU51bSA9IDENCiAgICAgIHRoaXMuZmV0Y2hMaXN0KCkNCiAgICB9LA0KDQogICAgaGFuZGxlQ3VycmVudENoYW5nZShwYWdlKSB7DQogICAgICB0aGlzLnBhZ2luYXRpb24ucGFnZU51bSA9IHBhZ2UNCiAgICAgIHRoaXMuZmV0Y2hMaXN0KCkNCiAgICB9LA0KDQogICAgaGFuZGxlU2VsZWN0aW9uQ2hhbmdlKHJvd3MpIHsNCiAgICAgIHRoaXMuc2VsZWN0ZWRSb3dzID0gcm93cw0KICAgIH0sDQoNCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PSDml6DlkI7nq6/mjqXlj6PnmoTmk43kvZwgPT09PT09PT09PT09PT09PT09PT0NCiAgICBoYW5kbGVEZWxldGVTZWxlY3RlZCgpIHsNCiAgICAgIHRoaXMuJG1lc3NhZ2UuaW5mbygn5ZCO56uv5pqC5pyq5o+Q5L6b6K+l5o6l5Y+jJykNCiAgICB9LA0KDQogICAgaGFuZGxlSW1wb3J0KCkgew0KICAgICAgdGhpcy4kbWVzc2FnZS5pbmZvKCflkI7nq6/mmoLmnKrmj5Dkvpvor6XmjqXlj6MnKQ0KICAgIH0sDQoNCiAgICBoYW5kbGVEb3dubG9hZFRlbXBsYXRlKCkgew0KICAgICAgdGhpcy4kbWVzc2FnZS5pbmZvKCflkI7nq6/mmoLmnKrmj5Dkvpvor6XmjqXlj6MnKQ0KICAgIH0sDQoNCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PSDmlrDlop4gPT09PT09PT09PT09PT09PT09PT0NCiAgICBoYW5kbGVOZXcoKSB7DQogICAgICB0aGlzLmFkZEZvcm0gPSB0aGlzLmNyZWF0ZUVtcHR5QWRkRm9ybSgpDQogICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB7DQogICAgICAgIHRoaXMuJHJlZnMuYWRkRm9ybVJlZiAmJiB0aGlzLiRyZWZzLmFkZEZvcm1SZWYuY2xlYXJWYWxpZGF0ZSgpDQogICAgICB9KQ0KICAgICAgdGhpcy5hZGREaWFsb2dWaXNpYmxlID0gdHJ1ZQ0KICAgIH0sDQoNCiAgICBoYW5kbGVBZGRDb25maXJtKCkgew0KICAgICAgdGhpcy4kcmVmcy5hZGRGb3JtUmVmLnZhbGlkYXRlKHZhbGlkID0+IHsNCiAgICAgICAgaWYgKCF2YWxpZCkgcmV0dXJuDQogICAgICAgIGNvbnN0IGR0byA9IHsNCiAgICAgICAgICB0ZWFjaGVyOiB0aGlzLmJ1aWxkVGVhY2hlclBheWxvYWQodGhpcy5hZGRGb3JtLnRlYWNoZXIpLA0KICAgICAgICAgIGF0dHJpYnV0ZXM6IHRoaXMuYnVpbGRBdHRyaWJ1dGVQYXlsb2FkKHRoaXMuYWRkRm9ybS5hdHRyaWJ1dGVzKQ0KICAgICAgICB9DQogICAgICAgIHRoaXMuYWRkU2F2aW5nID0gdHJ1ZQ0KICAgICAgICBhZGRUZWFjaGVyKGR0bykudGhlbigoKSA9PiB7DQogICAgICAgICAgdGhpcy4kbWVzc2FnZS5zdWNjZXNzKCfmlrDlop7miJDlip8nKQ0KICAgICAgICAgIHRoaXMuYWRkRGlhbG9nVmlzaWJsZSA9IGZhbHNlDQogICAgICAgICAgdGhpcy5mZXRjaExpc3QoKQ0KICAgICAgICB9KS5jYXRjaCgoKSA9PiB7DQogICAgICAgIH0pLmZpbmFsbHkoKCkgPT4gew0KICAgICAgICAgIHRoaXMuYWRkU2F2aW5nID0gZmFsc2UNCiAgICAgICAgfSkNCiAgICAgIH0pDQogICAgfSwNCg0KICAgIC8qKiDnu4Too4UgSllCIOivt+axguS9k++8iGx6enQg5LiN5Lyg77yM5ZCO56uv6Ieq5Yqo572uIDDvvIkgKi8NCiAgICBidWlsZFRlYWNoZXJQYXlsb2FkKHQpIHsNCiAgICAgIGNvbnN0IHBheWxvYWQgPSB0aGlzLmNsZWFuUGF5bG9hZCh7DQogICAgICAgIGp5Ymg6IHQuanliaCwNCiAgICAgICAganl4bTogdC5qeXhtLA0KICAgICAgICBqeXNkaDogdC5qeXNkaCwNCiAgICAgICAgYno6IHQuYnosDQogICAgICAgIHpjOiB0LnpjLA0KICAgICAgICB4aDogdC54aCwNCiAgICAgICAgenlqc3p3ZGo6IHQuenlqc3p3ZGosDQogICAgICAgIHhzbHg6IHQueHNseCwNCiAgICAgICAganlsYjogdC5qeWxiLA0KICAgICAgICBraDogdC5raCwNCiAgICAgICAgcHk6IHQucHksDQogICAgICAgIHp6bGI6IHQuenpsYiwNCiAgICAgICAgZXd5eGticzogdC5ld3l4a2JzLA0KICAgICAgICBkc2xiOiB0LmRzbGIsDQogICAgICAgIHh5OiB0Lnh5LA0KICAgICAgICBzZnpoOiB0LnNmemgsDQogICAgICAgIHhiOiB0LnhiLA0KICAgICAgICB3eGp5OiB0Lnd4anksDQogICAgICAgIHd4eXk6IHQud3h5eSwNCiAgICAgICAgenpsank6IHQuenpsanksDQogICAgICAgIHNqaDogdC5zamgNCiAgICAgIH0pDQogICAgICAvLyDmlbTmlbAv5qCH5b+X5a2X5q616L2sIE51bWJlcg0KICAgICAgO1sneGInLCAneHNseCcsICdld3l4a2JzJywgJ3d4anknLCAnd3h5eScsICd6emxqeSddLmZvckVhY2goa2V5ID0+IHsNCiAgICAgICAgaWYgKHBheWxvYWRba2V5XSAhPT0gdW5kZWZpbmVkKSBwYXlsb2FkW2tleV0gPSBOdW1iZXIocGF5bG9hZFtrZXldKQ0KICAgICAgfSkNCiAgICAgIC8vIOaXtumXtOWtl+auteW3sueUsSBkYXRlLXBpY2tlciDovpPlh7ogSVNPIOagvOW8jw0KICAgICAgO1snenlqc3p3ZGpzaicsICd6Y3NqJ10uZm9yRWFjaChrZXkgPT4gew0KICAgICAgICBpZiAodFtrZXldKSBwYXlsb2FkW2tleV0gPSB0W2tleV0NCiAgICAgIH0pDQogICAgICByZXR1cm4gcGF5bG9hZA0KICAgIH0sDQoNCiAgICAvKiog57uE6KOFIEpZU1gg6K+35rGC5L2T77yI5LuF6Z2e56m65a2X5q6177yJICovDQogICAgYnVpbGRBdHRyaWJ1dGVQYXlsb2FkKGEpIHsNCiAgICAgIGNvbnN0IHBheWxvYWQgPSB0aGlzLmNsZWFuUGF5bG9hZCh7DQogICAgICAgIHhsOiBhLnhsLA0KICAgICAgICB4dzogYS54dywNCiAgICAgICAgamw6IGEuamwsDQogICAgICAgIGpsanNycTogYS5qbGpzcnEsDQogICAgICAgIHpyOiBhLnpyLA0KICAgICAgICB6dzogYS56dywNCiAgICAgICAgendzajogYS56d3NqLA0KICAgICAgICBqc3p3OiBhLmpzencsDQogICAgICAgIGpzendzajogYS5qc3p3c2osDQogICAgICAgIGpzZGo6IGEuanNkaiwNCiAgICAgICAganNkanNqOiBhLmpzZGpzaiwNCiAgICAgICAganh3ejogYS5qeHd6LA0KICAgICAgICBqeHd6c2o6IGEuanh3enNqLA0KICAgICAgICBjc3NqOiBhLmNzc2osDQogICAgICAgIHJ3Z3pzajogYS5yd2d6c2osDQogICAgICAgIHJkempsOiBhLnJkempsLA0KICAgICAgICBmYmx3OiBhLmZibHcNCiAgICAgIH0pDQogICAgICBpZiAocGF5bG9hZC56ciAhPT0gdW5kZWZpbmVkKSBwYXlsb2FkLnpyID0gTnVtYmVyKHBheWxvYWQuenIpDQogICAgICBpZiAocGF5bG9hZC5qbCAhPT0gdW5kZWZpbmVkKSBwYXlsb2FkLmpsID0gTnVtYmVyKHBheWxvYWQuamwpDQogICAgICByZXR1cm4gcGF5bG9hZA0KICAgIH0sDQoNCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PSDnvJbovpEgPT09PT09PT09PT09PT09PT09PT0NCiAgICBoYW5kbGVFZGl0KHJvdykgew0KICAgICAgdGhpcy5lZGl0RGlhbG9nVmlzaWJsZSA9IHRydWUNCiAgICAgIHRoaXMuZWRpdExvYWRpbmcgPSB0cnVlDQogICAgICBnZXRUZWFjaGVyKHJvdy5qeWJoKS50aGVuKHJlc3BvbnNlID0+IHsNCiAgICAgICAgY29uc3QgZGF0YSA9IHJlc3BvbnNlLmRhdGEgfHwge30NCiAgICAgICAgY29uc3QgZm9ybSA9IHRoaXMuY3JlYXRlRW1wdHlBZGRGb3JtKCkudGVhY2hlcg0KICAgICAgICBPYmplY3Qua2V5cyhmb3JtKS5mb3JFYWNoKGtleSA9PiB7DQogICAgICAgICAgaWYgKGRhdGFba2V5XSAhPT0gdW5kZWZpbmVkICYmIGRhdGFba2V5XSAhPT0gbnVsbCkgZm9ybVtrZXldID0gZGF0YVtrZXldDQogICAgICAgIH0pDQogICAgICAgIHRoaXMuZWRpdEZvcm0gPSBmb3JtDQogICAgICAgIHRoaXMuZWRpdExvYWRpbmcgPSBmYWxzZQ0KICAgICAgfSkuY2F0Y2goKCkgPT4gew0KICAgICAgICB0aGlzLmVkaXREaWFsb2dWaXNpYmxlID0gZmFsc2UNCiAgICAgICAgdGhpcy5lZGl0TG9hZGluZyA9IGZhbHNlDQogICAgICB9KQ0KICAgIH0sDQoNCiAgICBoYW5kbGVFZGl0Q29uZmlybSgpIHsNCiAgICAgIHRoaXMuJHJlZnMuZWRpdEZvcm1SZWYudmFsaWRhdGUodmFsaWQgPT4gew0KICAgICAgICBpZiAoIXZhbGlkKSByZXR1cm4NCiAgICAgICAgaWYgKCF0aGlzLmVkaXRGb3JtLmp5YmgpIHsNCiAgICAgICAgICB0aGlzLiRtZXNzYWdlLndhcm5pbmcoJ+e8uuWwkeaVmeWRmOe8luWPt++8jOaXoOazleS/neWtmCcpDQogICAgICAgICAgcmV0dXJuDQogICAgICAgIH0NCiAgICAgICAgY29uc3QgcGF5bG9hZCA9IHRoaXMuYnVpbGRUZWFjaGVyUGF5bG9hZCh0aGlzLmVkaXRGb3JtKQ0KICAgICAgICBwYXlsb2FkLmp5YmggPSB0aGlzLmVkaXRGb3JtLmp5YmgNCiAgICAgICAgdGhpcy5lZGl0U2F2aW5nID0gdHJ1ZQ0KICAgICAgICB1cGRhdGVUZWFjaGVyKHBheWxvYWQpLnRoZW4oKCkgPT4gew0KICAgICAgICAgIHRoaXMuJG1lc3NhZ2Uuc3VjY2Vzcygn5L+d5a2Y5oiQ5YqfJykNCiAgICAgICAgICB0aGlzLmVkaXREaWFsb2dWaXNpYmxlID0gZmFsc2UNCiAgICAgICAgICB0aGlzLmZldGNoTGlzdCgpDQogICAgICAgIH0pLmNhdGNoKCgpID0+IHsNCiAgICAgICAgfSkuZmluYWxseSgoKSA9PiB7DQogICAgICAgICAgdGhpcy5lZGl0U2F2aW5nID0gZmFsc2UNCiAgICAgICAgfSkNCiAgICAgIH0pDQogICAgfSwNCg0KICAgIC8vID09PT09PT09PT09PT09PT09PT09IOemu+iBjO+8iOmAu+i+keWIoOmZpO+8iSA9PT09PT09PT09PT09PT09PT09PQ0KICAgIGhhbmRsZURpc2FibGUocm93KSB7DQogICAgICBpZiAoIXJvdy5qeWJoKSB7DQogICAgICAgIHRoaXMuJG1lc3NhZ2Uud2FybmluZygn5b2T5YmN6KGM57y65bCR5pWZ5ZGY57yW5Y+3JykNCiAgICAgICAgcmV0dXJuDQogICAgICB9DQogICAgICB0aGlzLiRjb25maXJtKGDnoa7lrpropoHlip7nkIbmlZnlkZjjgIwke3Jvdy5qeXhtIHx8IHJvdy5qeWJofeOAjeemu+iBjOWQl++8n2AsICfns7vnu5/mj5DnpLonLCB7DQogICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiAn56Gu5a6aJywNCiAgICAgICAgY2FuY2VsQnV0dG9uVGV4dDogJ+WPlua2iCcsDQogICAgICAgIHR5cGU6ICd3YXJuaW5nJw0KICAgICAgfSkudGhlbigoKSA9PiB7DQogICAgICAgIGRpc2FibGVUZWFjaGVyKHJvdy5qeWJoKS50aGVuKCgpID0+IHsNCiAgICAgICAgICB0aGlzLiRtZXNzYWdlLnN1Y2Nlc3MoJ+W3suWKnueQhuemu+iBjCcpDQogICAgICAgICAgdGhpcy5mZXRjaExpc3QoKQ0KICAgICAgICB9KS5jYXRjaCgoKSA9PiB7fSkNCiAgICAgIH0pLmNhdGNoKCgpID0+IHt9KQ0KICAgIH0sDQoNCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PSDmlZnlkZjlsZ7mgKcgPT09PT09PT09PT09PT09PT09PT0NCiAgICBoYW5kbGVWaWV3QXR0cmlidXRlKHJvdykgew0KICAgICAgdGhpcy5hdHRyaWJ1dGVNb2RlID0gJ3ZpZXcnDQogICAgICB0aGlzLmF0dHJpYnV0ZUp5YmggPSByb3cuanliaA0KICAgICAgdGhpcy5hdHRyaWJ1dGVEYXRhID0ge30NCiAgICAgIHRoaXMuYXR0cmlidXRlVmlzaWJsZSA9IHRydWUNCiAgICAgIHRoaXMuYXR0cmlidXRlTG9hZGluZyA9IHRydWUNCiAgICAgIGdldFRlYWNoZXJBdHRyaWJ1dGUocm93Lmp5YmgpLnRoZW4ocmVzcG9uc2UgPT4gew0KICAgICAgICB0aGlzLmF0dHJpYnV0ZURhdGEgPSByZXNwb25zZS5kYXRhIHx8IHt9DQogICAgICAgIHRoaXMuYXR0cmlidXRlTG9hZGluZyA9IGZhbHNlDQogICAgICB9KS5jYXRjaCgoKSA9PiB7DQogICAgICAgIHRoaXMuYXR0cmlidXRlVmlzaWJsZSA9IGZhbHNlDQogICAgICAgIHRoaXMuYXR0cmlidXRlTG9hZGluZyA9IGZhbHNlDQogICAgICB9KQ0KICAgIH0sDQoNCiAgICBoYW5kbGVTdGFydEVkaXRBdHRyaWJ1dGUoKSB7DQogICAgICB0aGlzLmF0dHJpYnV0ZUZvcm0gPSB0aGlzLmNyZWF0ZUVtcHR5QWRkRm9ybSgpLmF0dHJpYnV0ZXMNCiAgICAgIE9iamVjdC5rZXlzKHRoaXMuYXR0cmlidXRlRm9ybSkuZm9yRWFjaChrZXkgPT4gew0KICAgICAgICBpZiAodGhpcy5hdHRyaWJ1dGVEYXRhW2tleV0gIT09IHVuZGVmaW5lZCAmJiB0aGlzLmF0dHJpYnV0ZURhdGFba2V5XSAhPT0gbnVsbCkgew0KICAgICAgICAgIHRoaXMuYXR0cmlidXRlRm9ybVtrZXldID0gdGhpcy5hdHRyaWJ1dGVEYXRhW2tleV0NCiAgICAgICAgfQ0KICAgICAgfSkNCiAgICAgIHRoaXMuYXR0cmlidXRlRm9ybS5qeWJoID0gdGhpcy5hdHRyaWJ1dGVKeWJoDQogICAgICB0aGlzLmF0dHJpYnV0ZU1vZGUgPSAnZWRpdCcNCiAgICB9LA0KDQogICAgaGFuZGxlQ2FuY2VsRWRpdEF0dHJpYnV0ZSgpIHsNCiAgICAgIHRoaXMuYXR0cmlidXRlTW9kZSA9ICd2aWV3Jw0KICAgIH0sDQoNCiAgICBoYW5kbGVTYXZlQXR0cmlidXRlKCkgew0KICAgICAgY29uc3QgcGF5bG9hZCA9IHRoaXMuYnVpbGRBdHRyaWJ1dGVQYXlsb2FkKHRoaXMuYXR0cmlidXRlRm9ybSkNCiAgICAgIHBheWxvYWQuanliaCA9IHRoaXMuYXR0cmlidXRlSnliaA0KICAgICAgdGhpcy5hdHRyaWJ1dGVTYXZpbmcgPSB0cnVlDQogICAgICB1cGRhdGVUZWFjaGVyQXR0cmlidXRlKHBheWxvYWQpLnRoZW4oKCkgPT4gew0KICAgICAgICB0aGlzLiRtZXNzYWdlLnN1Y2Nlc3MoJ+S/neWtmOaIkOWKnycpDQogICAgICAgIHRoaXMuYXR0cmlidXRlTW9kZSA9ICd2aWV3Jw0KICAgICAgICB0aGlzLmhhbmRsZVZpZXdBdHRyaWJ1dGUoeyBqeWJoOiB0aGlzLmF0dHJpYnV0ZUp5YmggfSkNCiAgICAgIH0pLmNhdGNoKCgpID0+IHsNCiAgICAgIH0pLmZpbmFsbHkoKCkgPT4gew0KICAgICAgICB0aGlzLmF0dHJpYnV0ZVNhdmluZyA9IGZhbHNlDQogICAgICB9KQ0KICAgIH0NCiAgfQ0KfQ0K"},{"version":3,"sources":["index.vue"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6lBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;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;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;;AAGA;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;;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;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;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;;AAEA;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;AACA","file":"index.vue","sourceRoot":"src/views/teachOffice/teacher","sourcesContent":["<template>\r\n <div class=\"app-container teacher-page\">\r\n <!-- 查询条件 -->\r\n <el-card shadow=\"never\" class=\"search-card\">\r\n <el-form :model=\"searchForm\" label-width=\"90px\" class=\"search-form\" @submit.native.prevent>\r\n <el-row :gutter=\"0\">\r\n <el-col :span=\"6\">\r\n <el-form-item label=\"教员姓名\">\r\n <el-input v-model=\"searchForm.jyxm\" placeholder=\"请输入\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"6\">\r\n <el-form-item label=\"教研室代号\">\r\n <el-input v-model=\"searchForm.jysdh\" placeholder=\"请输入\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"6\">\r\n <el-form-item label=\"职称\">\r\n <el-input v-model=\"searchForm.zc\" placeholder=\"请输入\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"6\">\r\n <el-form-item label=\"教员类别\">\r\n <el-input v-model=\"searchForm.jylb\" placeholder=\"请输入\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n </el-form>\r\n <div 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 </div>\r\n </el-card>\r\n\r\n <!-- 教员列表 -->\r\n <div class=\"list-title\">教员列表:</div>\r\n <div class=\"list-toolbar\">\r\n <div class=\"left-group\">\r\n <el-button type=\"primary\" icon=\"el-icon-plus\" @click=\"handleNew\">新建</el-button>\r\n <el-button type=\"danger\" plain icon=\"el-icon-delete\" @click=\"handleDeleteSelected\">删除所选</el-button>\r\n <el-button icon=\"el-icon-upload\" @click=\"handleImport\">导入教员信息</el-button>\r\n </div>\r\n <div class=\"right-group\">\r\n <el-button icon=\"el-icon-download\" @click=\"handleDownloadTemplate\">【教员数据文件模板】下载</el-button>\r\n </div>\r\n </div>\r\n\r\n <el-card shadow=\"never\" class=\"table-card\">\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=\"50\" align=\"center\" />\r\n <el-table-column type=\"index\" label=\"序号\" width=\"60\" align=\"center\" />\r\n <el-table-column prop=\"jybh\" label=\"教员工号\" width=\"110\" align=\"center\" />\r\n <el-table-column prop=\"jyxm\" label=\"教员姓名\" width=\"90\" align=\"center\" />\r\n <el-table-column label=\"性别\" width=\"60\" align=\"center\">\r\n <template slot-scope=\"{ row }\">{{ fmtGender(row.xb) }}</template>\r\n </el-table-column>\r\n <el-table-column prop=\"jysmc\" label=\"教研室名称\" width=\"200\" show-overflow-tooltip align=\"center\"/>\r\n <el-table-column prop=\"zc\" label=\"职称\" width=\"120\" align=\"center\" />\r\n <el-table-column prop=\"xl\" label=\"学历\" width=\"120\" align=\"center\" />\r\n <el-table-column prop=\"xw\" label=\"学位\" width=\"120\" align=\"center\" />\r\n <el-table-column label=\"出生时间\" width=\"110\" align=\"center\">\r\n <template slot-scope=\"{ row }\">{{ fmtDateTime(row.cssj) || '-' }}</template>\r\n </el-table-column>\r\n <el-table-column label=\"入伍工作时间\" width=\"120\" align=\"center\">\r\n <template slot-scope=\"{ row }\">{{ fmtDateTime(row.rwgzsj) || '-' }}</template>\r\n </el-table-column>\r\n <el-table-column prop=\"sjh\" label=\"联系方式\" width=\"110\" align=\"center\" />\r\n <el-table-column label=\"虚实类型\" width=\"80\" align=\"center\">\r\n <template slot-scope=\"{ row }\">{{ fmtXslx(row.xslx) }}</template>\r\n </el-table-column>\r\n <el-table-column label=\"操作\" align=\"center\" fixed=\"right\">\r\n <template slot-scope=\"{ row }\">\r\n <el-button type=\"text\" size=\"small\" icon=\"el-icon-view\" @click=\"handleViewAttribute(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=\"danger-text\" @click=\"handleDisable(row)\">离职</el-button>\r\n </template>\r\n </el-table-column>\r\n </el-table>\r\n <el-empty v-if=\"!loading && tableData.length === 0\" description=\"暂无教员数据\" :image-size=\"60\" />\r\n <div class=\"pagination-wrap\">\r\n <el-pagination\r\n :current-page=\"pagination.pageNum\"\r\n :page-size=\"pagination.pageSize\"\r\n :total=\"pagination.total\"\r\n :page-sizes=\"[10, 20, 50, 100]\"\r\n layout=\"total, sizes, prev, pager, next, jumper\"\r\n background\r\n @size-change=\"handleSizeChange\"\r\n @current-change=\"handleCurrentChange\"\r\n />\r\n </div>\r\n </el-card>\r\n\r\n <!-- 新建教员对话框 -->\r\n <el-dialog\r\n :visible=\"addDialogVisible\"\r\n title=\"新建教员\"\r\n width=\"820px\"\r\n :close-on-click-modal=\"false\"\r\n @update:visible=\"val => addDialogVisible = val\"\r\n >\r\n <el-form ref=\"addFormRef\" :model=\"addForm\" :rules=\"addRules\" label-width=\"160px\" class=\"add-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=\"teacher.jyxm\"><el-input v-model=\"addForm.teacher.jyxm\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"性别\" prop=\"teacher.xb\">\r\n <el-select v-model=\"addForm.teacher.xb\" style=\"width:100%\">\r\n <el-option :value=\"1\" label=\"男\" /><el-option :value=\"0\" label=\"女\" />\r\n </el-select>\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"序号\" prop=\"teacher.xh\"><el-input v-model=\"addForm.teacher.xh\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"身份证号\" prop=\"teacher.sfzh\"><el-input v-model=\"addForm.teacher.sfzh\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"专业技术职务等级\" prop=\"teacher.zyjszwdj\">\n <el-select v-model=\"addForm.teacher.zyjszwdj\" placeholder=\"请选择\" clearable style=\"width:100%\">\n <el-option v-for=\"item in zyjszwdjOptions\" :key=\"item.dictValue\" :label=\"item.dictLabel\" :value=\"item.dictValue\" />\n </el-select>\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"虚实类型\" prop=\"teacher.xslx\">\r\n <el-radio-group v-model=\"addForm.teacher.xslx\">\r\n <el-radio :label=\"1\">是</el-radio>\r\n <el-radio :label=\"0\">否</el-radio>\r\n </el-radio-group>\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"教员类别\" prop=\"teacher.jylb\">\n <el-select v-model=\"addForm.teacher.jylb\" placeholder=\"请选择\" clearable style=\"width:100%\">\n <el-option v-for=\"item in jylbOptions\" :key=\"item.dictValue\" :label=\"item.dictLabel\" :value=\"item.dictValue\" />\n </el-select>\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"在职类别\" prop=\"teacher.zzlb\">\n <el-select v-model=\"addForm.teacher.zzlb\" placeholder=\"请选择\" clearable style=\"width:100%\">\n <el-option v-for=\"item in zzlbOptions\" :key=\"item.dictValue\" :label=\"item.dictLabel\" :value=\"item.dictValue\" />\n </el-select>\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"导师类别\" prop=\"teacher.dslb\">\n <el-select v-model=\"addForm.teacher.dslb\" placeholder=\"请选择\" clearable style=\"width:100%\">\n <el-option v-for=\"item in dslbOptions\" :key=\"item.dictValue\" :label=\"item.dictLabel\" :value=\"item.dictValue\" />\n </el-select>\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"学缘\" prop=\"teacher.xy\"><el-input v-model=\"addForm.teacher.xy\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"额外允许开班数\" prop=\"teacher.ewyxkbs\">\r\n <el-input-number v-model=\"addForm.teacher.ewyxkbs\" :min=\"0\" 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=\"teacher.wxjy\">\r\n <el-radio-group v-model=\"addForm.teacher.wxjy\">\r\n <el-radio :label=\"1\">是</el-radio>\r\n <el-radio :label=\"0\">否</el-radio>\r\n </el-radio-group>\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"外训译员\" prop=\"teacher.wxyy\">\r\n <el-radio-group v-model=\"addForm.teacher.wxyy\">\r\n <el-radio :label=\"1\">是</el-radio>\r\n <el-radio :label=\"0\">否</el-radio>\r\n </el-radio-group>\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"政治类教员\" prop=\"teacher.zzljy\">\r\n <el-radio-group v-model=\"addForm.teacher.zzljy\">\r\n <el-radio :label=\"1\">是</el-radio>\r\n <el-radio :label=\"0\">否</el-radio>\r\n </el-radio-group>\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"职称\"><el-input v-model=\"addForm.teacher.zc\" placeholder=\"选填\" /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"手机号\"><el-input v-model=\"addForm.teacher.sjh\" placeholder=\"选填\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"卡号\"><el-input v-model=\"addForm.teacher.kh\" placeholder=\"选填\" /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"拼音\"><el-input v-model=\"addForm.teacher.py\" placeholder=\"选填\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"专业技术职务等级时间\">\r\n <el-date-picker v-model=\"addForm.teacher.zyjszwdjsj\" type=\"datetime\" value-format=\"yyyy-MM-ddTHH:mm:ss\" 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=\"职称时间\">\r\n <el-date-picker v-model=\"addForm.teacher.zcsj\" type=\"datetime\" value-format=\"yyyy-MM-ddTHH:mm:ss\" placeholder=\"选填\" style=\"width:100%\" />\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"24\">\r\n <el-form-item label=\"备注\"><el-input v-model=\"addForm.teacher.bz\" type=\"textarea\" :rows=\"2\" placeholder=\"选填\" /></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=\"学历\"><el-input v-model=\"addForm.attributes.xl\" placeholder=\"选填\" /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"学位\"><el-input v-model=\"addForm.attributes.xw\" placeholder=\"选填\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"教龄\"><el-input-number v-model=\"addForm.attributes.jl\" :min=\"0\" style=\"width:100%\" /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"教龄计算日期\">\r\n <el-date-picker v-model=\"addForm.attributes.jljsrq\" type=\"datetime\" value-format=\"yyyy-MM-ddTHH:mm:ss\" placeholder=\"选填\" style=\"width:100%\" />\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"主任\">\r\n <el-radio-group v-model=\"addForm.attributes.zr\">\r\n <el-radio :label=\"1\">是</el-radio>\r\n <el-radio :label=\"0\">否</el-radio>\r\n </el-radio-group>\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"职务\"><el-input v-model=\"addForm.attributes.zw\" placeholder=\"选填\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"职务时间\">\r\n <el-date-picker v-model=\"addForm.attributes.zwsj\" type=\"datetime\" value-format=\"yyyy-MM-ddTHH:mm:ss\" 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=\"技术职务\"><el-input v-model=\"addForm.attributes.jszw\" placeholder=\"选填\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"技术职务时间\">\r\n <el-date-picker v-model=\"addForm.attributes.jszwsj\" type=\"datetime\" value-format=\"yyyy-MM-ddTHH:mm:ss\" 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=\"技术等级\"><el-input v-model=\"addForm.attributes.jsdj\" placeholder=\"选填\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"技术等级时间\">\r\n <el-date-picker v-model=\"addForm.attributes.jsdjsj\" type=\"datetime\" value-format=\"yyyy-MM-ddTHH:mm:ss\" 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=\"军衔文职\"><el-input v-model=\"addForm.attributes.jxwz\" placeholder=\"选填\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"军衔文职时间\">\r\n <el-date-picker v-model=\"addForm.attributes.jxwzsj\" type=\"datetime\" value-format=\"yyyy-MM-ddTHH:mm:ss\" 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=\"出生时间\">\r\n <el-date-picker v-model=\"addForm.attributes.cssj\" type=\"datetime\" value-format=\"yyyy-MM-ddTHH:mm:ss\" placeholder=\"选填\" style=\"width:100%\" />\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"入伍工作时间\">\r\n <el-date-picker v-model=\"addForm.attributes.rwgzsj\" type=\"datetime\" value-format=\"yyyy-MM-ddTHH:mm:ss\" placeholder=\"选填\" style=\"width:100%\" />\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"24\">\r\n <el-form-item label=\"任代职经历\"><el-input v-model=\"addForm.attributes.rdzjl\" placeholder=\"选填\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"24\">\r\n <el-form-item label=\"发表论文\"><el-input v-model=\"addForm.attributes.fblw\" placeholder=\"选填\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n </el-form>\r\n <div slot=\"footer\">\r\n <el-button @click=\"addDialogVisible = false\">取消</el-button>\r\n <el-button type=\"primary\" :loading=\"addSaving\" @click=\"handleAddConfirm\">确定</el-button>\r\n </div>\r\n </el-dialog>\r\n\r\n <!-- 编辑教员基本信息对话框 -->\r\n <el-dialog\r\n :visible=\"editDialogVisible\"\r\n title=\"编辑教员信息\"\r\n width=\"780px\"\r\n :close-on-click-modal=\"false\"\r\n @update:visible=\"val => editDialogVisible = val\"\r\n >\r\n <div v-loading=\"editLoading\">\r\n <el-form ref=\"editFormRef\" :model=\"editForm\" :rules=\"editRules\" label-width=\"140px\" class=\"add-form\">\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"教员编号\"><el-input v-model=\"editForm.jybh\" disabled /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"教员姓名\" prop=\"jyxm\"><el-input v-model=\"editForm.jyxm\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"教研室代号\" prop=\"jysdh\"><el-input v-model=\"editForm.jysdh\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"序号\"><el-input v-model=\"editForm.xh\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"性别\" prop=\"xb\">\r\n <el-select v-model=\"editForm.xb\" style=\"width:100%\">\r\n <el-option :value=\"1\" label=\"男\" /><el-option :value=\"0\" label=\"女\" />\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=\"sfzh\"><el-input v-model=\"editForm.sfzh\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"专业技术职务等级\" prop=\"zyjszwdj\"><el-input v-model=\"editForm.zyjszwdj\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"虚实类型\" prop=\"xslx\">\r\n <el-radio-group v-model=\"editForm.xslx\">\r\n <el-radio :label=\"1\">实教</el-radio>\r\n <el-radio :label=\"0\">非实教</el-radio>\r\n </el-radio-group>\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"教员类别\" prop=\"jylb\"><el-input v-model=\"editForm.jylb\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"在职类别\" prop=\"zzlb\"><el-input v-model=\"editForm.zzlb\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"导师类别\" prop=\"dslb\"><el-input v-model=\"editForm.dslb\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"学缘\" prop=\"xy\"><el-input v-model=\"editForm.xy\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"额外允许开班数\" prop=\"ewyxkbs\">\r\n <el-input-number v-model=\"editForm.ewyxkbs\" :min=\"0\" 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=\"wxjy\">\r\n <el-radio-group v-model=\"editForm.wxjy\">\r\n <el-radio :label=\"1\">是</el-radio>\r\n <el-radio :label=\"0\">否</el-radio>\r\n </el-radio-group>\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"外训译员\" prop=\"wxyy\">\r\n <el-radio-group v-model=\"editForm.wxyy\">\r\n <el-radio :label=\"1\">是</el-radio>\r\n <el-radio :label=\"0\">否</el-radio>\r\n </el-radio-group>\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"政治类教员\" prop=\"zzljy\">\r\n <el-radio-group v-model=\"editForm.zzljy\">\r\n <el-radio :label=\"1\">是</el-radio>\r\n <el-radio :label=\"0\">否</el-radio>\r\n </el-radio-group>\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"职称\"><el-input v-model=\"editForm.zc\" placeholder=\"选填\" /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"手机号\"><el-input v-model=\"editForm.sjh\" placeholder=\"选填\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"卡号\"><el-input v-model=\"editForm.kh\" placeholder=\"选填\" /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"拼音\"><el-input v-model=\"editForm.py\" placeholder=\"选填\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"24\">\r\n <el-form-item label=\"备注\"><el-input v-model=\"editForm.bz\" type=\"textarea\" :rows=\"2\" placeholder=\"选填\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n </el-form>\r\n </div>\r\n <div slot=\"footer\">\r\n <el-button @click=\"editDialogVisible = false\">取消</el-button>\r\n <el-button type=\"primary\" :loading=\"editSaving\" @click=\"handleEditConfirm\">保存</el-button>\r\n </div>\r\n </el-dialog>\r\n\r\n <!-- 教员属性详情/编辑对话框 -->\r\n <el-dialog\r\n :visible=\"attributeVisible\"\r\n :title=\"attributeMode === 'view' ? '教员属性' : '编辑教员属性'\"\r\n width=\"720px\"\r\n :close-on-click-modal=\"false\"\r\n @update:visible=\"val => attributeVisible = val\"\r\n >\r\n <div v-loading=\"attributeLoading || attributeSaving\">\r\n <template v-if=\"attributeMode === 'view'\">\r\n <el-descriptions :column=\"2\" border size=\"medium\">\r\n <el-descriptions-item label=\"教员编号\">{{ attributeData.jybh || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"主任\">{{ fmtFlag(attributeData.zr, '是', '否') }}</el-descriptions-item>\r\n <el-descriptions-item label=\"职务\">{{ attributeData.zw || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"职务时间\">{{ fmtDateTime(attributeData.zwsj) || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"技术职务\">{{ attributeData.jszw || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"技术职务时间\">{{ fmtDateTime(attributeData.jszwsj) || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"技术等级\">{{ attributeData.jsdj || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"技术等级时间\">{{ fmtDateTime(attributeData.jsdjsj) || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"军衔文职\">{{ attributeData.jxwz || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"军衔文职时间\">{{ fmtDateTime(attributeData.jxwzsj) || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"出生时间\">{{ fmtDateTime(attributeData.cssj) || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"学历\">{{ attributeData.xl || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"学位\">{{ attributeData.xw || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"入伍工作时间\">{{ fmtDateTime(attributeData.rwgzsj) || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"任代职经历\">{{ attributeData.rdzjl || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"发表论文\">{{ attributeData.fblw || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"教龄\">{{ fmtVal(attributeData.jl) }}</el-descriptions-item>\r\n <el-descriptions-item label=\"教龄计算日期\">{{ fmtDateTime(attributeData.jljsrq) || '-' }}</el-descriptions-item>\r\n </el-descriptions>\r\n <div slot=\"footer\" class=\"dialog-footer\">\r\n <el-button @click=\"attributeVisible = false\">关闭</el-button>\r\n <el-button type=\"primary\" @click=\"handleStartEditAttribute\">编辑</el-button>\r\n </div>\r\n </template>\r\n <template v-else>\r\n <el-form ref=\"attributeFormRef\" :model=\"attributeForm\" label-width=\"140px\" class=\"add-form\">\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"教员编号\"><el-input v-model=\"attributeForm.jybh\" disabled /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"主任\">\r\n <el-radio-group v-model=\"attributeForm.zr\">\r\n <el-radio :label=\"1\">是</el-radio>\r\n <el-radio :label=\"0\">否</el-radio>\r\n </el-radio-group>\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"职务\"><el-input v-model=\"attributeForm.zw\" placeholder=\"选填\" /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"职务时间\">\r\n <el-date-picker v-model=\"attributeForm.zwsj\" type=\"datetime\" value-format=\"yyyy-MM-ddTHH:mm:ss\" placeholder=\"选填\" style=\"width:100%\" />\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"技术职务\"><el-input v-model=\"attributeForm.jszw\" placeholder=\"选填\" /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"技术职务时间\">\r\n <el-date-picker v-model=\"attributeForm.jszwsj\" type=\"datetime\" value-format=\"yyyy-MM-ddTHH:mm:ss\" placeholder=\"选填\" style=\"width:100%\" />\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"技术等级\"><el-input v-model=\"attributeForm.jsdj\" placeholder=\"选填\" /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"技术等级时间\">\r\n <el-date-picker v-model=\"attributeForm.jsdjsj\" type=\"datetime\" value-format=\"yyyy-MM-ddTHH:mm:ss\" placeholder=\"选填\" style=\"width:100%\" />\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"军衔文职\"><el-input v-model=\"attributeForm.jxwz\" placeholder=\"选填\" /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"军衔文职时间\">\r\n <el-date-picker v-model=\"attributeForm.jxwzsj\" type=\"datetime\" value-format=\"yyyy-MM-ddTHH:mm:ss\" placeholder=\"选填\" style=\"width:100%\" />\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"出生时间\">\r\n <el-date-picker v-model=\"attributeForm.cssj\" type=\"datetime\" value-format=\"yyyy-MM-ddTHH:mm:ss\" 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=\"学历\"><el-input v-model=\"attributeForm.xl\" placeholder=\"选填\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"学位\"><el-input v-model=\"attributeForm.xw\" placeholder=\"选填\" /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"入伍工作时间\">\r\n <el-date-picker v-model=\"attributeForm.rwgzsj\" type=\"datetime\" value-format=\"yyyy-MM-ddTHH:mm:ss\" placeholder=\"选填\" style=\"width:100%\" />\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"教龄\"><el-input-number v-model=\"attributeForm.jl\" :min=\"0\" style=\"width:100%\" /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"教龄计算日期\">\r\n <el-date-picker v-model=\"attributeForm.jljsrq\" type=\"datetime\" value-format=\"yyyy-MM-ddTHH:mm:ss\" placeholder=\"选填\" style=\"width:100%\" />\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"24\">\r\n <el-form-item label=\"任代职经历\"><el-input v-model=\"attributeForm.rdzjl\" placeholder=\"选填\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"24\">\r\n <el-form-item label=\"发表论文\"><el-input v-model=\"attributeForm.fblw\" placeholder=\"选填\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n </el-form>\r\n <div slot=\"footer\" class=\"dialog-footer\">\r\n <el-button @click=\"handleCancelEditAttribute\">取消</el-button>\r\n <el-button type=\"primary\" :loading=\"attributeSaving\" @click=\"handleSaveAttribute\">保存</el-button>\r\n </div>\r\n </template>\r\n </div>\r\n </el-dialog>\r\n </div>\r\n</template>\r\n\r\n<script>\r\nimport {\r\n listTeacher,\r\n getTeacher,\r\n addTeacher,\r\n updateTeacher,\r\n disableTeacher,\r\n getTeacherAttribute,\r\n updateTeacherAttribute\r\n} from '@/api/teachOffice/teacher'\r\nimport { getDicts } from '@/api/system/dict/data'\r\n\r\nexport default {\r\n name: 'Teacher',\r\n data() {\r\n return {\r\n // 查询条件(仅后端 JYBMapper.xml 支持的字段:jyxm 模糊 / jysdh 等值 / zc 模糊 / jylb 等值)\r\n searchForm: { jyxm: '', jysdh: '', zc: '', jylb: '' },\r\n\r\n // 列表\r\n loading: false,\r\n tableData: [],\r\n selectedRows: [],\r\n pagination: { pageNum: 1, pageSize: 20, total: 0 },\r\n\r\n // 新建\r\n addDialogVisible: false,\r\n addSaving: false,\r\n addForm: this.createEmptyAddForm(),\r\n addRules: {\r\n 'teacher.jyxm': [{ required: true, message: '请输入教员姓名', trigger: 'blur' }],\r\n \r\n 'teacher.xh': [{ required: true, message: '请输入序号', trigger: 'blur' }],\r\n 'teacher.zyjszwdj': [{ required: true, message: '请输入专业技术职务等级', trigger: 'blur' }],\r\n 'teacher.xslx': [{ required: true, message: '请选择虚实类型', trigger: 'change' }],\r\n 'teacher.jylb': [{ required: true, message: '请选择教员类别', trigger: 'change' }],\r\n 'teacher.zzlb': [{ required: true, message: '请选择在职类别', trigger: 'change' }],\r\n 'teacher.ewyxkbs': [{ required: true, message: '请输入额外允许开班数', trigger: 'change' }],\r\n 'teacher.dslb': [{ required: true, message: '请选择导师类别', trigger: 'change' }],\r\n 'teacher.xy': [{ required: true, message: '请输入学缘', trigger: 'blur' }],\r\n 'teacher.sfzh': [{ required: true, message: '请输入身份证号', trigger: 'blur' }],\r\n 'teacher.xb': [{ required: true, message: '请选择性别', trigger: 'change' }],\r\n 'teacher.wxjy': [{ required: true, message: '请选择外训教员', trigger: 'change' }],\r\n 'teacher.wxyy': [{ required: true, message: '请选择外训译员', trigger: 'change' }],\r\n 'teacher.zzljy': [{ required: true, message: '请选择政治类教员', trigger: 'change' }]\r\n },\r\n\r\n // 编辑\r\n editDialogVisible: false,\r\n editLoading: false,\r\n editSaving: false,\r\n editForm: {},\r\n editRules: {\r\n jyxm: [{ required: true, message: '请输入教员姓名', trigger: 'blur' }],\r\n jysdh: [{ required: true, message: '请输入教研室代号', trigger: 'blur' }],\r\n xb: [{ required: true, message: '请选择性别', trigger: 'change' }],\r\n sfzh: [{ required: true, message: '请输入身份证号', trigger: 'blur' }],\r\n zyjszwdj: [{ required: true, message: '请输入专业技术职务等级', trigger: 'blur' }],\r\n xslx: [{ required: true, message: '请选择虚实类型', trigger: 'change' }],\r\n jylb: [{ required: true, message: '请输入教员类别', trigger: 'blur' }],\r\n zzlb: [{ required: true, message: '请输入在职类别', trigger: 'blur' }],\r\n dslb: [{ required: true, message: '请输入导师类别', trigger: 'blur' }],\r\n xy: [{ required: true, message: '请输入学缘', trigger: 'blur' }],\r\n ewyxkbs: [{ required: true, message: '请输入额外允许开班数', trigger: 'change' }],\r\n wxjy: [{ required: true, message: '请选择外训教员', trigger: 'change' }],\r\n wxyy: [{ required: true, message: '请选择外训译员', trigger: 'change' }],\r\n zzljy: [{ required: true, message: '请选择政治类教员', trigger: 'change' }]\r\n },\r\n\r\n // 教员属性\r\n attributeVisible: false,\r\n attributeMode: 'view',\r\n attributeData: {},\r\n attributeForm: {},\r\n attributeLoading: false,\r\n attributeSaving: false,\r\n attributeJybh: '',\r\n // 字典选项\r\n zyjszwdjOptions: [],\r\n jylbOptions: [],\r\n zzlbOptions: [],\r\n dslbOptions: []\r\n }\r\n },\r\n mounted() {\r\n this.fetchList()\r\n this.loadDicts()\r\n },\r\n methods: {\r\n /** 统一格式化后端 LocalDateTime(去除 T、截断到秒) */\r\n fmtDateTime(val) {\r\n if (val === null || val === undefined || val === '') return ''\r\n return String(val).replace('T', ' ').slice(0, 19)\r\n },\r\n\r\n /** 空值显示为 '-' */\r\n fmtVal(val) {\r\n return (val === null || val === undefined || val === '') ? '-' : val\r\n },\r\n\r\n /** 性别:1-男 0-女(与后端 TeacherListVO 注释及学员页约定一致) */\r\n fmtGender(val) {\r\n if (val === null || val === undefined || val === '') return '-'\r\n return Number(val) === 1 ? '男' : Number(val) === 0 ? '女' : String(val)\r\n },\r\n\r\n /** 虚实类型:1-实教 0-非实教(项目约定 1-实 0-虚) */\r\n fmtXslx(val) {\r\n if (val === null || val === undefined || val === '') return '-'\r\n return Number(val) === 1 ? '实教' : Number(val) === 0 ? '非实教' : String(val)\r\n },\r\n\r\n /** 0/1 标志位格式化 */\r\n fmtFlag(val, yesLabel, noLabel) {\r\n if (val === null || val === undefined || val === '') return '-'\r\n return Number(val) === 1 ? yesLabel : Number(val) === 0 ? noLabel : String(val)\r\n },\r\n\r\n /** 移除空值 */\r\n \r\n\r\n loadDicts() {\r\n getDicts('teacher_zyjszwdj').then(res => { this.zyjszwdjOptions = res.data || [] }).catch(() => {})\r\n getDicts('teacher_jylb').then(res => { this.jylbOptions = res.data || [] }).catch(() => {})\r\n getDicts('teacher_zzlb').then(res => { this.zzlbOptions = res.data || [] }).catch(() => {})\r\n getDicts('teacher_dslb').then(res => { this.dslbOptions = res.data || [] }).catch(() => {})\r\n },\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 createEmptyAddForm() {\r\n return {\r\n teacher: {\r\n jybh: '', jyxm: '', jysdh: '', xh: '', zyjszwdj: '', zyjszwdjsj: '',\r\n xslx: 1, jylb: '', zzlb: '', dslb: '', xy: '', sfzh: '', xb: 1,\r\n wxjy: 0, wxyy: 0, zzljy: 0, ewyxkbs: 0, zc: '', sjh: '', kh: '', py: '',\r\n zcsj: '', bz: ''\r\n },\r\n attributes: {\r\n xl: '', xw: '', jl: 0, jljsrq: '', zr: 0, zw: '', zwsj: '', jszw: '',\r\n jszwsj: '', jsdj: '', jsdjsj: '', jxwz: '', jxwzsj: '', cssj: '',\r\n rwgzsj: '', rdzjl: '', fblw: ''\r\n }\r\n }\r\n },\r\n\r\n // ==================== 列表 ====================\r\n buildQuery() {\r\n const params = {}\r\n ;['jyxm', 'jysdh', 'zc', 'jylb'].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 return params\r\n },\r\n\r\n fetchList() {\r\n this.loading = true\r\n const params = {\r\n pageNum: this.pagination.pageNum,\r\n pageSize: this.pagination.pageSize,\r\n ...this.buildQuery()\r\n }\r\n listTeacher(params).then(response => {\r\n const data = response.data || {}\r\n this.tableData = data.records || []\r\n this.pagination.total = data.total || 0\r\n this.loading = false\r\n }).catch(() => {\r\n this.tableData = []\r\n this.pagination.total = 0\r\n this.loading = false\r\n })\r\n },\r\n\r\n handleSearch() {\r\n this.pagination.pageNum = 1\r\n this.fetchList()\r\n },\r\n\r\n handleReset() {\r\n this.searchForm = { jyxm: '', jysdh: '', zc: '', jylb: '' }\r\n this.pagination.pageNum = 1\r\n this.fetchList()\r\n },\r\n\r\n handleSizeChange(size) {\r\n this.pagination.pageSize = size\r\n this.pagination.pageNum = 1\r\n this.fetchList()\r\n },\r\n\r\n handleCurrentChange(page) {\r\n this.pagination.pageNum = page\r\n this.fetchList()\r\n },\r\n\r\n handleSelectionChange(rows) {\r\n this.selectedRows = rows\r\n },\r\n\r\n // ==================== 无后端接口的操作 ====================\r\n handleDeleteSelected() {\r\n this.$message.info('后端暂未提供该接口')\r\n },\r\n\r\n handleImport() {\r\n this.$message.info('后端暂未提供该接口')\r\n },\r\n\r\n handleDownloadTemplate() {\r\n this.$message.info('后端暂未提供该接口')\r\n },\r\n\r\n // ==================== 新增 ====================\r\n handleNew() {\r\n this.addForm = this.createEmptyAddForm()\r\n this.$nextTick(() => {\r\n this.$refs.addFormRef && this.$refs.addFormRef.clearValidate()\r\n })\r\n this.addDialogVisible = true\r\n },\r\n\r\n handleAddConfirm() {\r\n this.$refs.addFormRef.validate(valid => {\r\n if (!valid) return\r\n const dto = {\r\n teacher: this.buildTeacherPayload(this.addForm.teacher),\r\n attributes: this.buildAttributePayload(this.addForm.attributes)\r\n }\r\n this.addSaving = true\r\n addTeacher(dto).then(() => {\r\n this.$message.success('新增成功')\r\n this.addDialogVisible = false\r\n this.fetchList()\r\n }).catch(() => {\r\n }).finally(() => {\r\n this.addSaving = false\r\n })\r\n })\r\n },\r\n\r\n /** 组装 JYB 请求体(lzzt 不传,后端自动置 0) */\r\n buildTeacherPayload(t) {\r\n const payload = this.cleanPayload({\r\n jybh: t.jybh,\r\n jyxm: t.jyxm,\r\n jysdh: t.jysdh,\r\n bz: t.bz,\r\n zc: t.zc,\r\n xh: t.xh,\r\n zyjszwdj: t.zyjszwdj,\r\n xslx: t.xslx,\r\n jylb: t.jylb,\r\n kh: t.kh,\r\n py: t.py,\r\n zzlb: t.zzlb,\r\n ewyxkbs: t.ewyxkbs,\r\n dslb: t.dslb,\r\n xy: t.xy,\r\n sfzh: t.sfzh,\r\n xb: t.xb,\r\n wxjy: t.wxjy,\r\n wxyy: t.wxyy,\r\n zzljy: t.zzljy,\r\n sjh: t.sjh\r\n })\r\n // 整数/标志字段转 Number\r\n ;['xb', 'xslx', 'ewyxkbs', 'wxjy', 'wxyy', 'zzljy'].forEach(key => {\r\n if (payload[key] !== undefined) payload[key] = Number(payload[key])\r\n })\r\n // 时间字段已由 date-picker 输出 ISO 格式\r\n ;['zyjszwdjsj', 'zcsj'].forEach(key => {\r\n if (t[key]) payload[key] = t[key]\r\n })\r\n return payload\r\n },\r\n\r\n /** 组装 JYSX 请求体(仅非空字段) */\r\n buildAttributePayload(a) {\r\n const payload = this.cleanPayload({\r\n xl: a.xl,\r\n xw: a.xw,\r\n jl: a.jl,\r\n jljsrq: a.jljsrq,\r\n zr: a.zr,\r\n zw: a.zw,\r\n zwsj: a.zwsj,\r\n jszw: a.jszw,\r\n jszwsj: a.jszwsj,\r\n jsdj: a.jsdj,\r\n jsdjsj: a.jsdjsj,\r\n jxwz: a.jxwz,\r\n jxwzsj: a.jxwzsj,\r\n cssj: a.cssj,\r\n rwgzsj: a.rwgzsj,\r\n rdzjl: a.rdzjl,\r\n fblw: a.fblw\r\n })\r\n if (payload.zr !== undefined) payload.zr = Number(payload.zr)\r\n if (payload.jl !== undefined) payload.jl = Number(payload.jl)\r\n return payload\r\n },\r\n\r\n // ==================== 编辑 ====================\r\n handleEdit(row) {\r\n this.editDialogVisible = true\r\n this.editLoading = true\r\n getTeacher(row.jybh).then(response => {\r\n const data = response.data || {}\r\n const form = this.createEmptyAddForm().teacher\r\n Object.keys(form).forEach(key => {\r\n if (data[key] !== undefined && data[key] !== null) form[key] = data[key]\r\n })\r\n this.editForm = form\r\n this.editLoading = false\r\n }).catch(() => {\r\n this.editDialogVisible = false\r\n this.editLoading = false\r\n })\r\n },\r\n\r\n handleEditConfirm() {\r\n this.$refs.editFormRef.validate(valid => {\r\n if (!valid) return\r\n if (!this.editForm.jybh) {\r\n this.$message.warning('缺少教员编号,无法保存')\r\n return\r\n }\r\n const payload = this.buildTeacherPayload(this.editForm)\r\n payload.jybh = this.editForm.jybh\r\n this.editSaving = true\r\n updateTeacher(payload).then(() => {\r\n this.$message.success('保存成功')\r\n this.editDialogVisible = false\r\n this.fetchList()\r\n }).catch(() => {\r\n }).finally(() => {\r\n this.editSaving = false\r\n })\r\n })\r\n },\r\n\r\n // ==================== 离职(逻辑删除) ====================\r\n handleDisable(row) {\r\n if (!row.jybh) {\r\n this.$message.warning('当前行缺少教员编号')\r\n return\r\n }\r\n this.$confirm(`确定要办理教员「${row.jyxm || row.jybh}」离职吗?`, '系统提示', {\r\n confirmButtonText: '确定',\r\n cancelButtonText: '取消',\r\n type: 'warning'\r\n }).then(() => {\r\n disableTeacher(row.jybh).then(() => {\r\n this.$message.success('已办理离职')\r\n this.fetchList()\r\n }).catch(() => {})\r\n }).catch(() => {})\r\n },\r\n\r\n // ==================== 教员属性 ====================\r\n handleViewAttribute(row) {\r\n this.attributeMode = 'view'\r\n this.attributeJybh = row.jybh\r\n this.attributeData = {}\r\n this.attributeVisible = true\r\n this.attributeLoading = true\r\n getTeacherAttribute(row.jybh).then(response => {\r\n this.attributeData = response.data || {}\r\n this.attributeLoading = false\r\n }).catch(() => {\r\n this.attributeVisible = false\r\n this.attributeLoading = false\r\n })\r\n },\r\n\r\n handleStartEditAttribute() {\r\n this.attributeForm = this.createEmptyAddForm().attributes\r\n Object.keys(this.attributeForm).forEach(key => {\r\n if (this.attributeData[key] !== undefined && this.attributeData[key] !== null) {\r\n this.attributeForm[key] = this.attributeData[key]\r\n }\r\n })\r\n this.attributeForm.jybh = this.attributeJybh\r\n this.attributeMode = 'edit'\r\n },\r\n\r\n handleCancelEditAttribute() {\r\n this.attributeMode = 'view'\r\n },\r\n\r\n handleSaveAttribute() {\r\n const payload = this.buildAttributePayload(this.attributeForm)\r\n payload.jybh = this.attributeJybh\r\n this.attributeSaving = true\r\n updateTeacherAttribute(payload).then(() => {\r\n this.$message.success('保存成功')\r\n this.attributeMode = 'view'\r\n this.handleViewAttribute({ jybh: this.attributeJybh })\r\n }).catch(() => {\r\n }).finally(() => {\r\n this.attributeSaving = false\r\n })\r\n }\r\n }\r\n}\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n.teacher-page {\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 padding: 10px 12px;\r\n }\r\n }\r\n\r\n .search-actions {\r\n display: flex;\r\n justify-content: flex-end;\r\n padding: 12px;\r\n border-top: 1px solid #ebeef5;\r\n }\r\n }\r\n\r\n .list-title {\r\n font-size: 16px;\r\n font-weight: 600;\r\n color: #303133;\r\n margin-bottom: 12px;\r\n }\r\n\r\n .list-toolbar {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n gap: 12px;\r\n flex-wrap: wrap;\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 gap: 12px;\r\n flex-wrap: wrap;\r\n }\r\n }\r\n\r\n .table-card {\r\n margin-bottom: 16px;\r\n\r\n ::v-deep(.el-table) {\r\n width: 100%;\r\n }\r\n\r\n .pagination-wrap {\r\n display: flex;\r\n justify-content: flex-end;\r\n margin-top: 16px;\r\n }\r\n }\r\n\r\n .danger-text {\r\n color: #f56c6c;\r\n }\r\n}\r\n</style>\r\n\r\n\r\n"]}]}