Files
education/frontend/node_modules/.cache/babel-loader/101d0ba304ee21fe55e3cd075fdd964f.json
T

1 line
42 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\\babel-loader\\lib\\index.js!C:\\Users\\Admin\\Desktop\\education\\frontend\\node_modules\\cache-loader\\dist\\cjs.js??ref--0-0!C:\\Users\\Admin\\Desktop\\education\\frontend\\node_modules\\vue-loader\\lib\\index.js??vue-loader-options!C:\\Users\\Admin\\Desktop\\education\\frontend\\src\\views\\classHour\\jointTraining\\index.vue?vue&type=script&lang=js","dependencies":[{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\src\\views\\classHour\\jointTraining\\index.vue","mtime":1787640892006},{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\babel.config.js","mtime":1787567871334},{"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:InVzZSBzdHJpY3QiOwoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgewogIHZhbHVlOiB0cnVlCn0pOwpleHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7CnJlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5zbGljZS5qcyIpOwpyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXMuZnVuY3Rpb24ubmFtZS5qcyIpOwpyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LnRvLXN0cmluZy5qcyIpOwpyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLmV4ZWMuanMiKTsKcmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5yZXBsYWNlLmpzIik7CnJlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcudHJpbS5qcyIpOwp2YXIgX2ZpbGVTYXZlciA9IHJlcXVpcmUoImZpbGUtc2F2ZXIiKTsKdmFyIF9qb2ludFRyYWluaW5nID0gcmVxdWlyZSgiQC9hcGkvY2xhc3NIb3VyL2pvaW50VHJhaW5pbmciKTsKLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KdmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gewogIG5hbWU6ICdKb2ludFRyYWluaW5nSW5kZXgnLAogIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7CiAgICByZXR1cm4gewogICAgICAvLyA9PT09PT09PT09PT09PT09PT09PSAxLiDmn6Xor6LmnaHku7YgPT09PT09PT09PT09PT09PT09PT0KICAgICAgc2VhcmNoRm9ybTogewogICAgICAgIG1jOiAnJwogICAgICB9LAogICAgICAvLyA9PT09PT09PT09PT09PT09PT09PSAyLiDmlofku7bmk43kvZwgPT09PT09PT09PT09PT09PT09PT0KICAgICAgc2VsZWN0ZWRGaWxlOiBudWxsLAogICAgICB1cGxvYWRpbmc6IGZhbHNlLAogICAgICAvLyA9PT09PT09PT09PT09PT09PT09PSAzLiDooajmoLzmlbDmja4gPT09PT09PT09PT09PT09PT09PT0KICAgICAgdGFibGVMb2FkaW5nOiBmYWxzZSwKICAgICAgdGFibGVEYXRhOiBbXSwKICAgICAgcGFnZU51bTogMSwKICAgICAgcGFnZVNpemU6IDEwLAogICAgICB0b3RhbDogMCwKICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT0gNC4g5paw5aKeL+S/ruaUueihqOWNlSA9PT09PT09PT09PT09PT09PT09PQogICAgICBkaWFsb2dWaXNpYmxlOiBmYWxzZSwKICAgICAgZGlhbG9nVGl0bGU6ICfmlrDlop7ogZTmlZnogZTorq0nLAogICAgICBzYXZpbmc6IGZhbHNlLAogICAgICBmb3JtOiB0aGlzLmNyZWF0ZUVtcHR5Rm9ybSgpLAogICAgICBydWxlczogewogICAgICAgIG1jOiBbewogICAgICAgICAgcmVxdWlyZWQ6IHRydWUsCiAgICAgICAgICBtZXNzYWdlOiAn6K+36L6T5YWl5ZCN56ewJywKICAgICAgICAgIHRyaWdnZXI6ICdibHVyJwogICAgICAgIH1dCiAgICAgIH0sCiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09IDUuIOivpuaDhSA9PT09PT09PT09PT09PT09PT09PQogICAgICBkZXRhaWxWaXNpYmxlOiBmYWxzZSwKICAgICAgZGV0YWlsRGF0YToge30KICAgIH07CiAgfSwKICBjb21wdXRlZDogewogICAgZmlsZU5hbWU6IGZ1bmN0aW9uIGZpbGVOYW1lKCkgewogICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEZpbGUgJiYgdGhpcy5zZWxlY3RlZEZpbGUubmFtZSB8fCAn5pyq6YCJ5oup5Lu75L2V5paH5Lu2JzsKICAgIH0KICB9LAogIG1vdW50ZWQ6IGZ1bmN0aW9uIG1vdW50ZWQoKSB7CiAgICB0aGlzLmZldGNoTGlzdCgpOwogIH0sCiAgbWV0aG9kczogewogICAgY3JlYXRlRW1wdHlGb3JtOiBmdW5jdGlvbiBjcmVhdGVFbXB0eUZvcm0oKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgYmg6ICcnLAogICAgICAgIG1jOiAnJywKICAgICAgICB4ejogJycsCiAgICAgICAgeWo6ICcnLAogICAgICAgIGtzcnE6ICcnLAogICAgICAgIGpzcnE6ICcnLAogICAgICAgIHRzOiBudWxsLAogICAgICAgIGpia3NsOiBudWxsLAogICAgICAgIGtzbHg6ICcnLAogICAgICAgIHhtbHg6ICcnLAogICAgICAgIHNtOiAnJywKICAgICAgICBiejogJycKICAgICAgfTsKICAgIH0sCiAgICAvKiog5oqK5ZCO56uvIExvY2FsRGF0ZVRpbWXvvIjlkKsgVC/mr6vnp5LvvInop4TojIPkuLrooajljZXlj6/lm57mmL7nmoTmoLzlvI8gKi9ub3JtYWxpemVEYXRlVGltZTogZnVuY3Rpb24gbm9ybWFsaXplRGF0ZVRpbWUodmFsKSB7CiAgICAgIGlmICghdmFsKSByZXR1cm4gJyc7CiAgICAgIHJldHVybiBTdHJpbmcodmFsKS5yZXBsYWNlKCdUJywgJyAnKS5yZXBsYWNlKC9cLlxkKyQvLCAnJykuc2xpY2UoMCwgMTkpOwogICAgfSwKICAgIC8vID09PT09PT09PT09PT09PT09PT09IOafpeivoiA9PT09PT09PT09PT09PT09PT09PQogICAgZmV0Y2hMaXN0OiBmdW5jdGlvbiBmZXRjaExpc3QoKSB7CiAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgIHRoaXMudGFibGVMb2FkaW5nID0gdHJ1ZTsKICAgICAgdmFyIHBhcmFtcyA9IHsKICAgICAgICBwYWdlTnVtOiB0aGlzLnBhZ2VOdW0sCiAgICAgICAgcGFnZVNpemU6IHRoaXMucGFnZVNpemUKICAgICAgfTsKICAgICAgaWYgKHRoaXMuc2VhcmNoRm9ybS5tYyAmJiB0aGlzLnNlYXJjaEZvcm0ubWMudHJpbSgpKSBwYXJhbXMubWMgPSB0aGlzLnNlYXJjaEZvcm0ubWMudHJpbSgpOwogICAgICAoMCwgX2pvaW50VHJhaW5pbmcubGlzdEpvaW50VHJhaW5pbmcpKHBhcmFtcykudGhlbihmdW5jdGlvbiAocmVzKSB7CiAgICAgICAgdmFyIGRhdGEgPSByZXMgJiYgcmVzLmRhdGEgfHwge307CiAgICAgICAgX3RoaXMudGFibGVEYXRhID0gZGF0YS5yZWNvcmRzIHx8IFtdOwogICAgICAgIF90aGlzLnRvdGFsID0gZGF0YS50b3RhbCB8fCAwOwogICAgICAgIF90aGlzLnRhYmxlTG9hZGluZyA9IGZhbHNlOwogICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgX3RoaXMudGFibGVEYXRhID0gW107CiAgICAgICAgX3RoaXMudG90YWwgPSAwOwogICAgICAgIF90aGlzLnRhYmxlTG9hZGluZyA9IGZhbHNlOwogICAgICB9KTsKICAgIH0sCiAgICBoYW5kbGVRdWVyeTogZnVuY3Rpb24gaGFuZGxlUXVlcnkoKSB7CiAgICAgIHRoaXMucGFnZU51bSA9IDE7CiAgICAgIHRoaXMuZmV0Y2hMaXN0KCk7CiAgICB9LAogICAgaGFuZGxlUGFnZUNoYW5nZTogZnVuY3Rpb24gaGFuZGxlUGFnZUNoYW5nZShwYWdlKSB7CiAgICAgIHRoaXMucGFnZU51bSA9IHBhZ2U7CiAgICAgIHRoaXMuZmV0Y2hMaXN0KCk7CiAgICB9LAogICAgaGFuZGxlU2l6ZUNoYW5nZTogZnVuY3Rpb24gaGFuZGxlU2l6ZUNoYW5nZShzaXplKSB7CiAgICAgIHRoaXMucGFnZVNpemUgPSBzaXplOwogICAgICB0aGlzLnBhZ2VOdW0gPSAxOwogICAgICB0aGlzLmZldGNoTGlzdCgpOwogICAgfSwKICAgIC8qKiDml6XmnJ/ml7bpl7TmmL7npLrvvIjljrvmjokgVOOAgeaIquaWreWIsOWIhumSn++8iSAqL2ZtdERhdGVUaW1lOiBmdW5jdGlvbiBmbXREYXRlVGltZShyb3csIGNvbHVtbiwgY2VsbFZhbHVlKSB7CiAgICAgIGlmIChjZWxsVmFsdWUgPT09IG51bGwgfHwgY2VsbFZhbHVlID09PSB1bmRlZmluZWQgfHwgY2VsbFZhbHVlID09PSAnJykgcmV0dXJuICctJzsKICAgICAgcmV0dXJuIFN0cmluZyhjZWxsVmFsdWUpLnJlcGxhY2UoJ1QnLCAnICcpLnNsaWNlKDAsIDE2KTsKICAgIH0sCiAgICAvKiog56m65YC85pi+56S65Li6ICctJyAqL2ZtdEVtcHR5OiBmdW5jdGlvbiBmbXRFbXB0eSh2YWwpIHsKICAgICAgcmV0dXJuIHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCB8fCB2YWwgPT09ICcnID8gJy0nIDogdmFsOwogICAgfSwKICAgIC8qKiDmlbDlgLznqbrlgLzmmL7npLrkuLogJy0n77yI5L+d55WZIDDvvIkgKi9mbXRWYWx1ZTogZnVuY3Rpb24gZm10VmFsdWUodmFsKSB7CiAgICAgIHJldHVybiB2YWwgPT09IG51bGwgfHwgdmFsID09PSB1bmRlZmluZWQgPyAnLScgOiB2YWw7CiAgICB9LAogICAgLy8gPT09PT09PT09PT09PT09PT09PT0g5paw5aKeIC8g5L+u5pS5ID09PT09PT09PT09PT09PT09PT09CiAgICBoYW5kbGVBZGQ6IGZ1bmN0aW9uIGhhbmRsZUFkZCgpIHsKICAgICAgdGhpcy5mb3JtID0gdGhpcy5jcmVhdGVFbXB0eUZvcm0oKTsKICAgICAgdGhpcy5kaWFsb2dUaXRsZSA9ICfmlrDlop7ogZTmlZnogZTorq0nOwogICAgICB0aGlzLmRpYWxvZ1Zpc2libGUgPSB0cnVlOwogICAgfSwKICAgIGhhbmRsZUVkaXQ6IGZ1bmN0aW9uIGhhbmRsZUVkaXQocm93KSB7CiAgICAgIHZhciBfdGhpczIgPSB0aGlzOwogICAgICAoMCwgX2pvaW50VHJhaW5pbmcuZ2V0Sm9pbnRUcmFpbmluZykocm93LmJoKS50aGVuKGZ1bmN0aW9uIChyZXMpIHsKICAgICAgICB2YXIgZCA9IHJlcyAmJiByZXMuZGF0YSB8fCB7fTsKICAgICAgICBfdGhpczIuZm9ybSA9IHsKICAgICAgICAgIGJoOiBkLmJoIHx8ICcnLAogICAgICAgICAgbWM6IGQubWMgfHwgJycsCiAgICAgICAgICB4ejogZC54eiB8fCAnJywKICAgICAgICAgIHlqOiBkLnlqIHx8ICcnLAogICAgICAgICAga3NycTogX3RoaXMyLm5vcm1hbGl6ZURhdGVUaW1lKGQua3NycSksCiAgICAgICAgICBqc3JxOiBfdGhpczIubm9ybWFsaXplRGF0ZVRpbWUoZC5qc3JxKSwKICAgICAgICAgIHRzOiBkLnRzID09PSBudWxsIHx8IGQudHMgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBkLnRzLAogICAgICAgICAgamJrc2w6IGQuamJrc2wgPT09IG51bGwgfHwgZC5qYmtzbCA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGQuamJrc2wsCiAgICAgICAgICBrc2x4OiBkLmtzbHggfHwgJycsCiAgICAgICAgICB4bWx4OiBkLnhtbHggfHwgJycsCiAgICAgICAgICBzbTogZC5zbSB8fCAnJywKICAgICAgICAgIGJ6OiBkLmJ6IHx8ICcnCiAgICAgICAgfTsKICAgICAgICBfdGhpczIuZGlhbG9nVGl0bGUgPSAn5L+u5pS56IGU5pWZ6IGU6K6tJzsKICAgICAgICBfdGhpczIuZGlhbG9nVmlzaWJsZSA9IHRydWU7CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHt9KTsKICAgIH0sCiAgICBoYW5kbGVTdWJtaXQ6IGZ1bmN0aW9uIGhhbmRsZVN1Ym1pdCgpIHsKICAgICAgdmFyIF90aGlzMyA9IHRoaXM7CiAgICAgIHRoaXMuJHJlZnMuZm9ybVJlZi52YWxpZGF0ZShmdW5jdGlvbiAodmFsaWQpIHsKICAgICAgICBpZiAoIXZhbGlkKSB7CiAgICAgICAgICBfdGhpczMuJG1lc3NhZ2Uud2FybmluZygn6K+35a6M5ZaE5b+F5aGr6aG55ZCO5YaN5o+Q5LqkJyk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHZhciBwYXlsb2FkID0gX3RoaXMzLmJ1aWxkUGF5bG9hZCgpOwogICAgICAgIF90aGlzMy5zYXZpbmcgPSB0cnVlOwogICAgICAgIHZhciByZXEgPSBwYXlsb2FkLmJoID8gKDAsIF9qb2ludFRyYWluaW5nLnVwZGF0ZUpvaW50VHJhaW5pbmcpKHBheWxvYWQpIDogKDAsIF9qb2ludFRyYWluaW5nLmFkZEpvaW50VHJhaW5pbmcpKHBheWxvYWQpOwogICAgICAgIHJlcS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgIF90aGlzMy4kbWVzc2FnZS5zdWNjZXNzKF90aGlzMy5kaWFsb2dUaXRsZSA9PT0gJ+S/ruaUueiBlOaVmeiBlOiurScgPyAn5L+u5pS55oiQ5YqfJyA6ICfmlrDlop7miJDlip8nKTsKICAgICAgICAgIF90aGlzMy5kaWFsb2dWaXNpYmxlID0gZmFsc2U7CiAgICAgICAgICBfdGhpczMuZmV0Y2hMaXN0KCk7CiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKCkge30pLmZpbmFsbHkoZnVuY3Rpb24gKCkgewogICAgICAgICAgX3RoaXMzLnNhdmluZyA9IGZhbHNlOwogICAgICAgIH0pOwogICAgICB9KTsKICAgIH0sCiAgICAvKiog5p6E5bu66K+35rGC5L2T77yM5LuF5ZCr5a6e5L2T6Z2e56m65a2X5q6177yI5Yib5bu6L+S/ruaUueaXtumXtOS4uuWQjuerr+iHquWKqOe7tOaKpO+8jOS4jeS8oO+8iSAqL2J1aWxkUGF5bG9hZDogZnVuY3Rpb24gYnVpbGRQYXlsb2FkKCkgewogICAgICB2YXIgZiA9IHRoaXMuZm9ybTsKICAgICAgdmFyIHBheWxvYWQgPSB7fTsKICAgICAgaWYgKGYuYmggJiYgZi5iaC50cmltKCkpIHBheWxvYWQuYmggPSBmLmJoLnRyaW0oKTsKICAgICAgaWYgKGYubWMgJiYgZi5tYy50cmltKCkpIHBheWxvYWQubWMgPSBmLm1jLnRyaW0oKTsKICAgICAgaWYgKGYueHogJiYgZi54ei50cmltKCkpIHBheWxvYWQueHogPSBmLnh6LnRyaW0oKTsKICAgICAgaWYgKGYueWogJiYgZi55ai50cmltKCkpIHBheWxvYWQueWogPSBmLnlqLnRyaW0oKTsKICAgICAgaWYgKGYua3NycSkgcGF5bG9hZC5rc3JxID0gZi5rc3JxOwogICAgICBpZiAoZi5qc3JxKSBwYXlsb2FkLmpzcnEgPSBmLmpzcnE7CiAgICAgIGlmIChmLnRzICE9PSBudWxsICYmIGYudHMgIT09IHVuZGVmaW5lZCkgcGF5bG9hZC50cyA9IGYudHM7CiAgICAgIGlmIChmLmpia3NsICE9PSBudWxsICYmIGYuamJrc2wgIT09IHVuZGVmaW5lZCkgcGF5bG9hZC5qYmtzbCA9IGYuamJrc2w7CiAgICAgIGlmIChmLmtzbHggJiYgZi5rc2x4LnRyaW0oKSkgcGF5bG9hZC5rc2x4ID0gZi5rc2x4LnRyaW0oKTsKICAgICAgaWYgKGYueG1seCAmJiBmLnhtbHgudHJpbSgpKSBwYXlsb2FkLnhtbHggPSBmLnhtbHgudHJpbSgpOwogICAgICBpZiAoZi5zbSAmJiBmLnNtLnRyaW0oKSkgcGF5bG9hZC5zbSA9IGYuc20udHJpbSgpOwogICAgICBpZiAoZi5ieiAmJiBmLmJ6LnRyaW0oKSkgcGF5bG9hZC5ieiA9IGYuYnoudHJpbSgpOwogICAgICByZXR1cm4gcGF5bG9hZDsKICAgIH0sCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PSDliKDpmaQgPT09PT09PT09PT09PT09PT09PT0KICAgIGhhbmRsZURlbGV0ZTogZnVuY3Rpb24gaGFuZGxlRGVsZXRlKHJvdykgewogICAgICB2YXIgX3RoaXM0ID0gdGhpczsKICAgICAgdGhpcy4kY29uZmlybSgiXHU3ODZFXHU1QjlBXHU4OTgxXHU1MjIwXHU5NjY0XHUzMDBDIi5jb25jYXQocm93Lm1jIHx8IHJvdy5iaCB8fCAn6K+l6K6w5b2VJywgIlx1MzAwRFx1NTQxN1x1RkYxRiIpLCAn57O757uf5o+Q56S6JywgewogICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiAn56Gu5a6aJywKICAgICAgICBjYW5jZWxCdXR0b25UZXh0OiAn5Y+W5raIJywKICAgICAgICB0eXBlOiAnd2FybmluZycKICAgICAgfSkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuICgwLCBfam9pbnRUcmFpbmluZy5kZWxldGVKb2ludFRyYWluaW5nKShyb3cuYmgpOwogICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICBfdGhpczQuJG1lc3NhZ2Uuc3VjY2Vzcygn5Yig6Zmk5oiQ5YqfJyk7CiAgICAgICAgX3RoaXM0LmZldGNoTGlzdCgpOwogICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7fSk7CiAgICB9LAogICAgLy8gPT09PT09PT09PT09PT09PT09PT0g6K+m5oOFID09PT09PT09PT09PT09PT09PT09CiAgICBoYW5kbGVEZXRhaWw6IGZ1bmN0aW9uIGhhbmRsZURldGFpbChyb3cpIHsKICAgICAgdmFyIF90aGlzNSA9IHRoaXM7CiAgICAgICgwLCBfam9pbnRUcmFpbmluZy5nZXRKb2ludFRyYWluaW5nKShyb3cuYmgpLnRoZW4oZnVuY3Rpb24gKHJlcykgewogICAgICAgIF90aGlzNS5kZXRhaWxEYXRhID0gcmVzICYmIHJlcy5kYXRhIHx8IHt9OwogICAgICAgIF90aGlzNS5kZXRhaWxWaXNpYmxlID0gdHJ1ZTsKICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKCkge30pOwogICAgfSwKICAgIC8vID09PT09PT09PT09PT09PT09PT09IOWvvOWHuiA9PT09PT09PT09PT09PT09PT09PQogICAgaGFuZGxlRXhwb3J0OiBmdW5jdGlvbiBoYW5kbGVFeHBvcnQoKSB7CiAgICAgIHZhciBfdGhpczYgPSB0aGlzOwogICAgICAoMCwgX2pvaW50VHJhaW5pbmcuZXhwb3J0Sm9pbnRUcmFpbmluZykoKS50aGVuKGZ1bmN0aW9uIChibG9iKSB7CiAgICAgICAgKDAsIF9maWxlU2F2ZXIuc2F2ZUFzKShibG9iLCAn6IGU5pWZ6IGU6K6t566h55CGLnhsc3gnKTsKICAgICAgICBfdGhpczYuJG1lc3NhZ2Uuc3VjY2Vzcygn5a+85Ye65oiQ5YqfJyk7CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHt9KTsKICAgIH0sCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PSDmlofku7bpgInmi6nkuI7lr7zlhaUgPT09PT09PT09PT09PT09PT09PT0KICAgIGhhbmRsZUNob29zZUZpbGU6IGZ1bmN0aW9uIGhhbmRsZUNob29zZUZpbGUoKSB7CiAgICAgIHRoaXMuJHJlZnMuZmlsZUlucHV0UmVmICYmIHRoaXMuJHJlZnMuZmlsZUlucHV0UmVmLmNsaWNrKCk7CiAgICB9LAogICAgaGFuZGxlRmlsZUNoYW5nZTogZnVuY3Rpb24gaGFuZGxlRmlsZUNoYW5nZShlKSB7CiAgICAgIHZhciBpbnB1dCA9IGUudGFyZ2V0OwogICAgICB0aGlzLnNlbGVjdGVkRmlsZSA9IGlucHV0LmZpbGVzICYmIGlucHV0LmZpbGVzWzBdIHx8IG51bGw7CiAgICB9LAogICAgaGFuZGxlVXBsb2FkOiBmdW5jdGlvbiBoYW5kbGVVcGxvYWQoKSB7CiAgICAgIHZhciBfdGhpczcgPSB0aGlzOwogICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRGaWxlKSB7CiAgICAgICAgdGhpcy4kbWVzc2FnZS53YXJuaW5nKCfor7flhYjpgInmi6nmlofku7YnKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdGhpcy51cGxvYWRpbmcgPSB0cnVlOwogICAgICAoMCwgX2pvaW50VHJhaW5pbmcuaW1wb3J0Sm9pbnRUcmFpbmluZykodGhpcy5zZWxlY3RlZEZpbGUpLnRoZW4oZnVuY3Rpb24gKHJlcykgewogICAgICAgIHZhciBjb3VudCA9IHJlcyAmJiByZXMuZGF0YTsKICAgICAgICBpZiAoY291bnQgIT09IG51bGwgJiYgY291bnQgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgX3RoaXM3LiRtZXNzYWdlLnN1Y2Nlc3MoIlx1NUJGQ1x1NTE2NVx1NjIxMFx1NTI5Rlx1RkYwQ1x1NTE3MSAiLmNvbmNhdChjb3VudCwgIiBcdTY3NjFcdThCQjBcdTVGNTUiKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIF90aGlzNy4kbWVzc2FnZS5zdWNjZXNzKHJlcyAmJiByZXMubXNnIHx8ICflr7zlhaXmiJDlip8nKTsKICAgICAgICB9CiAgICAgICAgX3RoaXM3LnNlbGVjdGVkRmlsZSA9IG51bGw7CiAgICAgICAgX3RoaXM3LiRyZWZzLmZpbGVJbnB1dFJlZiAmJiAoX3RoaXM3LiRyZWZzLmZpbGVJbnB1dFJlZi52YWx1ZSA9ICcnKTsKICAgICAgICBfdGhpczcucGFnZU51bSA9IDE7CiAgICAgICAgX3RoaXM3LmZldGNoTGlzdCgpOwogICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7fSkuZmluYWxseShmdW5jdGlvbiAoKSB7CiAgICAgICAgX3RoaXM3LnVwbG9hZGluZyA9IGZhbHNlOwogICAgICB9KTsKICAgIH0sCiAgICBoYW5kbGVEb3dubG9hZFRlbXBsYXRlOiBmdW5jdGlvbiBoYW5kbGVEb3dubG9hZFRlbXBsYXRlKCkgewogICAgICAvLyDlkI7nq6/mmoLmnKrmj5DkvpvmqKHmnb/kuIvovb3mjqXlj6PvvIzku4XkvZzmj5DnpLoKICAgICAgdGhpcy4kbWVzc2FnZS5pbmZvKCflkI7nq6/mmoLmnKrmj5Dkvpvor6XmjqXlj6MnKTsKICAgIH0KICB9Cn07"},{"version":3,"names":["_fileSaver","require","_jointTraining","name","data","searchForm","mc","selectedFile","uploading","tableLoading","tableData","pageNum","pageSize","total","dialogVisible","dialogTitle","saving","form","createEmptyForm","rules","required","message","trigger","detailVisible","detailData","computed","fileName","mounted","fetchList","methods","bh","xz","yj","ksrq","jsrq","ts","jbksl","kslx","xmlx","sm","bz","normalizeDateTime","val","String","replace","slice","_this","params","trim","listJointTraining","then","res","records","catch","handleQuery","handlePageChange","page","handleSizeChange","size","fmtDateTime","row","column","cellValue","undefined","fmtEmpty","fmtValue","handleAdd","handleEdit","_this2","getJointTraining","d","handleSubmit","_this3","$refs","formRef","validate","valid","$message","warning","payload","buildPayload","req","updateJointTraining","addJointTraining","success","finally","f","handleDelete","_this4","$confirm","concat","confirmButtonText","cancelButtonText","type","deleteJointTraining","handleDetail","_this5","handleExport","_this6","exportJointTraining","blob","saveAs","handleChooseFile","fileInputRef","click","handleFileChange","e","input","target","files","handleUpload","_this7","importJointTraining","count","msg","value","handleDownloadTemplate","info"],"sources":["src/views/classHour/jointTraining/index.vue"],"sourcesContent":["<template>\r\n <div class=\"app-container joint-training-page\">\r\n <div class=\"list-title\">联教联训管理</div>\r\n\r\n <!-- ==================== 1. 查询条件区域 ==================== -->\r\n <el-card shadow=\"never\" class=\"search-card\">\r\n <el-form :model=\"searchForm\" label-width=\"40px\" class=\"search-form\">\r\n <el-row :gutter=\"6\">\r\n <el-col :span=\"4\">\r\n <el-form-item label=\"名称\">\r\n <el-input v-model=\"searchForm.mc\" placeholder=\"请输入名称\" clearable @keyup.enter.native=\"handleQuery\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"2\">\r\n <div class=\"search-actions\">\r\n <el-button type=\"primary\" @click=\"handleQuery\">查询</el-button>\r\n </div>\r\n </el-col>\r\n </el-row>\r\n </el-form>\r\n </el-card>\r\n\r\n <!-- ==================== 2. 操作区域 ==================== -->\r\n <el-card shadow=\"never\" class=\"upload-card\">\r\n <div class=\"upload-row\">\r\n <div class=\"upload-left\">\r\n <el-button type=\"primary\" @click=\"handleAdd\">新增联教联训</el-button>\r\n <el-button icon=\"el-icon-download\" @click=\"handleExport\">导出 Excel</el-button>\r\n <el-button icon=\"el-icon-download\" @click=\"handleDownloadTemplate\">【联教联训数据文件模板】下载</el-button>\r\n <el-button icon=\"el-icon-folder-opened\" @click=\"handleChooseFile\">选择文件</el-button>\r\n <span class=\"file-name\" :class=\"{ 'has-file': selectedFile }\">{{ fileName }}</span>\r\n <input ref=\"fileInputRef\" type=\"file\" accept=\".xls,.xlsx\" style=\"display: none\" @change=\"handleFileChange\" />\r\n <el-button type=\"primary\" icon=\"el-icon-upload2\" :loading=\"uploading\" @click=\"handleUpload\">上传数据</el-button>\r\n </div>\r\n </div>\r\n </el-card>\r\n\r\n <!-- ==================== 3. 数据表格 ==================== -->\r\n <el-card shadow=\"never\" class=\"table-card\">\r\n <div class=\"table-title\">联教联训记录列表</div>\r\n <el-table v-loading=\"tableLoading\" :data=\"tableData\" border stripe style=\"width: 100%\">\r\n <el-table-column type=\"index\" label=\"序号\" width=\"55\" align=\"center\" />\r\n <el-table-column prop=\"bh\" label=\"编号\" width=\"150\" align=\"center\" show-overflow-tooltip />\r\n <el-table-column prop=\"mc\" label=\"名称\" min-width=\"140\" show-overflow-tooltip />\r\n <el-table-column prop=\"xz\" label=\"性质\" width=\"80\" align=\"center\" show-overflow-tooltip />\r\n <el-table-column prop=\"yj\" label=\"依据\" width=\"110\" align=\"center\" show-overflow-tooltip />\r\n <el-table-column prop=\"ksrq\" label=\"开始日期\" width=\"110\" align=\"center\" :formatter=\"fmtDateTime\" />\r\n <el-table-column prop=\"jsrq\" label=\"结束日期\" width=\"110\" align=\"center\" :formatter=\"fmtDateTime\" />\r\n <el-table-column prop=\"ts\" label=\"天数\" width=\"70\" align=\"center\" />\r\n <el-table-column prop=\"jbksl\" label=\"基本课时量\" width=\"90\" align=\"center\" />\r\n <el-table-column prop=\"kslx\" label=\"课时类型\" width=\"80\" align=\"center\" show-overflow-tooltip />\r\n <el-table-column prop=\"xmlx\" label=\"项目类型\" width=\"80\" align=\"center\" show-overflow-tooltip />\r\n <el-table-column prop=\"sm\" label=\"说明\" min-width=\"120\" show-overflow-tooltip />\r\n <el-table-column prop=\"bz\" label=\"备注\" min-width=\"120\" show-overflow-tooltip />\r\n <el-table-column label=\"操作\" width=\"160\" align=\"center\" fixed=\"right\">\r\n <template slot-scope=\"{ row }\">\r\n <el-button type=\"text\" size=\"small\" @click=\"handleDetail(row)\">详情</el-button>\r\n <el-button type=\"text\" size=\"small\" @click=\"handleEdit(row)\">修改</el-button>\r\n <el-button type=\"text\" size=\"small\" class=\"text-danger\" @click=\"handleDelete(row)\">删除</el-button>\r\n </template>\r\n </el-table-column>\r\n </el-table>\r\n\r\n <el-pagination\r\n :current-page=\"pageNum\"\r\n :page-size=\"pageSize\"\r\n :total=\"total\"\r\n :page-sizes=\"[10, 20, 50, 100]\"\r\n layout=\"total, sizes, prev, pager, next, jumper\"\r\n class=\"pagination\"\r\n @current-change=\"handlePageChange\"\r\n @size-change=\"handleSizeChange\"\r\n />\r\n </el-card>\r\n\r\n <!-- ==================== 4. 新增/修改对话框 ==================== -->\r\n <el-dialog\r\n :visible=\"dialogVisible\"\r\n :title=\"dialogTitle\"\r\n width=\"720px\"\r\n :close-on-click-modal=\"false\"\r\n @update:visible=\"val => dialogVisible = val\"\r\n >\r\n <el-form ref=\"formRef\" :model=\"form\" :rules=\"rules\" label-width=\"110px\" class=\"add-form\">\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"编号\">\r\n <el-input v-model=\"form.bh\" placeholder=\"留空则自动生成\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"名称\" prop=\"mc\">\r\n <el-input v-model=\"form.mc\" placeholder=\"请输入名称\" clearable />\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-input v-model=\"form.xz\" placeholder=\"请输入性质\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"依据\">\r\n <el-input v-model=\"form.yj\" placeholder=\"请输入依据\" clearable />\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=\"form.ksrq\" type=\"datetime\" value-format=\"yyyy-MM-dd HH:mm:ss\" placeholder=\"请选择开始日期\" clearable class=\"w-full\" />\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=\"form.jsrq\" type=\"datetime\" value-format=\"yyyy-MM-dd HH:mm:ss\" placeholder=\"请选择结束日期\" clearable class=\"w-full\" />\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-input-number v-model=\"form.ts\" :min=\"0\" :precision=\"1\" :step=\"1\" class=\"w-full\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"基本课时量\">\r\n <el-input-number v-model=\"form.jbksl\" :min=\"0\" :precision=\"1\" :step=\"0.5\" class=\"w-full\" />\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-input v-model=\"form.kslx\" placeholder=\"请输入课时类型\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"项目类型\">\r\n <el-input v-model=\"form.xmlx\" placeholder=\"请输入项目类型\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-form-item label=\"说明\">\r\n <el-input v-model=\"form.sm\" type=\"textarea\" :rows=\"2\" placeholder=\"请输入说明\" />\r\n </el-form-item>\r\n <el-form-item label=\"备注\">\r\n <el-input v-model=\"form.bz\" type=\"textarea\" :rows=\"2\" placeholder=\"请输入备注\" />\r\n </el-form-item>\r\n </el-form>\r\n <div slot=\"footer\">\r\n <el-button @click=\"dialogVisible = false\">取消</el-button>\r\n <el-button type=\"primary\" :loading=\"saving\" @click=\"handleSubmit\">确定</el-button>\r\n </div>\r\n </el-dialog>\r\n\r\n <!-- ==================== 5. 详情对话框 ==================== -->\r\n <el-dialog :visible=\"detailVisible\" title=\"联教联训详情\" width=\"640px\" @update:visible=\"val => detailVisible = val\">\r\n <el-descriptions :column=\"2\" border>\r\n <el-descriptions-item label=\"编号\">{{ detailData.bh }}</el-descriptions-item>\r\n <el-descriptions-item label=\"名称\">{{ detailData.mc }}</el-descriptions-item>\r\n <el-descriptions-item label=\"性质\">{{ fmtEmpty(detailData.xz) }}</el-descriptions-item>\r\n <el-descriptions-item label=\"依据\">{{ fmtEmpty(detailData.yj) }}</el-descriptions-item>\r\n <el-descriptions-item label=\"开始日期\">{{ fmtDateTime(null, null, detailData.ksrq) }}</el-descriptions-item>\r\n <el-descriptions-item label=\"结束日期\">{{ fmtDateTime(null, null, detailData.jsrq) }}</el-descriptions-item>\r\n <el-descriptions-item label=\"天数\">{{ fmtValue(detailData.ts) }}</el-descriptions-item>\r\n <el-descriptions-item label=\"基本课时量\">{{ fmtValue(detailData.jbksl) }}</el-descriptions-item>\r\n <el-descriptions-item label=\"课时类型\">{{ fmtEmpty(detailData.kslx) }}</el-descriptions-item>\r\n <el-descriptions-item label=\"项目类型\">{{ fmtEmpty(detailData.xmlx) }}</el-descriptions-item>\r\n <el-descriptions-item label=\"说明\" :span=\"2\">{{ fmtEmpty(detailData.sm) }}</el-descriptions-item>\r\n <el-descriptions-item label=\"备注\" :span=\"2\">{{ fmtEmpty(detailData.bz) }}</el-descriptions-item>\r\n </el-descriptions>\r\n <div slot=\"footer\">\r\n <el-button @click=\"detailVisible = false\">关闭</el-button>\r\n </div>\r\n </el-dialog>\r\n </div>\r\n</template>\r\n\r\n<script>\r\nimport { saveAs } from 'file-saver'\r\nimport {\r\n listJointTraining,\r\n addJointTraining,\r\n updateJointTraining,\r\n deleteJointTraining,\r\n getJointTraining,\r\n importJointTraining,\r\n exportJointTraining\r\n} from '@/api/classHour/jointTraining'\r\n\r\nexport default {\r\n name: 'JointTrainingIndex',\r\n data() {\r\n return {\r\n // ==================== 1. 查询条件 ====================\r\n searchForm: {\r\n mc: ''\r\n },\r\n\r\n // ==================== 2. 文件操作 ====================\r\n selectedFile: null,\r\n uploading: false,\r\n\r\n // ==================== 3. 表格数据 ====================\r\n tableLoading: false,\r\n tableData: [],\r\n pageNum: 1,\r\n pageSize: 10,\r\n total: 0,\r\n\r\n // ==================== 4. 新增/修改表单 ====================\r\n dialogVisible: false,\r\n dialogTitle: '新增联教联训',\r\n saving: false,\r\n form: this.createEmptyForm(),\r\n rules: {\r\n mc: [{ required: true, message: '请输入名称', trigger: 'blur' }]\r\n },\r\n\r\n // ==================== 5. 详情 ====================\r\n detailVisible: false,\r\n detailData: {}\r\n }\r\n },\r\n computed: {\r\n fileName() {\r\n return (this.selectedFile && this.selectedFile.name) || '未选择任何文件'\r\n }\r\n },\r\n mounted() {\r\n this.fetchList()\r\n },\r\n methods: {\r\n createEmptyForm() {\r\n return {\r\n bh: '',\r\n mc: '',\r\n xz: '',\r\n yj: '',\r\n ksrq: '',\r\n jsrq: '',\r\n ts: null,\r\n jbksl: null,\r\n kslx: '',\r\n xmlx: '',\r\n sm: '',\r\n bz: ''\r\n }\r\n },\r\n\r\n /** 把后端 LocalDateTime(含 T/毫秒)规范为表单可回显的格式 */\r\n normalizeDateTime(val) {\r\n if (!val) return ''\r\n return String(val).replace('T', ' ').replace(/\\.\\d+$/, '').slice(0, 19)\r\n },\r\n\r\n // ==================== 查询 ====================\r\n fetchList() {\r\n this.tableLoading = true\r\n const params = { pageNum: this.pageNum, pageSize: this.pageSize }\r\n if (this.searchForm.mc && this.searchForm.mc.trim()) params.mc = this.searchForm.mc.trim()\r\n listJointTraining(params).then(res => {\r\n const data = (res && res.data) || {}\r\n this.tableData = data.records || []\r\n this.total = data.total || 0\r\n this.tableLoading = false\r\n }).catch(() => {\r\n this.tableData = []\r\n this.total = 0\r\n this.tableLoading = false\r\n })\r\n },\r\n\r\n handleQuery() {\r\n this.pageNum = 1\r\n this.fetchList()\r\n },\r\n\r\n handlePageChange(page) {\r\n this.pageNum = page\r\n this.fetchList()\r\n },\r\n\r\n handleSizeChange(size) {\r\n this.pageSize = size\r\n this.pageNum = 1\r\n this.fetchList()\r\n },\r\n\r\n /** 日期时间显示(去掉 T、截断到分钟) */\r\n fmtDateTime(row, column, cellValue) {\r\n if (cellValue === null || cellValue === undefined || cellValue === '') return '-'\r\n return String(cellValue).replace('T', ' ').slice(0, 16)\r\n },\r\n\r\n /** 空值显示为 '-' */\r\n fmtEmpty(val) {\r\n return val === null || val === undefined || val === '' ? '-' : val\r\n },\r\n\r\n /** 数值空值显示为 '-'(保留 0) */\r\n fmtValue(val) {\r\n return val === null || val === undefined ? '-' : val\r\n },\r\n\r\n // ==================== 新增 / 修改 ====================\r\n handleAdd() {\r\n this.form = this.createEmptyForm()\r\n this.dialogTitle = '新增联教联训'\r\n this.dialogVisible = true\r\n },\r\n\r\n handleEdit(row) {\r\n getJointTraining(row.bh).then(res => {\r\n const d = (res && res.data) || {}\r\n this.form = {\r\n bh: d.bh || '',\r\n mc: d.mc || '',\r\n xz: d.xz || '',\r\n yj: d.yj || '',\r\n ksrq: this.normalizeDateTime(d.ksrq),\r\n jsrq: this.normalizeDateTime(d.jsrq),\r\n ts: d.ts === null || d.ts === undefined ? null : d.ts,\r\n jbksl: d.jbksl === null || d.jbksl === undefined ? null : d.jbksl,\r\n kslx: d.kslx || '',\r\n xmlx: d.xmlx || '',\r\n sm: d.sm || '',\r\n bz: d.bz || ''\r\n }\r\n this.dialogTitle = '修改联教联训'\r\n this.dialogVisible = true\r\n }).catch(() => {})\r\n },\r\n\r\n handleSubmit() {\r\n this.$refs.formRef.validate(valid => {\r\n if (!valid) {\r\n this.$message.warning('请完善必填项后再提交')\r\n return\r\n }\r\n const payload = this.buildPayload()\r\n this.saving = true\r\n const req = payload.bh ? updateJointTraining(payload) : addJointTraining(payload)\r\n req.then(() => {\r\n this.$message.success(this.dialogTitle === '修改联教联训' ? '修改成功' : '新增成功')\r\n this.dialogVisible = false\r\n this.fetchList()\r\n }).catch(() => {}).finally(() => {\r\n this.saving = false\r\n })\r\n })\r\n },\r\n\r\n /** 构建请求体,仅含实体非空字段(创建/修改时间为后端自动维护,不传) */\r\n buildPayload() {\r\n const f = this.form\r\n const payload = {}\r\n if (f.bh && f.bh.trim()) payload.bh = f.bh.trim()\r\n if (f.mc && f.mc.trim()) payload.mc = f.mc.trim()\r\n if (f.xz && f.xz.trim()) payload.xz = f.xz.trim()\r\n if (f.yj && f.yj.trim()) payload.yj = f.yj.trim()\r\n if (f.ksrq) payload.ksrq = f.ksrq\r\n if (f.jsrq) payload.jsrq = f.jsrq\r\n if (f.ts !== null && f.ts !== undefined) payload.ts = f.ts\r\n if (f.jbksl !== null && f.jbksl !== undefined) payload.jbksl = f.jbksl\r\n if (f.kslx && f.kslx.trim()) payload.kslx = f.kslx.trim()\r\n if (f.xmlx && f.xmlx.trim()) payload.xmlx = f.xmlx.trim()\r\n if (f.sm && f.sm.trim()) payload.sm = f.sm.trim()\r\n if (f.bz && f.bz.trim()) payload.bz = f.bz.trim()\r\n return payload\r\n },\r\n\r\n // ==================== 删除 ====================\r\n handleDelete(row) {\r\n this.$confirm(`确定要删除「${row.mc || row.bh || '该记录'}」吗?`, '系统提示', {\r\n confirmButtonText: '确定',\r\n cancelButtonText: '取消',\r\n type: 'warning'\r\n }).then(() => deleteJointTraining(row.bh)).then(() => {\r\n this.$message.success('删除成功')\r\n this.fetchList()\r\n }).catch(() => {})\r\n },\r\n\r\n // ==================== 详情 ====================\r\n handleDetail(row) {\r\n getJointTraining(row.bh).then(res => {\r\n this.detailData = (res && res.data) || {}\r\n this.detailVisible = true\r\n }).catch(() => {})\r\n },\r\n\r\n // ==================== 导出 ====================\r\n handleExport() {\r\n exportJointTraining().then(blob => {\r\n saveAs(blob, '联教联训管理.xlsx')\r\n this.$message.success('导出成功')\r\n }).catch(() => {})\r\n },\r\n\r\n // ==================== 文件选择与导入 ====================\r\n handleChooseFile() {\r\n this.$refs.fileInputRef && this.$refs.fileInputRef.click()\r\n },\r\n\r\n handleFileChange(e) {\r\n const input = e.target\r\n this.selectedFile = (input.files && input.files[0]) || null\r\n },\r\n\r\n handleUpload() {\r\n if (!this.selectedFile) {\r\n this.$message.warning('请先选择文件')\r\n return\r\n }\r\n this.uploading = true\r\n importJointTraining(this.selectedFile).then(res => {\r\n const count = res && res.data\r\n if (count !== null && count !== undefined) {\r\n this.$message.success(`导入成功,共 ${count} 条记录`)\r\n } else {\r\n this.$message.success((res && res.msg) || '导入成功')\r\n }\r\n this.selectedFile = null\r\n this.$refs.fileInputRef && (this.$refs.fileInputRef.value = '')\r\n this.pageNum = 1\r\n this.fetchList()\r\n }).catch(() => {}).finally(() => {\r\n this.uploading = false\r\n })\r\n },\r\n\r\n handleDownloadTemplate() {\r\n // 后端暂未提供模板下载接口,仅作提示\r\n this.$message.info('后端暂未提供该接口')\r\n }\r\n }\r\n}\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n.app-container {\r\n padding: 20px;\r\n}\r\n\r\n.joint-training-page {\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 // ==================== 1. 查询条件区域 ====================\r\n .search-card {\r\n margin-bottom: 16px;\r\n\r\n .search-form {\r\n .w-full {\r\n width: 100%;\r\n }\r\n\r\n .search-actions {\r\n display: flex;\r\n justify-content: flex-end;\r\n align-items: center;\r\n height: 40px;\r\n }\r\n }\r\n }\r\n\r\n // ==================== 2. 操作区域 ====================\r\n .upload-card {\r\n margin-bottom: 16px;\r\n\r\n .upload-row {\r\n display: flex;\r\n align-items: center;\r\n flex-wrap: wrap;\r\n gap: 12px;\r\n\r\n .upload-left {\r\n display: flex;\r\n align-items: center;\r\n gap: 12px;\r\n flex-wrap: wrap;\r\n\r\n .file-name {\r\n font-size: 12px;\r\n color: #909399;\r\n\r\n &.has-file {\r\n color: #303133;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // ==================== 3. 数据表格 ====================\r\n .table-card {\r\n margin-bottom: 16px;\r\n\r\n .table-title {\r\n font-size: 14px;\r\n font-weight: 600;\r\n color: #303133;\r\n margin-bottom: 12px;\r\n }\r\n\r\n .pagination {\r\n display: flex;\r\n justify-content: flex-end;\r\n margin-top: 12px;\r\n }\r\n\r\n .text-danger {\r\n color: #f56c6c;\r\n }\r\n }\r\n\r\n // ==================== 4. 新增/修改表单 ====================\r\n .add-form {\r\n max-height: 62vh;\r\n overflow-y: auto;\r\n padding-right: 4px;\r\n }\r\n}\r\n</style>\r\n"],"mappings":"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","ignoreList":[]}]}