1 line
20 KiB
JSON
1 line
20 KiB
JSON
{"remainingRequest":"/Users/shuguang/Desktop/毕设/CodeMaster/CodeMaster/node_modules/vue-loader/lib/index.js??vue-loader-options!/Users/shuguang/Desktop/毕设/CodeMaster/CodeMaster/src/components/common/UserImport.vue?vue&type=script&lang=js","dependencies":[{"path":"/Users/shuguang/Desktop/毕设/CodeMaster/CodeMaster/src/components/common/UserImport.vue","mtime":1742646402767},{"path":"/Users/shuguang/Desktop/毕设/CodeMaster/CodeMaster/node_modules/cache-loader/dist/cjs.js","mtime":1743264595665},{"path":"/Users/shuguang/Desktop/毕设/CodeMaster/CodeMaster/node_modules/babel-loader/lib/index.js","mtime":1743264596348},{"path":"/Users/shuguang/Desktop/毕设/CodeMaster/CodeMaster/node_modules/cache-loader/dist/cjs.js","mtime":1743264595665},{"path":"/Users/shuguang/Desktop/毕设/CodeMaster/CodeMaster/node_modules/vue-loader/lib/index.js","mtime":1743264596512}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:CmltcG9ydCB7IHVuaXEgfSBmcm9tICdsb2Rhc2gtZXMnOwppbXBvcnQgeyByZWFkRXhjZWwsIG1ha2VFeGNlbCB9IGZyb20gJ0AvdXRpbHMvZXhjZWwnOwppbXBvcnQgeyBzZXhlcywgZ3JhZGVzLCByYW5rcyx1c2VyUHJpdmlsZWdlcyB9IGZyb20gJ0AvdXRpbHMvY29uc3QnOwppbXBvcnQgRGlzcGxheUZhaWxlZFVzZXIgZnJvbSAnQC9jb21wb25lbnRzL2NvbW1vbi9EaXNwbGF5RmFpbGVkVXNlcic7CgovLyDmmKDlsITmgKfliKvjgIHlubTnuqfjgIHogYznp7AKY29uc3Qgc2V4ZXNSZXZlcnRNYXAgPSBtYXBSZXZlcnQoc2V4ZXMpOwpjb25zdCBncmFkZXNSZXZlcnRNYXAgPSBtYXBSZXZlcnQoZ3JhZGVzKTsKY29uc3QgcmFua1JldmVydE1hcCA9IG1hcFJldmVydChyYW5rcyk7CgpleHBvcnQgZGVmYXVsdCB7CiAgbmFtZTogJ1VzZXJJbXBvcnQnLAogIHByb3BzOiB7CiAgICB0eXBlOiB7CiAgICAgIGRlZmF1bHQ6ICdzdHVkZW50JywKICAgICAgcmVxdWlyZTogdHJ1ZSwKICAgICAgdmFsaWRhdG9yOiB2YWx1ZSA9PiBbJ3N0dWRlbnQnLCAndGVhY2hlciddLmluY2x1ZGVzKHZhbHVlKSwKICAgIH0sCiAgfSwKICBkYXRhKCkgewogICAgcmV0dXJuIHsKICAgICAgdmlzaWJsZTogZmFsc2UsIC8vIOaOp+WItiBNb2RhbCDmmL7npLov6ZqQ6JePCiAgICAgIHVwbG9hZGluZzogZmFsc2UsIC8vIOaOp+WItuS4iuS8oOeKtuaAgQogICAgICByZXN1bHQ6IFtdLCAvLyDkuIrkvKDnu5PmnpzmlbDmja4KICAgIH07CiAgfSwKICBjb21wdXRlZDogewogICAgcHJpbWFyeUtleSgpIHsKICAgICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gJ3N0dWRlbnQnID8gJ3NpZCcgOiAndGlkJzsgLy8g5Li76ZSuCiAgICB9LAogICAga2V5TWFwKCkgewogICAgICAvLyDmmKDlsITooajlpLTkuI7mlbDmja7lrZfmrrUKICAgICAgLy8g5a2m55Sf5ZKM5pWZ5biI55qE5pig5bCE5YWz57O7CiAgICBjb25zdCBzdHVkZW50TWFwID0gbmV3IE1hcChbCiAgICAgIFsn5a2m5Y+3JywgJ3N0aWQnXSwKICAgICAgWyflp5PlkI0nLCAndXNlck5hbWUnXSwKICAgICAgWyfmgKfliKsnLCAnZ2VuZGVyJ10sCiAgICAgIFsn6Lqr5Lu9JywgJ3VzZXJQcml2aWxlZ2VzJ10sCiAgICAgIFsn5a2m6ZmiJywgJ2NvbGxlZ2VJZCddLAogICAgICBbJ+eUn+aXpScsICdiaXJ0aGRhdGUnXSwKICAgICAgWyfmiYvmnLrlj7cnLCAncGhvbmUnXSwKICAgICAgWyfpgq7nrrEnLCAnZW1haWwnXSwKICAgIF0pOwoKICAgIGNvbnN0IHRlYWNoZXJNYXAgPSBuZXcgTWFwKFsKICAgICAgWyflt6Xlj7cnLCAnc3RpZCddLAogICAgICBbJ+Wnk+WQjScsICd1c2VyTmFtZSddLAogICAgICBbJ+aAp+WIqycsICdnZW5kZXInXSwKICAgICAgWyfouqvku70nLCAndXNlclByaXZpbGVnZXMnXSwKICAgICAgWyfogYznp7AnLCAndGVhY2hlclRpdGxlJ10sCiAgICAgIFsn5a2m6ZmiJywgJ2NvbGxlZ2VJZCddLAogICAgICBbJ+eUn+aXpScsICdiaXJ0aGRhdGUnXSwKICAgICAgWyfmiYvmnLrlj7cnLCAncGhvbmUnXSwKICAgICAgWyfpgq7nrrEnLCAnZW1haWwnXSwKICAgICAgWyflr4bnoIEnLCAndXNlclBhc3N3b3JkJ10sCiAgICAgIFsn54q25oCBJywgJ3VzZXJTdGF0dXMnXSwKICAgIF0pOwoJCS8vIOagueaNriBwcmltYXJ5S2V5IOmAieaLqeWvueW6lOeahOaYoOWwhOWFs+ezuwogICAgcmV0dXJuIHRoaXMucHJpbWFyeUtleSA9PT0gJ3NpZCcgPyBzdHVkZW50TWFwIDogdGVhY2hlck1hcDsKICAgIH0sCiAgICBjb2x1bW5zKCkgewogICAgICAvLyDnlJ/miJDooajmoLzliJfphY3nva4KICAgICAgY29uc3QgY29scyA9IFtdOwogICAgICBmb3IgKGNvbnN0IGtleSBvZiB0aGlzLmtleU1hcC5rZXlzKCkpIHsKICAgICAgICBjb2xzLnB1c2goewogICAgICAgICAgdGl0bGU6IGtleSwKICAgICAgICAgIGRhdGFJbmRleDoga2V5LAogICAgICAgIH0pOwogICAgICB9CiAgICAgIHJldHVybiBjb2xzOwogICAgfSwKCQl0cmFuc2Zvcm1lZERhdGEoKSB7CgkJCiAgLy8g6L2s5o2i5LiK5Lyg5pWw5o2uCiAgY29uc3QgZGF0YSA9IFtdOwogIGNvbnN0IHN0cmF0ZWd5ID0gewoJCWNvbGxlZ2VJZDogbGFiZWwgPT4gewogIC8vIOmBjeWOhiBncmFkZXMg5pWw57uE77yM5om+5Yiw5Yy56YWN55qEIGxhYmVs77yM5bm26L+U5Zue5a+55bqU55qEIHZhbHVl77yISUTvvIkKICBmb3IgKGNvbnN0IGdyYWRlIG9mIGdyYWRlcykgewogICAgaWYgKGdyYWRlLmxhYmVsID09IGxhYmVsKSB7CiAgICAgIHJldHVybiBncmFkZS52YWx1ZTsKICAgIH0KICB9CiAgLy8g5aaC5p6c5rKh5pyJ5Yy56YWN6aG577yM5YiZ6L+U5ZueIG51bGwg5oiW6ICF5YW25LuW6buY6K6k5YC877yM5Y+W5Yaz5LqO5L2g55qE6ZyA5rGCCiAgcmV0dXJuIG51bGw7Cn0sdXNlclByaXZpbGVnZXM6IGxhYmVsID0+IHsKICAvLyDpgY3ljoYgZ3JhZGVzIOaVsOe7hO+8jOaJvuWIsOWMuemFjeeahCBsYWJlbO+8jOW5tui/lOWbnuWvueW6lOeahCB2YWx1Ze+8iElE77yJCiAgZm9yIChjb25zdCB1c2VyUHJpdmlsZWdlIG9mIHVzZXJQcml2aWxlZ2VzKSB7CiAgICBpZiAodXNlclByaXZpbGVnZS5sYWJlbCA9PSBsYWJlbCkgewogICAgICByZXR1cm4gdXNlclByaXZpbGVnZS52YWx1ZTsKICAgIH0KICB9CiAgLy8g5aaC5p6c5rKh5pyJ5Yy56YWN6aG577yM5YiZ6L+U5ZueIG51bGwg5oiW6ICF5YW25LuW6buY6K6k5YC877yM5Y+W5Yaz5LqO5L2g55qE6ZyA5rGCCiAgcmV0dXJuIG51bGw7Cn0sCiAgIC8vIOaYoOWwhOeUn+aXpQogICAgYmlydGhkYXRlOiBsYWJlbCA9PiB7CiAgICAgIHJldHVybiBuZXcgRGF0ZSgobGFiZWwtMjU1NjkpICoyNCAqIDYwICo2MCAqMTAwMCk7CiAgICB9LCAvLyDop6PmnpDnlJ/ml6XlubbmoLzlvI/ljJbkuLrmjIflrprmoLzlvI8KICB9OwogIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLnJlc3VsdCkgewogICAgY29uc3QgdGVtcCA9IHt9OwogICAgZm9yIChsZXQgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGl0ZW0pKSB7CiAgICAgIGtleSA9IHRoaXMua2V5TWFwLmdldChrZXkudHJpbSgpKTsKICAgICAgY29uc3QgcmV2ZXJ0ID0gc3RyYXRlZ3lba2V5XTsKICAgICAgdGVtcFtrZXldID0gdHlwZW9mIHJldmVydCA9PT0gJ2Z1bmN0aW9uJwogICAgICAgID8gcmV2ZXJ0KHZhbHVlKQogICAgICAgIDogdmFsdWU7CiAgICB9CiAgICBkYXRhLnB1c2godGVtcCk7CiAgfQogIHJldHVybiBkYXRhOwp9LAoKICB9LAogIG1ldGhvZHM6IHsKICAgIGdldEZpbGUoZmlsZSkgewogICAgICAvLyDor7vlj5bkuIrkvKDmlofku7YKICAgICAgdGhpcy51cGxvYWRpbmcgPSB0cnVlOwogICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpOwogICAgICByZWFkZXIucmVhZEFzQmluYXJ5U3RyaW5nKGZpbGUpOwogICAgICByZWFkZXIub25sb2FkID0gYXN5bmMgZSA9PiB7CiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVhZEV4Y2VsKGUudGFyZ2V0LnJlc3VsdCk7CiAgICAgICAgY29uc29sZS5sb2cocmVzdWx0KTsKICAgICAgICB0aGlzLnJlc3VsdCA9IHVuaXEocmVzdWx0LCAn5bel5Y+3Jyk7CgogICAgICAgIHRoaXMudXBsb2FkaW5nID0gZmFsc2U7CiAgICAgICAgY29uc3QgZGlmZiA9IHJlc3VsdC5sZW5ndGggLSB0aGlzLnJlc3VsdC5sZW5ndGg7CiAgICAgICAgdGhpcy4kbWVzc2FnZS5zdWNjZXNzKAogICAgICAgICAgZGlmZiA+IDAKICAgICAgICAgICAgPyBg5bel5Y+35LiN6IO96YeN5aSN77yM5bey5Y676YeNJHtkaWZmfeadoeaVsOaNrmAKICAgICAgICAgICAgOiAn5paH5Lu26K+75Y+W5oiQ5YqfJywKICAgICAgICApOwogICAgICB9OwogICAgICByZWFkZXIub25lcnJvciA9IGUgPT4gewogICAgICAgIHRoaXMuJG1lc3NhZ2UuZXJyb3IoJ+aWh+S7tuivu+WPluWksei0pScpOwogICAgICB9OwogICAgICByZXR1cm4gZmFsc2U7IC8vIOmYu+atouS4iuS8oAogICAgfSwKICAgIHJlbW92ZUZpbGUoKSB7CiAgICAgIC8vIOenu+mZpOS4iuS8oOaWh+S7tgogICAgICB0aGlzLnJlc3VsdC5zcGxpY2UoMCk7CiAgICB9LAogICAgb25DYW5jZWwoKSB7CiAgICAgIC8vIOWPlua2iOS4iuS8oAogICAgICBpZiAoIXRoaXMucmVzdWx0Lmxlbmd0aCkgewogICAgICAgIHRoaXMudmlzaWJsZSA9IGZhbHNlOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBjb25zdCBtb2RhbCA9IHRoaXMuJG1vZGFsLmNvbmZpcm0oewogICAgICAgIHRpdGxlOiAn6K2m5ZGKJywKICAgICAgICBjb250ZW50OiAn5pWw5o2u5pyq5L+d5a2Y77yM56Gu6K6k5YWz6Zet77yfJywKICAgICAgICBvbk9rOiAoKSA9PiB7CiAgICAgICAgICBtb2RhbC5kZXN0cm95KCk7CiAgICAgICAgICB0aGlzLnZpc2libGUgPSBmYWxzZTsKICAgICAgICB9LAogICAgICB9KTsKICAgIH0sCiAgICBvbk9rKCkgewogICAgICAvLyDnoa7orqTkuIrkvKAKICAgICAgaWYgKCF0aGlzLnJlc3VsdC5sZW5ndGgpIHsKICAgICAgICByZXR1cm4gdGhpcy4kbWVzc2FnZS53YXJuKCfmmoLml6DmlbDmja7vvIEnKTsKICAgICAgfQogICAgICB0aGlzLiRtb2RhbC5jb25maXJtKHsKICAgICAgICB0aXRsZTogJ+aPkOekuicsCiAgICAgICAgY29udGVudDogJ+ehruiupOWvvOWFpeWQl++8nycsCiAgICAgICAgY2VudGVyZWQ6IHRydWUsCiAgICAgICAgb25PazogKCkgPT4gCgkJCQl7CgkJCQkJbGV0IGRhdGE9ewoJCQkJCXVzZXJEYXRhTGlzdDp0aGlzLnRyYW5zZm9ybWVkRGF0YQoJCQkJfQoJCQkJCXRoaXMuJGFwaS5pbXBvcnRVc2VyKHRoaXMudHJhbnNmb3JtZWREYXRhKQogICAgICAgICAgLnRoZW4oKCkgPT4gewogICAgICAgICAgICB0aGlzLiRtZXNzYWdlLnN1Y2Nlc3MoJ+WvvOWFpeaIkOWKnycpOwogICAgICAgICAgICB0aGlzLnZpc2libGUgPSBmYWxzZTsKICAgICAgICAgIH0pLmNhdGNoKGUgPT4gewogICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gZS5tc2cgfHwgJ+WvvOWFpeWksei0pSc7CiAgICAgICAgICAgIGlmIChlLmNvZGUgPT09IDEpIHsKICAgICAgICAgICAgICB0aGlzLiRjb25maXJtKHsKICAgICAgICAgICAgICAgIHRpdGxlOiBtZXNzYWdlLAogICAgICAgICAgICAgICAgY29udGVudDogKCkgPT4gPERpc3BsYXlGYWlsZWRVc2VyCiAgICAgICAgICAgICAgICAgIHByaW1hcnlLZXk9e3RoaXMucHJpbWFyeUtleX0KICAgICAgICAgICAgICAgICAgdXNlcnM9e3RoaXMucmVzdWx0fQogICAgICAgICAgICAgICAgICBmYWlsPXtlLmRhdGF9CiAgICAgICAgICAgICAgICAvPiwKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSBlbHNlIHRoaXMuJG1lc3NhZ2UuZXJyb3IobWVzc2FnZSk7CiAgICAgICAgICB9KS5maW5hbGx5KCgpID0+IHsKICAgICAgICAgICAgdGhpcy4kZW1pdCgncmVmcmVzaCcpOwogICAgICAgICAgfSkKCQkJCX0KICAgICAgfSk7CiAgICB9LAogICAgd3JpdGVUZW1wbGF0ZUZpbGUoKSB7CiAgICAgIC8vIOS4i+i9veS4iuS8oOaooeadv+aWh+S7tgogICAgICBtYWtlRXhjZWwoKHsKICAgICAgICBzdHVkZW50OiB7CiAgICAgICAgICBoZWFkZXI6IFsn5a2m5Y+3JywgJ+Wnk+WQjScsICfmgKfliKsnLCAn6Lqr5Lu9JywgJ+WtpumZoicsICfnlJ/ml6UnLCAn5omL5py65Y+3JywgJ+mCrueusSddLCAvLyDlrabnlJ/ooajlpLQKICAgICAgICAgIG5hbWU6ICflrabnlJ/kuIrkvKDmqKHmnb8ueGxzeCcsCiAgICAgICAgICBkYXRhOiBbCiAgICAgICAgICAgIHsg5a2m5Y+3OiAnMjEzMDEwMTAxJywg5aeT5ZCNOiAn5byg5LiJJywg5oCn5YirOiAn55S3Jywg6Lqr5Lu9OiAn5a2m55SfJywg5a2m6ZmiOiAn6K6h566X5py65a2m6ZmiJyznlJ/ml6U6JzIwMDItMDQtMDQnLOaJi+acuuWPtzonMTg4ODg4ODg4ODgnLOmCrueusTonMTI3MDU0MDQyM0BxcS5jb20nIH0sCiAgICAgICAgICAgIHsg5a2m5Y+3OiAnMjEzMDEwMTAyJywg5aeT5ZCNOiAn5byg5LiJJywg5oCn5YirOiAn55S3Jywg6Lqr5Lu9OiAn5a2m55SfJywg5a2m6ZmiOiAn6K6h566X5py65a2m6ZmiJyznlJ/ml6U6JzIwMDItMDQtMDQnLOaJi+acuuWPtzonMTg4ODg4ODg4ODgnLOmCrueusTonMTI3MDU0MDQyM0BxcS5jb20nIH0sCiAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICAgdGVhY2hlcjogewogICAgICAgICAgaGVhZGVyOiBbJ+W3peWPtycsICflp5PlkI0nLCAn5oCn5YirJywn6Lqr5Lu9JywgJ+iBjOensCcsICflrabpmaInLCAn55Sf5pelJywgJ+aJi+acuuWPtycsICfpgq7nrrEnXSwgLy8g5pWZ5biI6KGo5aS0CiAgICAgICAgICBuYW1lOiAn5pWZ5biI5LiK5Lyg5qih5p2/Lnhsc3gnLAogICAgICAgICAgZGF0YTogWwoJCQkJCXsg5bel5Y+3OiAnMjEzMDEwMTg4Jywg5aeT5ZCNOiAn5a2Z6LWk6LWkJywg5oCn5YirOiAn55S3Jywg6Lqr5Lu9OiAn5pWZ5biIJyzogYznp7A6J+aVmeaOiCcsIOWtpumZojogJ+iuoeeul+acuuWtpumZoics55Sf5pelOicyMDAyLTA0LTA0JyzmiYvmnLrlj7c6JzE4ODg4ODg4ODg4Jyzpgq7nrrE6JzEyNzA1NDA0MjNAcXEuY29tJyB9LAogICAgICAgICAgeyDlt6Xlj7c6ICcyMTMwMTAxODknLCDlp5PlkI06ICflvKDkuIknLCDmgKfliKs6ICfnlLcnLCDouqvku706ICfmlZnluIgnLCDogYznp7A6J+iusuW4iCcsIOWtpumZojogJ+iuoeeul+acuuWtpumZoics55Sf5pelOicyMDAyLTA0LTA0JyzmiYvmnLrlj7c6JzE4ODg4ODg4ODg4Jyzpgq7nrrE6JzEyNzA1NDA0MjNAcXEuY29tJyB9LAogICAgICAgICAgXSwKICAgICAgICB9LAogICAgICB9KVt0aGlzLnR5cGVdKTsKICAgIH0sCiAgICAvKioKICAgICAqIOWklumDqOiwg+eUqOaWueazlQogICAgICovCiAgICBzaG93KCkgewogICAgICAvLyDmmL7npLogTW9kYWwKICAgICAgdGhpcy52aXNpYmxlID0gdHJ1ZTsKICAgIH0sCiAgfSwKfTsKCi8qKgogKiBsYWJlbOaYoOWwhHZhbHVlCiAqIEBwYXJhbXtBcnJheX0gYXJyCiAqLwpmdW5jdGlvbiBtYXBSZXZlcnQoYXJyKSB7CiAgY29uc3QgcmVzdWx0ID0ge307CiAgZm9yIChjb25zdCB7IGxhYmVsLCB2YWx1ZSB9IG9mIGFycikgewogICAgcmVzdWx0W2xhYmVsXSA9IHZhbHVlOwogIH0KICByZXR1cm4gcmVzdWx0Owp9Cg=="},{"version":3,"sources":["UserImport.vue"],"names":[],"mappings":";AA+CA;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;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;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"UserImport.vue","sourceRoot":"src/components/common","sourcesContent":["<template>\n <!-- Modal 组件 -->\n <a-modal\n :visible=\"visible\"\n :mask-closable=\"false\"\n :body-style=\"{ padding: '10px'}\"\n :destroy-on-close=\"true\"\n :after-close=\"removeFile\"\n title=\"导入数据\"\n ok-text=\"确认导入\"\n cancel-text=\"取消\"\n centered\n @cancel=\"onCancel\"\n @ok=\"onOk\"\n >\n <!-- 下载上传模板按钮 -->\n <a-button type=\"link\" @click=\"writeTemplateFile\">\n 下载上传模板({{ type === \"student\" ? \"学生\" : \"教师\" }})\n </a-button>\n <!-- 上传文件组件 -->\n <a-upload\n accept=\".xlsx,.xls\"\n class=\"upload\"\n :before-upload=\"getFile\"\n :remove=\"removeFile\"\n >\n <a-button> <a-icon type=\"upload\" /> 点击上传表格 </a-button>\n </a-upload>\n\n <!-- 数据表格 -->\n <a-table\n size=\"small\"\n style=\"margin-top: 10px\"\n row-key=\"工号\"\n :columns=\"columns\"\n :data-source=\"result\"\n :loading=\"uploading\"\n :pagination=\"{\n showSizeChanger: true,\n showQuickJumper: true,\n showTotal: (total) => `共 ${result.length} 条记录`,\n }\"\n />\n </a-modal>\n</template>\n\n<script>\nimport { uniq } from 'lodash-es';\nimport { readExcel, makeExcel } from '@/utils/excel';\nimport { sexes, grades, ranks,userPrivileges } from '@/utils/const';\nimport DisplayFailedUser from '@/components/common/DisplayFailedUser';\n\n// 映射性别、年级、职称\nconst sexesRevertMap = mapRevert(sexes);\nconst gradesRevertMap = mapRevert(grades);\nconst rankRevertMap = mapRevert(ranks);\n\nexport default {\n name: 'UserImport',\n props: {\n type: {\n default: 'student',\n require: true,\n validator: value => ['student', 'teacher'].includes(value),\n },\n },\n data() {\n return {\n visible: false, // 控制 Modal 显示/隐藏\n uploading: false, // 控制上传状态\n result: [], // 上传结果数据\n };\n },\n computed: {\n primaryKey() {\n return this.type === 'student' ? 'sid' : 'tid'; // 主键\n },\n keyMap() {\n // 映射表头与数据字段\n // 学生和教师的映射关系\n const studentMap = new Map([\n ['学号', 'stid'],\n ['姓名', 'userName'],\n ['性别', 'gender'],\n ['身份', 'userPrivileges'],\n ['学院', 'collegeId'],\n ['生日', 'birthdate'],\n ['手机号', 'phone'],\n ['邮箱', 'email'],\n ]);\n\n const teacherMap = new Map([\n ['工号', 'stid'],\n ['姓名', 'userName'],\n ['性别', 'gender'],\n ['身份', 'userPrivileges'],\n ['职称', 'teacherTitle'],\n ['学院', 'collegeId'],\n ['生日', 'birthdate'],\n ['手机号', 'phone'],\n ['邮箱', 'email'],\n ['密码', 'userPassword'],\n ['状态', 'userStatus'],\n ]);\n\t\t// 根据 primaryKey 选择对应的映射关系\n return this.primaryKey === 'sid' ? studentMap : teacherMap;\n },\n columns() {\n // 生成表格列配置\n const cols = [];\n for (const key of this.keyMap.keys()) {\n cols.push({\n title: key,\n dataIndex: key,\n });\n }\n return cols;\n },\n\t\ttransformedData() {\n\t\t\n // 转换上传数据\n const data = [];\n const strategy = {\n\t\tcollegeId: label => {\n // 遍历 grades 数组,找到匹配的 label,并返回对应的 value(ID)\n for (const grade of grades) {\n if (grade.label == label) {\n return grade.value;\n }\n }\n // 如果没有匹配项,则返回 null 或者其他默认值,取决于你的需求\n return null;\n},userPrivileges: label => {\n // 遍历 grades 数组,找到匹配的 label,并返回对应的 value(ID)\n for (const userPrivilege of userPrivileges) {\n if (userPrivilege.label == label) {\n return userPrivilege.value;\n }\n }\n // 如果没有匹配项,则返回 null 或者其他默认值,取决于你的需求\n return null;\n},\n // 映射生日\n birthdate: label => {\n return new Date((label-25569) *24 * 60 *60 *1000);\n }, // 解析生日并格式化为指定格式\n };\n for (const item of this.result) {\n const temp = {};\n for (let [key, value] of Object.entries(item)) {\n key = this.keyMap.get(key.trim());\n const revert = strategy[key];\n temp[key] = typeof revert === 'function'\n ? revert(value)\n : value;\n }\n data.push(temp);\n }\n return data;\n},\n\n },\n methods: {\n getFile(file) {\n // 读取上传文件\n this.uploading = true;\n const reader = new FileReader();\n reader.readAsBinaryString(file);\n reader.onload = async e => {\n const result = await readExcel(e.target.result);\n console.log(result);\n this.result = uniq(result, '工号');\n\n this.uploading = false;\n const diff = result.length - this.result.length;\n this.$message.success(\n diff > 0\n ? `工号不能重复,已去重${diff}条数据`\n : '文件读取成功',\n );\n };\n reader.onerror = e => {\n this.$message.error('文件读取失败');\n };\n return false; // 阻止上传\n },\n removeFile() {\n // 移除上传文件\n this.result.splice(0);\n },\n onCancel() {\n // 取消上传\n if (!this.result.length) {\n this.visible = false;\n return;\n }\n const modal = this.$modal.confirm({\n title: '警告',\n content: '数据未保存,确认关闭?',\n onOk: () => {\n modal.destroy();\n this.visible = false;\n },\n });\n },\n onOk() {\n // 确认上传\n if (!this.result.length) {\n return this.$message.warn('暂无数据!');\n }\n this.$modal.confirm({\n title: '提示',\n content: '确认导入吗?',\n centered: true,\n onOk: () => \n\t\t\t\t{\n\t\t\t\t\tlet data={\n\t\t\t\t\tuserDataList:this.transformedData\n\t\t\t\t}\n\t\t\t\t\tthis.$api.importUser(this.transformedData)\n .then(() => {\n this.$message.success('导入成功');\n this.visible = false;\n }).catch(e => {\n const message = e.msg || '导入失败';\n if (e.code === 1) {\n this.$confirm({\n title: message,\n content: () => <DisplayFailedUser\n primaryKey={this.primaryKey}\n users={this.result}\n fail={e.data}\n />,\n });\n } else this.$message.error(message);\n }).finally(() => {\n this.$emit('refresh');\n })\n\t\t\t\t}\n });\n },\n writeTemplateFile() {\n // 下载上传模板文件\n makeExcel(({\n student: {\n header: ['学号', '姓名', '性别', '身份', '学院', '生日', '手机号', '邮箱'], // 学生表头\n name: '学生上传模板.xlsx',\n data: [\n { 学号: '213010101', 姓名: '张三', 性别: '男', 身份: '学生', 学院: '计算机学院',生日:'2002-04-04',手机号:'18888888888',邮箱:'1270540423@qq.com' },\n { 学号: '213010102', 姓名: '张三', 性别: '男', 身份: '学生', 学院: '计算机学院',生日:'2002-04-04',手机号:'18888888888',邮箱:'1270540423@qq.com' },\n ],\n },\n teacher: {\n header: ['工号', '姓名', '性别','身份', '职称', '学院', '生日', '手机号', '邮箱'], // 教师表头\n name: '教师上传模板.xlsx',\n data: [\n\t\t\t\t\t{ 工号: '213010188', 姓名: '孙赤赤', 性别: '男', 身份: '教师',职称:'教授', 学院: '计算机学院',生日:'2002-04-04',手机号:'18888888888',邮箱:'1270540423@qq.com' },\n { 工号: '213010189', 姓名: '张三', 性别: '男', 身份: '教师', 职称:'讲师', 学院: '计算机学院',生日:'2002-04-04',手机号:'18888888888',邮箱:'1270540423@qq.com' },\n ],\n },\n })[this.type]);\n },\n /**\n * 外部调用方法\n */\n show() {\n // 显示 Modal\n this.visible = true;\n },\n },\n};\n\n/**\n * label映射value\n * @param{Array} arr\n */\nfunction mapRevert(arr) {\n const result = {};\n for (const { label, value } of arr) {\n result[label] = value;\n }\n return result;\n}\n</script>\n"]}]} |