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

1 line
37 KiB
JSON

{"remainingRequest":"C:\\Users\\Admin\\Desktop\\education\\frontend\\node_modules\\vue-loader\\lib\\index.js??vue-loader-options!C:\\Users\\Admin\\Desktop\\education\\frontend\\src\\views\\student\\studentInfo\\index.vue?vue&type=script&lang=js","dependencies":[{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\src\\views\\student\\studentInfo\\index.vue","mtime":1787640892012},{"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:Ly8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KDQppbXBvcnQgew0KICBsaXN0U3R1ZGVudFJlY29yZCwNCiAgZ2V0U3R1ZGVudFJlY29yZCwNCiAgYWRkU3R1ZGVudFJlY29yZCwNCiAgdXBkYXRlU3R1ZGVudFJlY29yZCwNCiAgZGVsU3R1ZGVudFJlY29yZA0KfSBmcm9tICJAL2FwaS9zdHVkZW50UmVjb3Jkcy9zdHVkZW50UmVjb3JkcyINCg0KZXhwb3J0IGRlZmF1bHQgew0KICBuYW1lOiAnU3R1ZGVudEluZm9JbmRleCcsDQogIGRhdGEoKSB7DQogICAgcmV0dXJuIHsNCiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09IOafpeivouadoeS7tiA9PT09PT09PT09PT09PT09PT09PQ0KICAgICAgLy8g5LuF5L+d55WZ5ZCO56uvIFhZWFgg5a6e5L2T5pSv5oyB55qE5a2X5q6177yaL3N0dWRlbnQtcmVjb3Jkcy9saXN0IOS8muaMieWunuS9k+Wtl+auteWKqOaAgeaehOW7uuafpeivouadoeS7tg0KICAgICAgc2VhcmNoRm9ybTogew0KICAgICAgICB4aDogJycsIHhtOiAnJywgeGI6ICcnLCB6amhtOiAnJywgenptbTogJycsIG16OiAnJywgamc6ICcnLCB4dzogJycsDQogICAgICAgIHliemI6ICcnLCBzZnpoOiAnJywgd2hjZDogJycsIGJrYnl5eDogJycsIGJxOiAnJywgbHhkaDogJycsIHR4ZHo6ICcnDQogICAgICB9LA0KDQogICAgICAvLyA9PT09PT09PT09PT09PT09PT09PSDmlbDmja7ooajmoLwgPT09PT09PT09PT09PT09PT09PT0NCiAgICAgIGxvYWRpbmc6IGZhbHNlLA0KICAgICAgdGFibGVEYXRhOiBbXSwNCiAgICAgIHBhZ2luYXRpb246IHsgcGFnZU51bTogMSwgcGFnZVNpemU6IDIwLCB0b3RhbDogMCB9LA0KDQogICAgICAvLyA9PT09PT09PT09PT09PT09PT09PSDmlrDlop4v57yW6L6R5by556qXID09PT09PT09PT09PT09PT09PT09DQogICAgICBkaWFsb2dWaXNpYmxlOiBmYWxzZSwNCiAgICAgIGRpYWxvZ1RpdGxlOiAn5paw5aKe5a2m5ZGYJywNCiAgICAgIHN1Ym1pdHRpbmc6IGZhbHNlLA0KICAgICAgZm9ybURhdGE6IHRoaXMuY3JlYXRlRW1wdHlGb3JtKCksDQogICAgICBmb3JtUnVsZXM6IHsNCiAgICAgICAgYmg6IFt7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAn6K+36L6T5YWl57yW5Y+3JywgdHJpZ2dlcjogJ2JsdXInIH1dLA0KICAgICAgICB4aDogW3sgcmVxdWlyZWQ6IHRydWUsIG1lc3NhZ2U6ICfor7fovpPlhaXlrablj7cnLCB0cmlnZ2VyOiAnYmx1cicgfV0sDQogICAgICAgIHhtOiBbeyByZXF1aXJlZDogdHJ1ZSwgbWVzc2FnZTogJ+ivt+i+k+WFpeWnk+WQjScsIHRyaWdnZXI6ICdibHVyJyB9XSwNCiAgICAgICAgeHlkcWJoOiBbeyByZXF1aXJlZDogdHJ1ZSwgbWVzc2FnZTogJ+ivt+i+k+WFpeWtpuWRmOmYn+acn+e8luWPtycsIHRyaWdnZXI6ICdibHVyJyB9XSwNCiAgICAgICAgempobTogW3sgcmVxdWlyZWQ6IHRydWUsIG1lc3NhZ2U6ICfor7fovpPlhaXor4Hku7blj7fnoIEnLCB0cmlnZ2VyOiAnYmx1cicgfV0sDQogICAgICAgIHp6bW06IFt7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAn6K+36L6T5YWl5pS/5rK76Z2i6LKMJywgdHJpZ2dlcjogJ2JsdXInIH1dLA0KICAgICAgICB4YjogW3sgcmVxdWlyZWQ6IHRydWUsIG1lc3NhZ2U6ICfor7fpgInmi6nmgKfliKsnLCB0cmlnZ2VyOiAnY2hhbmdlJyB9XSwNCiAgICAgICAgY3NycTogW3sgcmVxdWlyZWQ6IHRydWUsIG1lc3NhZ2U6ICfor7fpgInmi6nlh7rnlJ/ml6XmnJ8nLCB0cmlnZ2VyOiAnY2hhbmdlJyB9XSwNCiAgICAgICAgbXo6IFt7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAn6K+36L6T5YWl5rCR5pePJywgdHJpZ2dlcjogJ2JsdXInIH1dLA0KICAgICAgICBqZzogW3sgcmVxdWlyZWQ6IHRydWUsIG1lc3NhZ2U6ICfor7fovpPlhaXnsY3otK8nLCB0cmlnZ2VyOiAnYmx1cicgfV0sDQogICAgICAgIHdoY2Q6IFt7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAn6K+36L6T5YWl5paH5YyW56iL5bqmJywgdHJpZ2dlcjogJ2JsdXInIH1dLA0KICAgICAgICB4eWxiOiBbeyByZXF1aXJlZDogdHJ1ZSwgbWVzc2FnZTogJ+ivt+i+k+WFpeWtpuWRmOexu+WIqycsIHRyaWdnZXI6ICdibHVyJyB9XSwNCiAgICAgICAgc3NqcTogW3sgcmVxdWlyZWQ6IHRydWUsIG1lc3NhZ2U6ICfor7fovpPlhaXmiYDlsZ7lhpvljLonLCB0cmlnZ2VyOiAnYmx1cicgfV0sDQogICAgICAgIGdmczogW3sgcmVxdWlyZWQ6IHRydWUsIG1lc3NhZ2U6ICfor7fpgInmi6nlm73pmLLnlJ8nLCB0cmlnZ2VyOiAnY2hhbmdlJyB9XSwNCiAgICAgICAgdHh6dDogW3sgcmVxdWlyZWQ6IHRydWUsIG1lc3NhZ2U6ICfor7fovpPlhaXpgIDlrabnirbmgIEnLCB0cmlnZ2VyOiAnYmx1cicgfV0sDQogICAgICAgIGxqenQ6IFt7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAn6K+36L6T5YWl55WZ57qn54q25oCBJywgdHJpZ2dlcjogJ2JsdXInIH1dLA0KICAgICAgICBmYnp0OiBbeyByZXF1aXJlZDogdHJ1ZSwgbWVzc2FnZTogJ+ivt+i+k+WFpeWIhuePreeKtuaAgScsIHRyaWdnZXI6ICdibHVyJyB9XSwNCiAgICAgICAgeXhja2NqOiBbeyByZXF1aXJlZDogdHJ1ZSwgbWVzc2FnZTogJ+ivt+mAieaLqeWFgeiuuOafpeeci+aIkOe7qScsIHRyaWdnZXI6ICdjaGFuZ2UnIH1dLA0KICAgICAgICBkcWJ6Ymg6IFt7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAn6K+36L6T5YWl5b2T5YmN54+t5qyh57yW5Y+3JywgdHJpZ2dlcjogJ2JsdXInIH1dLA0KICAgICAgICB5emM6IFt7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAn6K+36YCJ5oup5bey5rOo5YaMJywgdHJpZ2dlcjogJ2NoYW5nZScgfV0sDQogICAgICAgIGpyempseDogW3sgcmVxdWlyZWQ6IHRydWUsIG1lc3NhZ2U6ICfor7fovpPlhaXlhpvkurror4Hku7bnsbvlnosnLCB0cmlnZ2VyOiAnYmx1cicgfV0NCiAgICAgIH0sDQoNCiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09IOaIkOe7qeW8ueeqlyA9PT09PT09PT09PT09PT09PT09PQ0KICAgICAgZ3JhZGVzVmlzaWJsZTogZmFsc2UsDQogICAgICBncmFkZXNUYWI6ICdncmFkZXMnLA0KICAgICAgZ3JhZGVzRGF0YTogbnVsbCwNCiAgICAgIHByb2Nlc3NHcmFkZXNEYXRhOiBudWxsLA0KICAgICAgZ3JhZGVzU3R1ZGVudDogJycsDQogICAgICBjdXJyZW50Qmg6ICcnLA0KICAgICAgZ3JhZGVzTG9hZGluZzogZmFsc2UNCiAgICB9DQogIH0sDQogIG1vdW50ZWQoKSB7DQogICAgdGhpcy5sb2FkRGF0YSgpDQogIH0sDQogIG1ldGhvZHM6IHsNCiAgICAvKiog5Yib5bu656m655m96KGo5Y2VICovDQogICAgY3JlYXRlRW1wdHlGb3JtKCkgew0KICAgICAgcmV0dXJuIHsNCiAgICAgICAgYmg6ICcnLCB4aDogJycsIHhtOiAnJywgeHlkcWJoOiAnJywgempobTogJycsIHp6bW06ICcnLCB4YjogJycsIGNzcnE6ICcnLCBtejogJycsIGpnOiAnJywNCiAgICAgICAgd2hjZDogJycsIHh5bGI6ICcnLCBzc2pxOiAnJywgZ2ZzOiAnJywgdHh6dDogJycsIGxqenQ6ICcnLCBmYnp0OiAnJywgeXhja2NqOiAnJywgZHFiemJoOiAnJywgeXpjOiAnJywNCiAgICAgICAganJ6amx4OiAnJywgc2Z6aDogJycsIGx4ZGg6ICcnLCB0eGR6OiAnJywgYno6ICcnLCBkdHNqOiAnJw0KICAgICAgfQ0KICAgIH0sDQoNCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PSDliJfooajliqDovb0gPT09PT09PT09PT09PT09PT09PT0NCiAgICBsb2FkRGF0YSgpIHsNCiAgICAgIHRoaXMubG9hZGluZyA9IHRydWUNCiAgICAgIGNvbnN0IHBhcmFtcyA9IHsNCiAgICAgICAgcGFnZU51bTogdGhpcy5wYWdpbmF0aW9uLnBhZ2VOdW0sDQogICAgICAgIHBhZ2VTaXplOiB0aGlzLnBhZ2luYXRpb24ucGFnZVNpemUNCiAgICAgIH0NCiAgICAgIHRoaXMuYnVpbGRRdWVyeVBhcmFtcyhwYXJhbXMpDQogICAgICBsaXN0U3R1ZGVudFJlY29yZChwYXJhbXMpLnRoZW4ocmVzID0+IHsNCiAgICAgICAgY29uc3QgZGF0YSA9IHJlcy5kYXRhIHx8IHt9DQogICAgICAgIHRoaXMudGFibGVEYXRhID0gZGF0YS5yZWNvcmRzIHx8IFtdDQogICAgICAgIHRoaXMucGFnaW5hdGlvbi50b3RhbCA9IGRhdGEudG90YWwgfHwgMA0KICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZQ0KICAgICAgfSkuY2F0Y2goKCkgPT4gew0KICAgICAgICB0aGlzLnRhYmxlRGF0YSA9IFtdDQogICAgICAgIHRoaXMucGFnaW5hdGlvbi50b3RhbCA9IDANCiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2UNCiAgICAgIH0pDQogICAgfSwNCg0KICAgIC8qKiDnu4Too4Xmn6Xor6Llj4LmlbDvvJrku4XkvKDlkI7nq68gWFlYWCDlrp7kvZPmlK/mjIHnmoTlrZfnrKbkuLLlrZfmrrXvvIznqbrlgLzlv73nlaUgKi8NCiAgICBidWlsZFF1ZXJ5UGFyYW1zKHBhcmFtcykgew0KICAgICAgY29uc3QgdGV4dEZpZWxkcyA9IFsneGgnLCAneG0nLCAnempobScsICd6em1tJywgJ216JywgJ2pnJywgJ3h3JywgJ3liemInLCAnc2Z6aCcsICd3aGNkJywgJ2JrYnl5eCcsICdicScsICdseGRoJywgJ3R4ZHonXQ0KICAgICAgdGV4dEZpZWxkcy5mb3JFYWNoKGtleSA9PiB7DQogICAgICAgIGNvbnN0IHYgPSB0aGlzLnNlYXJjaEZvcm1ba2V5XQ0KICAgICAgICBpZiAodiAhPT0gJycgJiYgdiAhPT0gbnVsbCAmJiB2ICE9PSB1bmRlZmluZWQpIHBhcmFtc1trZXldID0gdi50cmltKCkNCiAgICAgIH0pDQogICAgICBpZiAodGhpcy5zZWFyY2hGb3JtLnhiKSBwYXJhbXMueGIgPSB0aGlzLnNlYXJjaEZvcm0ueGINCiAgICB9LA0KDQogICAgLy8gPT09PT09PT09PT09PT09PT09PT0g5p+l6K+iL+WIhumhtSA9PT09PT09PT09PT09PT09PT09PQ0KICAgIGhhbmRsZVNlYXJjaCgpIHsNCiAgICAgIHRoaXMucGFnaW5hdGlvbi5wYWdlTnVtID0gMQ0KICAgICAgdGhpcy5sb2FkRGF0YSgpDQogICAgfSwNCiAgICBoYW5kbGVQYWdlQ2hhbmdlKHBhZ2UpIHsNCiAgICAgIHRoaXMucGFnaW5hdGlvbi5wYWdlTnVtID0gcGFnZQ0KICAgICAgdGhpcy5sb2FkRGF0YSgpDQogICAgfSwNCiAgICBoYW5kbGVTaXplQ2hhbmdlKHNpemUpIHsNCiAgICAgIHRoaXMucGFnaW5hdGlvbi5wYWdlU2l6ZSA9IHNpemUNCiAgICAgIHRoaXMucGFnaW5hdGlvbi5wYWdlTnVtID0gMQ0KICAgICAgdGhpcy5sb2FkRGF0YSgpDQogICAgfSwNCg0KICAgIC8vID09PT09PT09PT09PT09PT09PT09IOaWsOWini/nvJbovpHlvLnnqpcgPT09PT09PT09PT09PT09PT09PT0NCiAgICByZXNldEZvcm0oKSB7DQogICAgICBPYmplY3QuYXNzaWduKHRoaXMuZm9ybURhdGEsIHRoaXMuY3JlYXRlRW1wdHlGb3JtKCkpDQogICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB7DQogICAgICAgIGlmICh0aGlzLiRyZWZzLmZvcm1SZWYpIHsNCiAgICAgICAgICB0aGlzLiRyZWZzLmZvcm1SZWYuY2xlYXJWYWxpZGF0ZSgpDQogICAgICAgIH0NCiAgICAgIH0pDQogICAgfSwNCg0KICAgIGhhbmRsZUFkZCgpIHsNCiAgICAgIHRoaXMuZGlhbG9nVGl0bGUgPSAn5paw5aKe5a2m5ZGYJw0KICAgICAgdGhpcy5yZXNldEZvcm0oKQ0KICAgICAgdGhpcy5kaWFsb2dWaXNpYmxlID0gdHJ1ZQ0KICAgIH0sDQoNCiAgICBoYW5kbGVFZGl0KHJvdykgew0KICAgICAgdGhpcy5kaWFsb2dUaXRsZSA9ICfnvJbovpHlrablkZgnDQogICAgICB0aGlzLnJlc2V0Rm9ybSgpDQogICAgICBpZiAoIXJvdy5iaCkgew0KICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMuZm9ybURhdGEsIHRoaXMuY3JlYXRlRW1wdHlGb3JtKCksIHJvdykNCiAgICAgICAgdGhpcy5kaWFsb2dWaXNpYmxlID0gdHJ1ZQ0KICAgICAgICByZXR1cm4NCiAgICAgIH0NCiAgICAgIGdldFN0dWRlbnRSZWNvcmQocm93LmJoKS50aGVuKHJlcyA9PiB7DQogICAgICAgIGNvbnN0IGRhdGEgPSByZXMuZGF0YSB8fCB7fQ0KICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMuZm9ybURhdGEsIHRoaXMuY3JlYXRlRW1wdHlGb3JtKCksIGRhdGEpDQogICAgICAgIHRoaXMuZGlhbG9nVmlzaWJsZSA9IHRydWUNCiAgICAgIH0pLmNhdGNoKCgpID0+IHt9KQ0KICAgIH0sDQoNCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PSDmlrDlop4v57yW6L6R5o+Q5LqkID09PT09PT09PT09PT09PT09PT09DQogICAgaGFuZGxlU3VibWl0KCkgew0KICAgICAgdGhpcy4kcmVmcy5mb3JtUmVmLnZhbGlkYXRlKHZhbGlkID0+IHsNCiAgICAgICAgaWYgKCF2YWxpZCkgcmV0dXJuDQogICAgICAgIHRoaXMuc3VibWl0dGluZyA9IHRydWUNCiAgICAgICAgY29uc3QgaXNBZGQgPSB0aGlzLmRpYWxvZ1RpdGxlID09PSAn5paw5aKe5a2m5ZGYJw0KICAgICAgICBjb25zdCBwYXlsb2FkID0geyAuLi50aGlzLmZvcm1EYXRhIH0NCiAgICAgICAgY29uc3QgcmVxdWVzdCA9IGlzQWRkID8gYWRkU3R1ZGVudFJlY29yZChwYXlsb2FkKSA6IHVwZGF0ZVN0dWRlbnRSZWNvcmQocGF5bG9hZCkNCiAgICAgICAgcmVxdWVzdC50aGVuKCgpID0+IHsNCiAgICAgICAgICB0aGlzLiRtZXNzYWdlLnN1Y2Nlc3MoaXNBZGQgPyAn5paw5aKe5oiQ5YqfJyA6ICfnvJbovpHmiJDlip8nKQ0KICAgICAgICAgIHRoaXMuZGlhbG9nVmlzaWJsZSA9IGZhbHNlDQogICAgICAgICAgdGhpcy5sb2FkRGF0YSgpDQogICAgICAgIH0pLmNhdGNoKCgpID0+IHsNCiAgICAgICAgfSkuZmluYWxseSgoKSA9PiB7DQogICAgICAgICAgdGhpcy5zdWJtaXR0aW5nID0gZmFsc2UNCiAgICAgICAgfSkNCiAgICAgIH0pDQogICAgfSwNCg0KICAgIC8vID09PT09PT09PT09PT09PT09PT09IOWIoOmZpCA9PT09PT09PT09PT09PT09PT09PQ0KICAgIGhhbmRsZURlbGV0ZShyb3cpIHsNCiAgICAgIHRoaXMuJGNvbmZpcm0oYOehruWumuimgeWIoOmZpCIke3Jvdy54bX0i5ZCX77yfYCwgJ+WIoOmZpOehruiupCcsIHsNCiAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6ICfnoa7lrponLA0KICAgICAgICBjYW5jZWxCdXR0b25UZXh0OiAn5Y+W5raIJywNCiAgICAgICAgdHlwZTogJ3dhcm5pbmcnDQogICAgICB9KS50aGVuKCgpID0+IHsNCiAgICAgICAgcmV0dXJuIGRlbFN0dWRlbnRSZWNvcmQocm93LmJoKQ0KICAgICAgfSkudGhlbigoKSA9PiB7DQogICAgICAgIHRoaXMuJG1lc3NhZ2Uuc3VjY2Vzcygn5Yig6Zmk5oiQ5YqfJykNCiAgICAgICAgdGhpcy5sb2FkRGF0YSgpDQogICAgICB9KS5jYXRjaCgoKSA9PiB7fSkNCiAgICB9LA0KDQogICAgLy8gPT09PT09PT09PT09PT09PT09PT0g5oiQ57up5by556qXID09PT09PT09PT09PT09PT09PT09DQogICAgLy8gVE9ETzog5ZCO56uv5o6l5Y+j5pyq5o+Q5L6b77yM5oiQ57up5pWw5o2u5Li65YmN56uv5qih5ouf77yb5o6l5Y+j5bCx57uq5ZCO5pu/5o2i5Li6IGdldFN0dWRlbnRHcmFkZXMgLyBnZXRTdHVkZW50UHJvY2Vzc0dyYWRlcw0KICAgIGhhbmRsZUdyYWRlcyhyb3cpIHsNCiAgICAgIHRoaXMuZ3JhZGVzU3R1ZGVudCA9IHJvdy54bSB8fCAnJw0KICAgICAgdGhpcy5jdXJyZW50QmggPSByb3cuYmggfHwgJycNCiAgICAgIHRoaXMuZ3JhZGVzRGF0YSA9IG51bGwNCiAgICAgIHRoaXMucHJvY2Vzc0dyYWRlc0RhdGEgPSBudWxsDQogICAgICB0aGlzLmdyYWRlc1RhYiA9ICdncmFkZXMnDQogICAgICB0aGlzLmdyYWRlc1Zpc2libGUgPSB0cnVlDQogICAgICB0aGlzLmdyYWRlc0xvYWRpbmcgPSB0cnVlDQogICAgICBzZXRUaW1lb3V0KCgpID0+IHsNCiAgICAgICAgdGhpcy5ncmFkZXNEYXRhID0geyDlrablkZg6IHJvdy54bSwg5a2m5Y+3OiByb3cueGgsIOivvueoizogJ+mAmuS/oeWOn+eQhicsIOaIkOe7qTogOTIsIOWtpuWIhjogMy4wIH0NCiAgICAgICAgdGhpcy5wcm9jZXNzR3JhZGVzRGF0YSA9IHsg6L+b56iL5oiQ57upOiBbeyDlkI3np7A6ICflubPml7bmiJDnu6knLCDlvpfliIY6IDk1IH0sIHsg5ZCN56ewOiAn5pyf5pyr5oiQ57upJywg5b6X5YiGOiA4OCB9XSB9DQogICAgICAgIHRoaXMuZ3JhZGVzTG9hZGluZyA9IGZhbHNlDQogICAgICB9LCAzMDApDQogICAgfSwNCg0KICAgIC8vIFRPRE86IOWQjuerr+aOpeWPo+acquaPkOS+m++8jOWvvOWHuuS4uuWJjeerr+aooeaLn++8m+aOpeWPo+Wwsee7quWQjuabv+aNouS4uiBleHBvcnRTdHVkZW50R3JhZGVzDQogICAgaGFuZGxlRXhwb3J0R3JhZGVzKCkgew0KICAgICAgdGhpcy4kbWVzc2FnZS5zdWNjZXNzKGDlt7Llr7zlh7rlrablkZgke3RoaXMuZ3JhZGVzU3R1ZGVudH3miJDnu6nvvIjliY3nq6/mqKHmi5/vvIlgKQ0KICAgIH0NCiAgfQ0KfQ0K"},{"version":3,"sources":["index.vue"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkNA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;AAEA;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;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;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;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA","file":"index.vue","sourceRoot":"src/views/student/studentInfo","sourcesContent":["<template>\r\n <div class=\"app-container student-info-page\">\r\n <!-- ==================== 1. 查询条件区域 ==================== -->\r\n <el-card shadow=\"never\" class=\"search-card\">\r\n <el-form :model=\"searchForm\" label-width=\"110px\" class=\"search-form\">\r\n <el-row :gutter=\"24\">\r\n <!-- 左栏 -->\r\n <el-col :xs=\"24\" :md=\"12\">\r\n <el-form-item label=\"学号\">\r\n <el-input v-model=\"searchForm.xh\" placeholder=\"请输入学号\" clearable />\r\n </el-form-item>\r\n <el-form-item label=\"姓名\">\r\n <el-input v-model=\"searchForm.xm\" placeholder=\"请输入姓名\" clearable />\r\n </el-form-item>\r\n <el-form-item label=\"性别\">\r\n <el-select v-model=\"searchForm.xb\" placeholder=\"请选择性别\" clearable class=\"full-width\">\r\n <el-option label=\"男\" value=\"男\" />\r\n <el-option label=\"女\" value=\"女\" />\r\n </el-select>\r\n </el-form-item>\r\n <el-form-item label=\"证件号码\">\r\n <el-input v-model=\"searchForm.zjhm\" placeholder=\"请输入证件号码\" clearable />\r\n </el-form-item>\r\n <el-form-item label=\"政治面貌\">\r\n <el-input v-model=\"searchForm.zzmm\" placeholder=\"请输入政治面貌\" clearable />\r\n </el-form-item>\r\n <el-form-item label=\"民族\">\r\n <el-input v-model=\"searchForm.mz\" placeholder=\"请输入民族\" clearable />\r\n </el-form-item>\r\n <el-form-item label=\"籍贯\">\r\n <el-input v-model=\"searchForm.jg\" placeholder=\"请输入籍贯\" clearable />\r\n </el-form-item>\r\n <el-form-item label=\"学位\">\r\n <el-input v-model=\"searchForm.xw\" placeholder=\"请输入学位\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n\r\n <!-- 右栏 -->\r\n <el-col :xs=\"24\" :md=\"12\">\r\n <el-form-item label=\"原部职别\">\r\n <el-input v-model=\"searchForm.ybzb\" placeholder=\"请输入原部职别\" clearable />\r\n </el-form-item>\r\n <el-form-item label=\"身份证号\">\r\n <el-input v-model=\"searchForm.sfzh\" placeholder=\"请输入身份证号\" clearable />\r\n </el-form-item>\r\n <el-form-item label=\"文化程度\">\r\n <el-input v-model=\"searchForm.whcd\" placeholder=\"请输入文化程度\" clearable />\r\n </el-form-item>\r\n <el-form-item label=\"本科毕业院校\">\r\n <el-input v-model=\"searchForm.bkbyyx\" placeholder=\"请输入本科毕业院校\" clearable />\r\n </el-form-item>\r\n <el-form-item label=\"标签\">\r\n <el-input v-model=\"searchForm.bq\" placeholder=\"请输入标签\" clearable />\r\n </el-form-item>\r\n <el-form-item label=\"联系电话\">\r\n <el-input v-model=\"searchForm.lxdh\" placeholder=\"请输入联系电话\" clearable />\r\n </el-form-item>\r\n <el-form-item label=\"通信地址\">\r\n <el-input v-model=\"searchForm.txdz\" placeholder=\"请输入通信地址\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n\r\n <div class=\"search-actions\">\r\n <el-button type=\"primary\" icon=\"el-icon-search\" @click=\"handleSearch\">查询</el-button>\r\n </div>\r\n </el-form>\r\n </el-card>\r\n\r\n <!-- ==================== 2. 数据表格区域 ==================== -->\r\n <div class=\"list-title\">学员信息列表:</div>\r\n <div class=\"toolbar\"><el-button type=\"primary\" @click=\"handleAdd\">新增学员</el-button></div>\r\n\r\n <el-card shadow=\"never\" class=\"table-card\">\r\n <el-table v-loading=\"loading\" :data=\"tableData\" stripe border>\r\n <el-table-column type=\"index\" label=\"序号\" width=\"55\" align=\"center\" />\r\n <el-table-column prop=\"xh\" label=\"学号\" width=\"55\" show-overflow-tooltip />\r\n <el-table-column prop=\"xm\" label=\"姓名\" width=\"55\" />\r\n <el-table-column prop=\"xb\" label=\"性别\" width=\"55\" align=\"center\" />\r\n <el-table-column prop=\"nj\" label=\"年级\" width=\"55\" align=\"center\" />\r\n <el-table-column prop=\"zy\" label=\"专业\" width=\"55\" show-overflow-tooltip />\r\n <el-table-column prop=\"db\" label=\"队别\" width=\"55\" align=\"center\" />\r\n <el-table-column prop=\"bc\" label=\"班次\" width=\"55\" align=\"center\" />\r\n <el-table-column prop=\"pxlx\" label=\"培训类型\" width=\"85\" show-overflow-tooltip />\r\n <el-table-column prop=\"pxcc\" label=\"培训层次\" width=\"85\" align=\"center\" />\r\n <el-table-column prop=\"zzmm\" label=\"政治面貌\" width=\"85\" align=\"center\" />\r\n <el-table-column prop=\"mz\" label=\"民族\" width=\"55\" align=\"center\" />\r\n <el-table-column prop=\"jg\" label=\"籍贯\" width=\"55\" align=\"center\" />\r\n <el-table-column prop=\"xw\" label=\"学位\" width=\"55\" align=\"center\" />\r\n <el-table-column prop=\"zczt\" label=\"注册状态\" width=\"85\" align=\"center\" />\r\n <el-table-column prop=\"xjyd\" label=\"学籍异动状态\" width=\"110\" align=\"center\" />\r\n <el-table-column prop=\"ksqk\" label=\"考试情况\" width=\"85\" align=\"center\" />\r\n <el-table-column prop=\"bjgm\" label=\"不及格门数\" width=\"110\" align=\"center\" />\r\n <el-table-column prop=\"gljg\" label=\"管理机构\" width=\"85\" align=\"center\" />\r\n <el-table-column label=\"操作\" align=\"center\" fixed=\"right\">\r\n <template slot-scope=\"{ row }\">\r\n <el-button type=\"text\" class=\"text-primary\" @click=\"handleEdit(row)\">编辑</el-button>\r\n <el-button type=\"text\" class=\"text-success\" @click=\"handleGrades(row)\">成绩</el-button>\r\n <el-button type=\"text\" class=\"danger-text\" @click=\"handleDelete(row)\">删除</el-button>\r\n </template>\r\n </el-table-column>\r\n </el-table>\r\n <div class=\"pagination\">\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=\"handlePageChange\"\r\n />\r\n </div>\r\n </el-card>\r\n\r\n <!-- 新增/编辑弹窗 -->\r\n <el-dialog\r\n :visible=\"dialogVisible\"\r\n :title=\"dialogTitle\"\r\n width=\"780px\"\r\n :close-on-click-modal=\"false\"\r\n @update:visible=\"val => dialogVisible = val\"\r\n >\r\n <el-form ref=\"formRef\" :model=\"formData\" :rules=\"formRules\" label-width=\"120px\">\r\n <el-row :gutter=\"20\">\r\n <el-col :span=\"12\"><el-form-item label=\"编号\" prop=\"bh\"><el-input v-model=\"formData.bh\" placeholder=\"请输入编号\" /></el-form-item></el-col>\r\n <el-col :span=\"12\"><el-form-item label=\"学号\" prop=\"xh\"><el-input v-model=\"formData.xh\" placeholder=\"请输入学号\" /></el-form-item></el-col>\r\n </el-row>\r\n <el-row :gutter=\"20\">\r\n <el-col :span=\"12\"><el-form-item label=\"姓名\" prop=\"xm\"><el-input v-model=\"formData.xm\" placeholder=\"请输入姓名\" /></el-form-item></el-col>\r\n <el-col :span=\"12\"><el-form-item label=\"性别\" prop=\"xb\"><el-select v-model=\"formData.xb\" placeholder=\"请选择\" class=\"full-width\"><el-option label=\"男\" value=\"1\" /><el-option label=\"女\" value=\"0\" /></el-select></el-form-item></el-col>\r\n </el-row>\r\n <el-row :gutter=\"20\">\r\n <el-col :span=\"12\"><el-form-item label=\"出生日期\" prop=\"csrq\"><el-date-picker v-model=\"formData.csrq\" type=\"date\" placeholder=\"请选择\" value-format=\"yyyy-MM-dd\" class=\"full-width\" /></el-form-item></el-col>\r\n <el-col :span=\"12\"><el-form-item label=\"民族\" prop=\"mz\"><el-input v-model=\"formData.mz\" placeholder=\"请输入民族\" /></el-form-item></el-col>\r\n </el-row>\r\n <el-row :gutter=\"20\">\r\n <el-col :span=\"12\"><el-form-item label=\"籍贯\" prop=\"jg\"><el-input v-model=\"formData.jg\" placeholder=\"请输入籍贯\" /></el-form-item></el-col>\r\n <el-col :span=\"12\"><el-form-item label=\"政治面貌\" prop=\"zzmm\"><el-input v-model=\"formData.zzmm\" placeholder=\"请输入政治面貌\" /></el-form-item></el-col>\r\n </el-row>\r\n <el-row :gutter=\"20\">\r\n <el-col :span=\"12\"><el-form-item label=\"文化程度\" prop=\"whcd\"><el-input v-model=\"formData.whcd\" placeholder=\"请输入文化程度\" /></el-form-item></el-col>\r\n <el-col :span=\"12\"><el-form-item label=\"学员类别\" prop=\"xylb\"><el-input v-model=\"formData.xylb\" placeholder=\"请输入学员类别\" /></el-form-item></el-col>\r\n </el-row>\r\n <el-row :gutter=\"20\">\r\n <el-col :span=\"12\"><el-form-item label=\"学员队期编号\" prop=\"xydqbh\"><el-input v-model=\"formData.xydqbh\" placeholder=\"请输入学员队期编号\" /></el-form-item></el-col>\r\n <el-col :span=\"12\"><el-form-item label=\"证件号码\" prop=\"zjhm\"><el-input v-model=\"formData.zjhm\" placeholder=\"请输入证件号码\" /></el-form-item></el-col>\r\n </el-row>\r\n <el-row :gutter=\"20\">\r\n <el-col :span=\"12\"><el-form-item label=\"所属军区\" prop=\"ssjq\"><el-input v-model=\"formData.ssjq\" placeholder=\"请输入所属军区\" /></el-form-item></el-col>\r\n <el-col :span=\"12\"><el-form-item label=\"当前班次编号\" prop=\"dqbzbh\"><el-input v-model=\"formData.dqbzbh\" placeholder=\"请输入当前班次编号\" /></el-form-item></el-col>\r\n </el-row>\r\n <el-row :gutter=\"20\">\r\n <el-col :span=\"12\"><el-form-item label=\"军人证件类型\" prop=\"jrzjlx\"><el-input v-model=\"formData.jrzjlx\" placeholder=\"请输入军人证件类型\" /></el-form-item></el-col>\r\n <el-col :span=\"12\"><el-form-item label=\"退学状态\" prop=\"txzt\"><el-input v-model=\"formData.txzt\" placeholder=\"请输入退学状态\" /></el-form-item></el-col>\r\n </el-row>\r\n <el-row :gutter=\"20\">\r\n <el-col :span=\"8\"><el-form-item label=\"国防生\" prop=\"gfs\"><el-select v-model=\"formData.gfs\" placeholder=\"请选择\" class=\"full-width\"><el-option label=\"是\" value=\"1\" /><el-option label=\"否\" value=\"0\" /></el-select></el-form-item></el-col>\r\n <el-col :span=\"8\"><el-form-item label=\"留级状态\" prop=\"ljzt\"><el-input v-model=\"formData.ljzt\" placeholder=\"请输入\" /></el-form-item></el-col>\r\n <el-col :span=\"8\"><el-form-item label=\"分班状态\" prop=\"fbzt\"><el-input v-model=\"formData.fbzt\" placeholder=\"请输入\" /></el-form-item></el-col>\r\n </el-row>\r\n <el-row :gutter=\"20\">\r\n <el-col :span=\"8\"><el-form-item label=\"允许查看成绩\" prop=\"yxckcj\"><el-select v-model=\"formData.yxckcj\" placeholder=\"请选择\" class=\"full-width\"><el-option label=\"是\" value=\"1\" /><el-option label=\"否\" value=\"0\" /></el-select></el-form-item></el-col>\r\n <el-col :span=\"8\"><el-form-item label=\"已注册\" prop=\"yzc\"><el-select v-model=\"formData.yzc\" placeholder=\"请选择\" class=\"full-width\"><el-option label=\"是\" value=\"1\" /><el-option label=\"否\" value=\"0\" /></el-select></el-form-item></el-col>\r\n <el-col :span=\"8\" />\r\n </el-row>\r\n <el-row :gutter=\"20\">\r\n <el-col :span=\"12\"><el-form-item label=\"联系电话\" prop=\"lxdh\"><el-input v-model=\"formData.lxdh\" placeholder=\"请输入联系电话\" /></el-form-item></el-col>\r\n <el-col :span=\"12\"><el-form-item label=\"通讯地址\" prop=\"txdz\"><el-input v-model=\"formData.txdz\" placeholder=\"请输入通讯地址\" /></el-form-item></el-col>\r\n </el-row>\r\n <el-row :gutter=\"20\">\r\n <el-col :span=\"24\"><el-form-item label=\"备注\" prop=\"bz\"><el-input v-model=\"formData.bz\" type=\"textarea\" :rows=\"2\" placeholder=\"请输入备注\" /></el-form-item></el-col>\r\n </el-row>\r\n </el-form>\r\n <div slot=\"footer\">\r\n <el-button @click=\"dialogVisible = false\">取消</el-button>\r\n <el-button type=\"primary\" :loading=\"submitting\" @click=\"handleSubmit\">确定</el-button>\r\n </div>\r\n </el-dialog>\r\n\r\n <!-- 成绩弹窗 -->\r\n <el-dialog\r\n :visible=\"gradesVisible\"\r\n title=\"学员成绩\"\r\n width=\"600px\"\r\n :close-on-click-modal=\"false\"\r\n @update:visible=\"val => gradesVisible = val\"\r\n >\r\n <p><strong>学员:</strong>{{ gradesStudent }}</p>\r\n <el-tabs v-model=\"gradesTab\">\r\n <el-tab-pane label=\"成绩\" name=\"grades\">\r\n <div v-loading=\"gradesLoading\">\r\n <pre v-if=\"gradesData\">{{ gradesData }}</pre>\r\n </div>\r\n </el-tab-pane>\r\n <el-tab-pane label=\"进程成绩\" name=\"process\">\r\n <div v-loading=\"gradesLoading\">\r\n <pre v-if=\"processGradesData\">{{ processGradesData }}</pre>\r\n </div>\r\n </el-tab-pane>\r\n </el-tabs>\r\n <div slot=\"footer\">\r\n <el-button type=\"primary\" @click=\"handleExportGrades\">导出成绩</el-button>\r\n </div>\r\n </el-dialog>\r\n </div>\r\n</template>\r\n\r\n<script>\r\nimport {\r\n listStudentRecord,\r\n getStudentRecord,\r\n addStudentRecord,\r\n updateStudentRecord,\r\n delStudentRecord\r\n} from \"@/api/studentRecords/studentRecords\"\r\n\r\nexport default {\r\n name: 'StudentInfoIndex',\r\n data() {\r\n return {\r\n // ==================== 查询条件 ====================\r\n // 仅保留后端 XYXX 实体支持的字段:/student-records/list 会按实体字段动态构建查询条件\r\n searchForm: {\r\n xh: '', xm: '', xb: '', zjhm: '', zzmm: '', mz: '', jg: '', xw: '',\r\n ybzb: '', sfzh: '', whcd: '', bkbyyx: '', bq: '', lxdh: '', txdz: ''\r\n },\r\n\r\n // ==================== 数据表格 ====================\r\n loading: false,\r\n tableData: [],\r\n pagination: { pageNum: 1, pageSize: 20, total: 0 },\r\n\r\n // ==================== 新增/编辑弹窗 ====================\r\n dialogVisible: false,\r\n dialogTitle: '新增学员',\r\n submitting: false,\r\n formData: this.createEmptyForm(),\r\n formRules: {\r\n bh: [{ required: true, message: '请输入编号', trigger: 'blur' }],\r\n xh: [{ required: true, message: '请输入学号', trigger: 'blur' }],\r\n xm: [{ required: true, message: '请输入姓名', trigger: 'blur' }],\r\n xydqbh: [{ required: true, message: '请输入学员队期编号', trigger: 'blur' }],\r\n zjhm: [{ required: true, message: '请输入证件号码', trigger: 'blur' }],\r\n zzmm: [{ required: true, message: '请输入政治面貌', trigger: 'blur' }],\r\n xb: [{ required: true, message: '请选择性别', trigger: 'change' }],\r\n csrq: [{ required: true, message: '请选择出生日期', trigger: 'change' }],\r\n mz: [{ required: true, message: '请输入民族', trigger: 'blur' }],\r\n jg: [{ required: true, message: '请输入籍贯', trigger: 'blur' }],\r\n whcd: [{ required: true, message: '请输入文化程度', trigger: 'blur' }],\r\n xylb: [{ required: true, message: '请输入学员类别', trigger: 'blur' }],\r\n ssjq: [{ required: true, message: '请输入所属军区', trigger: 'blur' }],\r\n gfs: [{ required: true, message: '请选择国防生', trigger: 'change' }],\r\n txzt: [{ required: true, message: '请输入退学状态', trigger: 'blur' }],\r\n ljzt: [{ required: true, message: '请输入留级状态', trigger: 'blur' }],\r\n fbzt: [{ required: true, message: '请输入分班状态', trigger: 'blur' }],\r\n yxckcj: [{ required: true, message: '请选择允许查看成绩', trigger: 'change' }],\r\n dqbzbh: [{ required: true, message: '请输入当前班次编号', trigger: 'blur' }],\r\n yzc: [{ required: true, message: '请选择已注册', trigger: 'change' }],\r\n jrzjlx: [{ required: true, message: '请输入军人证件类型', trigger: 'blur' }]\r\n },\r\n\r\n // ==================== 成绩弹窗 ====================\r\n gradesVisible: false,\r\n gradesTab: 'grades',\r\n gradesData: null,\r\n processGradesData: null,\r\n gradesStudent: '',\r\n currentBh: '',\r\n gradesLoading: false\r\n }\r\n },\r\n mounted() {\r\n this.loadData()\r\n },\r\n methods: {\r\n /** 创建空白表单 */\r\n createEmptyForm() {\r\n return {\r\n bh: '', xh: '', xm: '', xydqbh: '', zjhm: '', zzmm: '', xb: '', csrq: '', mz: '', jg: '',\r\n whcd: '', xylb: '', ssjq: '', gfs: '', txzt: '', ljzt: '', fbzt: '', yxckcj: '', dqbzbh: '', yzc: '',\r\n jrzjlx: '', sfzh: '', lxdh: '', txdz: '', bz: '', dtsj: ''\r\n }\r\n },\r\n\r\n // ==================== 列表加载 ====================\r\n loadData() {\r\n this.loading = true\r\n const params = {\r\n pageNum: this.pagination.pageNum,\r\n pageSize: this.pagination.pageSize\r\n }\r\n this.buildQueryParams(params)\r\n listStudentRecord(params).then(res => {\r\n const data = res.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 /** 组装查询参数:仅传后端 XYXX 实体支持的字符串字段,空值忽略 */\r\n buildQueryParams(params) {\r\n const textFields = ['xh', 'xm', 'zjhm', 'zzmm', 'mz', 'jg', 'xw', 'ybzb', 'sfzh', 'whcd', 'bkbyyx', 'bq', 'lxdh', 'txdz']\r\n textFields.forEach(key => {\r\n const v = this.searchForm[key]\r\n if (v !== '' && v !== null && v !== undefined) params[key] = v.trim()\r\n })\r\n if (this.searchForm.xb) params.xb = this.searchForm.xb\r\n },\r\n\r\n // ==================== 查询/分页 ====================\r\n handleSearch() {\r\n this.pagination.pageNum = 1\r\n this.loadData()\r\n },\r\n handlePageChange(page) {\r\n this.pagination.pageNum = page\r\n this.loadData()\r\n },\r\n handleSizeChange(size) {\r\n this.pagination.pageSize = size\r\n this.pagination.pageNum = 1\r\n this.loadData()\r\n },\r\n\r\n // ==================== 新增/编辑弹窗 ====================\r\n resetForm() {\r\n Object.assign(this.formData, this.createEmptyForm())\r\n this.$nextTick(() => {\r\n if (this.$refs.formRef) {\r\n this.$refs.formRef.clearValidate()\r\n }\r\n })\r\n },\r\n\r\n handleAdd() {\r\n this.dialogTitle = '新增学员'\r\n this.resetForm()\r\n this.dialogVisible = true\r\n },\r\n\r\n handleEdit(row) {\r\n this.dialogTitle = '编辑学员'\r\n this.resetForm()\r\n if (!row.bh) {\r\n Object.assign(this.formData, this.createEmptyForm(), row)\r\n this.dialogVisible = true\r\n return\r\n }\r\n getStudentRecord(row.bh).then(res => {\r\n const data = res.data || {}\r\n Object.assign(this.formData, this.createEmptyForm(), data)\r\n this.dialogVisible = true\r\n }).catch(() => {})\r\n },\r\n\r\n // ==================== 新增/编辑提交 ====================\r\n handleSubmit() {\r\n this.$refs.formRef.validate(valid => {\r\n if (!valid) return\r\n this.submitting = true\r\n const isAdd = this.dialogTitle === '新增学员'\r\n const payload = { ...this.formData }\r\n const request = isAdd ? addStudentRecord(payload) : updateStudentRecord(payload)\r\n request.then(() => {\r\n this.$message.success(isAdd ? '新增成功' : '编辑成功')\r\n this.dialogVisible = false\r\n this.loadData()\r\n }).catch(() => {\r\n }).finally(() => {\r\n this.submitting = false\r\n })\r\n })\r\n },\r\n\r\n // ==================== 删除 ====================\r\n handleDelete(row) {\r\n this.$confirm(`确定要删除\"${row.xm}\"吗?`, '删除确认', {\r\n confirmButtonText: '确定',\r\n cancelButtonText: '取消',\r\n type: 'warning'\r\n }).then(() => {\r\n return delStudentRecord(row.bh)\r\n }).then(() => {\r\n this.$message.success('删除成功')\r\n this.loadData()\r\n }).catch(() => {})\r\n },\r\n\r\n // ==================== 成绩弹窗 ====================\r\n // TODO: 后端接口未提供,成绩数据为前端模拟;接口就绪后替换为 getStudentGrades / getStudentProcessGrades\r\n handleGrades(row) {\r\n this.gradesStudent = row.xm || ''\r\n this.currentBh = row.bh || ''\r\n this.gradesData = null\r\n this.processGradesData = null\r\n this.gradesTab = 'grades'\r\n this.gradesVisible = true\r\n this.gradesLoading = true\r\n setTimeout(() => {\r\n this.gradesData = { 学员: row.xm, 学号: row.xh, 课程: '通信原理', 成绩: 92, 学分: 3.0 }\r\n this.processGradesData = { 进程成绩: [{ 名称: '平时成绩', 得分: 95 }, { 名称: '期末成绩', 得分: 88 }] }\r\n this.gradesLoading = false\r\n }, 300)\r\n },\r\n\r\n // TODO: 后端接口未提供,导出为前端模拟;接口就绪后替换为 exportStudentGrades\r\n handleExportGrades() {\r\n this.$message.success(`已导出学员${this.gradesStudent}成绩(前端模拟)`)\r\n }\r\n }\r\n}\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n.student-info-page {\r\n .search-card {\r\n .search-form {\r\n .range-control {\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n width: 100%;\r\n\r\n .el-input {\r\n flex: 1;\r\n }\r\n\r\n .range-sep {\r\n flex-shrink: 0;\r\n font-size: 12px;\r\n color: #606266;\r\n }\r\n }\r\n\r\n .search-tip {\r\n font-size: 12px;\r\n color: #f56c6c;\r\n margin-top: 8px;\r\n margin-bottom: 8px;\r\n }\r\n\r\n .search-actions {\r\n display: flex;\r\n justify-content: flex-end;\r\n padding-top: 12px;\r\n border-top: 1px solid #ebeef5;\r\n }\r\n }\r\n }\r\n\r\n .toolbar {\r\n margin-bottom: 16px;\r\n }\r\n\r\n .table-card {\r\n .el-table {\r\n width: 100%;\r\n }\r\n }\r\n\r\n .text-primary {\r\n color: #409eff;\r\n padding: 0;\r\n }\r\n\r\n .text-success {\r\n color: #67c23a;\r\n padding: 0;\r\n }\r\n\r\n .danger-text {\r\n color: #f56c6c;\r\n padding: 0;\r\n }\r\n\r\n .full-width {\r\n width: 100%;\r\n }\r\n\r\n}\r\n</style>\r\n"]}]}