Переглянути джерело

移动分组,重置密码

cxmo 1 рік тому
батько
коміт
e123676520

+ 46 - 43
pnpm-lock.yaml

@@ -1,5 +1,9 @@
 lockfileVersion: '6.0'
 
+settings:
+  autoInstallPeers: true
+  excludeLinksFromLockfile: false
+
 dependencies:
   '@element-plus/icons-vue':
     specifier: ^2.3.1
@@ -16,6 +20,9 @@ dependencies:
   jquery:
     specifier: ^3.7.1
     version: 3.7.1
+  lodash:
+    specifier: ^4.17.21
+    version: 4.17.21
   pinia:
     specifier: ^2.1.7
     version: 2.1.7(vue@3.4.20)
@@ -166,7 +173,7 @@ packages:
     dev: false
 
   /@esbuild/aix-ppc64@0.19.12:
-    resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==}
+    resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==, tarball: https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz}
     engines: {node: '>=12'}
     cpu: [ppc64]
     os: [aix]
@@ -175,7 +182,7 @@ packages:
     optional: true
 
   /@esbuild/android-arm64@0.19.12:
-    resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==}
+    resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==, tarball: https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz}
     engines: {node: '>=12'}
     cpu: [arm64]
     os: [android]
@@ -184,7 +191,7 @@ packages:
     optional: true
 
   /@esbuild/android-arm@0.19.12:
-    resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==}
+    resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==, tarball: https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.19.12.tgz}
     engines: {node: '>=12'}
     cpu: [arm]
     os: [android]
@@ -193,7 +200,7 @@ packages:
     optional: true
 
   /@esbuild/android-x64@0.19.12:
-    resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==}
+    resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==, tarball: https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.19.12.tgz}
     engines: {node: '>=12'}
     cpu: [x64]
     os: [android]
@@ -202,7 +209,7 @@ packages:
     optional: true
 
   /@esbuild/darwin-arm64@0.19.12:
-    resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==}
+    resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==, tarball: https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz}
     engines: {node: '>=12'}
     cpu: [arm64]
     os: [darwin]
@@ -211,7 +218,7 @@ packages:
     optional: true
 
   /@esbuild/darwin-x64@0.19.12:
-    resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==}
+    resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==, tarball: https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz}
     engines: {node: '>=12'}
     cpu: [x64]
     os: [darwin]
@@ -220,7 +227,7 @@ packages:
     optional: true
 
   /@esbuild/freebsd-arm64@0.19.12:
-    resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==}
+    resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==, tarball: https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz}
     engines: {node: '>=12'}
     cpu: [arm64]
     os: [freebsd]
@@ -229,7 +236,7 @@ packages:
     optional: true
 
   /@esbuild/freebsd-x64@0.19.12:
-    resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==}
+    resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==, tarball: https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz}
     engines: {node: '>=12'}
     cpu: [x64]
     os: [freebsd]
@@ -238,7 +245,7 @@ packages:
     optional: true
 
   /@esbuild/linux-arm64@0.19.12:
-    resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==}
+    resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==, tarball: https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz}
     engines: {node: '>=12'}
     cpu: [arm64]
     os: [linux]
@@ -247,7 +254,7 @@ packages:
     optional: true
 
   /@esbuild/linux-arm@0.19.12:
-    resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==}
+    resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==, tarball: https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz}
     engines: {node: '>=12'}
     cpu: [arm]
     os: [linux]
@@ -256,7 +263,7 @@ packages:
     optional: true
 
   /@esbuild/linux-ia32@0.19.12:
-    resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==}
+    resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==, tarball: https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz}
     engines: {node: '>=12'}
     cpu: [ia32]
     os: [linux]
@@ -265,7 +272,7 @@ packages:
     optional: true
 
   /@esbuild/linux-loong64@0.19.12:
-    resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==}
+    resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==, tarball: https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz}
     engines: {node: '>=12'}
     cpu: [loong64]
     os: [linux]
@@ -274,7 +281,7 @@ packages:
     optional: true
 
   /@esbuild/linux-mips64el@0.19.12:
-    resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==}
+    resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==, tarball: https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz}
     engines: {node: '>=12'}
     cpu: [mips64el]
     os: [linux]
@@ -283,7 +290,7 @@ packages:
     optional: true
 
   /@esbuild/linux-ppc64@0.19.12:
-    resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==}
+    resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==, tarball: https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz}
     engines: {node: '>=12'}
     cpu: [ppc64]
     os: [linux]
@@ -292,7 +299,7 @@ packages:
     optional: true
 
   /@esbuild/linux-riscv64@0.19.12:
-    resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==}
+    resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==, tarball: https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz}
     engines: {node: '>=12'}
     cpu: [riscv64]
     os: [linux]
@@ -301,7 +308,7 @@ packages:
     optional: true
 
   /@esbuild/linux-s390x@0.19.12:
-    resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==}
+    resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==, tarball: https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz}
     engines: {node: '>=12'}
     cpu: [s390x]
     os: [linux]
@@ -310,7 +317,7 @@ packages:
     optional: true
 
   /@esbuild/linux-x64@0.19.12:
-    resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==}
+    resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==, tarball: https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz}
     engines: {node: '>=12'}
     cpu: [x64]
     os: [linux]
@@ -319,7 +326,7 @@ packages:
     optional: true
 
   /@esbuild/netbsd-x64@0.19.12:
-    resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==}
+    resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==, tarball: https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz}
     engines: {node: '>=12'}
     cpu: [x64]
     os: [netbsd]
@@ -328,7 +335,7 @@ packages:
     optional: true
 
   /@esbuild/openbsd-x64@0.19.12:
-    resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==}
+    resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==, tarball: https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz}
     engines: {node: '>=12'}
     cpu: [x64]
     os: [openbsd]
@@ -337,7 +344,7 @@ packages:
     optional: true
 
   /@esbuild/sunos-x64@0.19.12:
-    resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==}
+    resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==, tarball: https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz}
     engines: {node: '>=12'}
     cpu: [x64]
     os: [sunos]
@@ -346,7 +353,7 @@ packages:
     optional: true
 
   /@esbuild/win32-arm64@0.19.12:
-    resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==}
+    resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==, tarball: https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz}
     engines: {node: '>=12'}
     cpu: [arm64]
     os: [win32]
@@ -355,7 +362,7 @@ packages:
     optional: true
 
   /@esbuild/win32-ia32@0.19.12:
-    resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==}
+    resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==, tarball: https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz}
     engines: {node: '>=12'}
     cpu: [ia32]
     os: [win32]
@@ -364,7 +371,7 @@ packages:
     optional: true
 
   /@esbuild/win32-x64@0.19.12:
-    resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==}
+    resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==, tarball: https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz}
     engines: {node: '>=12'}
     cpu: [x64]
     os: [win32]
@@ -419,7 +426,7 @@ packages:
     dev: true
 
   /@rollup/rollup-android-arm-eabi@4.12.0:
-    resolution: {integrity: sha512-+ac02NL/2TCKRrJu2wffk1kZ+RyqxVUlbjSagNgPm94frxtr+XDL12E5Ll1enWskLrtrZ2r8L3wED1orIibV/w==}
+    resolution: {integrity: sha512-+ac02NL/2TCKRrJu2wffk1kZ+RyqxVUlbjSagNgPm94frxtr+XDL12E5Ll1enWskLrtrZ2r8L3wED1orIibV/w==, tarball: https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.12.0.tgz}
     cpu: [arm]
     os: [android]
     requiresBuild: true
@@ -427,7 +434,7 @@ packages:
     optional: true
 
   /@rollup/rollup-android-arm64@4.12.0:
-    resolution: {integrity: sha512-OBqcX2BMe6nvjQ0Nyp7cC90cnumt8PXmO7Dp3gfAju/6YwG0Tj74z1vKrfRz7qAv23nBcYM8BCbhrsWqO7PzQQ==}
+    resolution: {integrity: sha512-OBqcX2BMe6nvjQ0Nyp7cC90cnumt8PXmO7Dp3gfAju/6YwG0Tj74z1vKrfRz7qAv23nBcYM8BCbhrsWqO7PzQQ==, tarball: https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.12.0.tgz}
     cpu: [arm64]
     os: [android]
     requiresBuild: true
@@ -435,7 +442,7 @@ packages:
     optional: true
 
   /@rollup/rollup-darwin-arm64@4.12.0:
-    resolution: {integrity: sha512-X64tZd8dRE/QTrBIEs63kaOBG0b5GVEd3ccoLtyf6IdXtHdh8h+I56C2yC3PtC9Ucnv0CpNFJLqKFVgCYe0lOQ==}
+    resolution: {integrity: sha512-X64tZd8dRE/QTrBIEs63kaOBG0b5GVEd3ccoLtyf6IdXtHdh8h+I56C2yC3PtC9Ucnv0CpNFJLqKFVgCYe0lOQ==, tarball: https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.12.0.tgz}
     cpu: [arm64]
     os: [darwin]
     requiresBuild: true
@@ -443,7 +450,7 @@ packages:
     optional: true
 
   /@rollup/rollup-darwin-x64@4.12.0:
-    resolution: {integrity: sha512-cc71KUZoVbUJmGP2cOuiZ9HSOP14AzBAThn3OU+9LcA1+IUqswJyR1cAJj3Mg55HbjZP6OLAIscbQsQLrpgTOg==}
+    resolution: {integrity: sha512-cc71KUZoVbUJmGP2cOuiZ9HSOP14AzBAThn3OU+9LcA1+IUqswJyR1cAJj3Mg55HbjZP6OLAIscbQsQLrpgTOg==, tarball: https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.12.0.tgz}
     cpu: [x64]
     os: [darwin]
     requiresBuild: true
@@ -451,7 +458,7 @@ packages:
     optional: true
 
   /@rollup/rollup-linux-arm-gnueabihf@4.12.0:
-    resolution: {integrity: sha512-a6w/Y3hyyO6GlpKL2xJ4IOh/7d+APaqLYdMf86xnczU3nurFTaVN9s9jOXQg97BE4nYm/7Ga51rjec5nfRdrvA==}
+    resolution: {integrity: sha512-a6w/Y3hyyO6GlpKL2xJ4IOh/7d+APaqLYdMf86xnczU3nurFTaVN9s9jOXQg97BE4nYm/7Ga51rjec5nfRdrvA==, tarball: https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.12.0.tgz}
     cpu: [arm]
     os: [linux]
     requiresBuild: true
@@ -459,7 +466,7 @@ packages:
     optional: true
 
   /@rollup/rollup-linux-arm64-gnu@4.12.0:
-    resolution: {integrity: sha512-0fZBq27b+D7Ar5CQMofVN8sggOVhEtzFUwOwPppQt0k+VR+7UHMZZY4y+64WJ06XOhBTKXtQB/Sv0NwQMXyNAA==}
+    resolution: {integrity: sha512-0fZBq27b+D7Ar5CQMofVN8sggOVhEtzFUwOwPppQt0k+VR+7UHMZZY4y+64WJ06XOhBTKXtQB/Sv0NwQMXyNAA==, tarball: https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.12.0.tgz}
     cpu: [arm64]
     os: [linux]
     libc: [glibc]
@@ -468,7 +475,7 @@ packages:
     optional: true
 
   /@rollup/rollup-linux-arm64-musl@4.12.0:
-    resolution: {integrity: sha512-eTvzUS3hhhlgeAv6bfigekzWZjaEX9xP9HhxB0Dvrdbkk5w/b+1Sxct2ZuDxNJKzsRStSq1EaEkVSEe7A7ipgQ==}
+    resolution: {integrity: sha512-eTvzUS3hhhlgeAv6bfigekzWZjaEX9xP9HhxB0Dvrdbkk5w/b+1Sxct2ZuDxNJKzsRStSq1EaEkVSEe7A7ipgQ==, tarball: https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.12.0.tgz}
     cpu: [arm64]
     os: [linux]
     libc: [musl]
@@ -477,7 +484,7 @@ packages:
     optional: true
 
   /@rollup/rollup-linux-riscv64-gnu@4.12.0:
-    resolution: {integrity: sha512-ix+qAB9qmrCRiaO71VFfY8rkiAZJL8zQRXveS27HS+pKdjwUfEhqo2+YF2oI+H/22Xsiski+qqwIBxVewLK7sw==}
+    resolution: {integrity: sha512-ix+qAB9qmrCRiaO71VFfY8rkiAZJL8zQRXveS27HS+pKdjwUfEhqo2+YF2oI+H/22Xsiski+qqwIBxVewLK7sw==, tarball: https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.12.0.tgz}
     cpu: [riscv64]
     os: [linux]
     libc: [glibc]
@@ -486,7 +493,7 @@ packages:
     optional: true
 
   /@rollup/rollup-linux-x64-gnu@4.12.0:
-    resolution: {integrity: sha512-TenQhZVOtw/3qKOPa7d+QgkeM6xY0LtwzR8OplmyL5LrgTWIXpTQg2Q2ycBf8jm+SFW2Wt/DTn1gf7nFp3ssVA==}
+    resolution: {integrity: sha512-TenQhZVOtw/3qKOPa7d+QgkeM6xY0LtwzR8OplmyL5LrgTWIXpTQg2Q2ycBf8jm+SFW2Wt/DTn1gf7nFp3ssVA==, tarball: https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.12.0.tgz}
     cpu: [x64]
     os: [linux]
     libc: [glibc]
@@ -495,7 +502,7 @@ packages:
     optional: true
 
   /@rollup/rollup-linux-x64-musl@4.12.0:
-    resolution: {integrity: sha512-LfFdRhNnW0zdMvdCb5FNuWlls2WbbSridJvxOvYWgSBOYZtgBfW9UGNJG//rwMqTX1xQE9BAodvMH9tAusKDUw==}
+    resolution: {integrity: sha512-LfFdRhNnW0zdMvdCb5FNuWlls2WbbSridJvxOvYWgSBOYZtgBfW9UGNJG//rwMqTX1xQE9BAodvMH9tAusKDUw==, tarball: https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.12.0.tgz}
     cpu: [x64]
     os: [linux]
     libc: [musl]
@@ -504,7 +511,7 @@ packages:
     optional: true
 
   /@rollup/rollup-win32-arm64-msvc@4.12.0:
-    resolution: {integrity: sha512-JPDxovheWNp6d7AHCgsUlkuCKvtu3RB55iNEkaQcf0ttsDU/JZF+iQnYcQJSk/7PtT4mjjVG8N1kpwnI9SLYaw==}
+    resolution: {integrity: sha512-JPDxovheWNp6d7AHCgsUlkuCKvtu3RB55iNEkaQcf0ttsDU/JZF+iQnYcQJSk/7PtT4mjjVG8N1kpwnI9SLYaw==, tarball: https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.12.0.tgz}
     cpu: [arm64]
     os: [win32]
     requiresBuild: true
@@ -512,7 +519,7 @@ packages:
     optional: true
 
   /@rollup/rollup-win32-ia32-msvc@4.12.0:
-    resolution: {integrity: sha512-fjtuvMWRGJn1oZacG8IPnzIV6GF2/XG+h71FKn76OYFqySXInJtseAqdprVTDTyqPxQOG9Exak5/E9Z3+EJ8ZA==}
+    resolution: {integrity: sha512-fjtuvMWRGJn1oZacG8IPnzIV6GF2/XG+h71FKn76OYFqySXInJtseAqdprVTDTyqPxQOG9Exak5/E9Z3+EJ8ZA==, tarball: https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.12.0.tgz}
     cpu: [ia32]
     os: [win32]
     requiresBuild: true
@@ -520,7 +527,7 @@ packages:
     optional: true
 
   /@rollup/rollup-win32-x64-msvc@4.12.0:
-    resolution: {integrity: sha512-ZYmr5mS2wd4Dew/JjT0Fqi2NPB/ZhZ2VvPp7SmvPZb4Y1CG/LRcS6tcRo2cYU7zLK5A7cdbhWnnWmUjoI4qapg==}
+    resolution: {integrity: sha512-ZYmr5mS2wd4Dew/JjT0Fqi2NPB/ZhZ2VvPp7SmvPZb4Y1CG/LRcS6tcRo2cYU7zLK5A7cdbhWnnWmUjoI4qapg==, tarball: https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.12.0.tgz}
     cpu: [x64]
     os: [win32]
     requiresBuild: true
@@ -528,7 +535,7 @@ packages:
     optional: true
 
   /@sxzz/popperjs-es@2.11.7:
-    resolution: {integrity: sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==}
+    resolution: {integrity: sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==, tarball: https://registry.npmmirror.com/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz}
     dev: false
 
   /@types/estree@1.0.5:
@@ -888,7 +895,7 @@ packages:
     dev: false
 
   /fsevents@2.3.3:
-    resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
+    resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, tarball: https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz}
     engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
     os: [darwin]
     requiresBuild: true
@@ -975,7 +982,7 @@ packages:
     dev: false
 
   /lodash@4.17.21:
-    resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
+    resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, tarball: https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz}
     dev: false
 
   /magic-string@0.30.7:
@@ -1235,7 +1242,3 @@ packages:
     dependencies:
       isexe: 2.0.0
     dev: true
-
-settings:
-  autoInstallPeers: true
-  excludeLinksFromLockfile: false

+ 1 - 1
src/views/system_manage/depart_manage/components/ModifyNodeDialog.vue

@@ -81,7 +81,7 @@ async function handleSubmitForm(){
     emit("submitForm",{
         type:props.type,
         nodeForm:node,
-        nodeInfo,
+        nodeInfo:props.nodeInfo,
     })
 }
 

+ 69 - 5
src/views/system_manage/depart_manage/components/MoveDepartDialog.vue

@@ -1,13 +1,77 @@
 <script setup>
-import { ref, reactive } from 'vue'
+import { ref, reactive, watch } from 'vue'
+import{checkPassWord} from '@/utils/commonOptions'
+const props = defineProps({
+    isShow:Boolean,
+    userInfo:Object,
+    departArr:Array
+})
+const emit = defineEmits(["closeDia","submitForm"])
+
+
+let form = reactive({
+    depart:[]
+})
+watch(()=>props.isShow,(newval)=>{
+    if(newval){
+        const {DepartmentId,GroupId,TeamId} = props.userInfo
+        let departArr = [];
+        DepartmentId?departArr.push(DepartmentId):''
+        GroupId?departArr.push(GroupId):''
+        TeamId ?departArr.push(TeamId):''
+        form.depart = departArr
+    }
+})
+let formRef = ref(null) 
+async function handleSubmitForm(){
+    emit("submitForm",{user:props.userInfo,form})
+}
 </script>
 
 <template>
-    <div>
-        移动分组弹窗
-    </div>
+    <el-dialog
+        :model-value="props.isShow"
+        :close-on-click-modal="false"
+        :modal-append-to-body="false"
+        width="30%"
+        title="重置密码"
+        @close="emit('closeDia')"
+    >
+        <div class="dialog-content">
+            <el-form ref="formRef" :model="form" label-width="100px">
+                <el-form-item label="账号">
+                    <span>{{userInfo.RealName}}</span>
+                </el-form-item>
+                <el-form-item label="选择分组" prop="depart">
+                    <el-cascader 
+                        v-model="form.depart" 
+                        :options="props.departArr"
+                        :props="{
+                            value:'DepartmentId',
+                            label:'DepartmentName',
+                            children:'Child',
+                            checkStrictly:true
+                        }" 
+                        style="width:100%"
+                        placeholder="请选择部门分组">
+                    </el-cascader>
+                </el-form-item>
+            </el-form>
+        </div>
+        <template #footer>
+            <div class="btn-content">
+                <el-button type="primary" style="width:80px;margin-right:24px;" @click="handleSubmitForm">保存</el-button>
+                <el-button style="width:80px;" @click="emit('closeDia')">取消</el-button>
+            </div>
+        </template>
+    </el-dialog>
 </template>
 
 <style scoped lang="scss">
-
+.el-dialog{
+    .btn-content{
+        text-align: center;
+        margin-bottom: 20px;
+    }
+}
 </style>

+ 87 - 5
src/views/system_manage/depart_manage/components/ResetPassDialog.vue

@@ -1,13 +1,95 @@
 <script setup>
-import { ref, reactive } from 'vue'
+import { ref, reactive, watch } from 'vue'
+import{checkPassWord} from '@/utils/commonOptions'
+const props = defineProps({
+    isShow:Boolean,
+    userInfo:Object
+})
+const emit = defineEmits(["closeDia","submitForm"])
+
+
+let form = reactive({
+    password:'',
+    check:''
+})
+watch(()=>props.isShow,(newval)=>{
+    if(newval){
+        formRef.value?.resetFields()
+        form.password = ''
+        form.check=''
+    }
+})
+let formRef = ref(null) 
+const rules = reactive({
+    password:[{validator: (rule,value,callback)=>{
+            if(value===''){
+                callback(new Error('请输入新密码'))
+            }
+            if(form.check!==''){
+                formRef.value?.validateField('check')
+            }
+            if(!checkPassWord(value)){
+                callback(new Error('密码要求8位及以上,包含数字、大写字母、小写字母、特殊字符中的三个类型'))
+            }else{
+                callback()
+            }
+        },trigger: 'blur'}],
+    check:[{validator: (rule,value,callback)=>{
+            if(value===''){
+                callback(new Error('请输入确认密码'))
+            }else if(value!==form.password){
+                callback(new Error('两次输入的密码不一致'))
+            }else{
+                callback()
+            }
+        },trigger: 'blur'}]
+})
+async function handleSubmitForm(){
+    try{
+        await formRef.value?.validate()
+    }catch(e){
+        return 
+    }
+    emit("submitForm",{user:props.userInfo,form})
+}
 </script>
 
 <template>
-    <div>
-        重置密码弹窗
-    </div>
+    <el-dialog
+        :model-value="props.isShow"
+        :close-on-click-modal="false"
+        :modal-append-to-body="false"
+        width="30%"
+        title="重置密码"
+        @close="emit('closeDia')"
+    >
+        <div class="dialog-content">
+            <el-form ref="formRef" :model="form" :rules="rules" label-width="100px">
+                <el-form-item label="账号">
+                    <span>{{userInfo.RealName}}</span>
+                </el-form-item>
+                <el-form-item label="新密码" prop="password">
+                    <el-input v-model="form.password" style="width:100%" :show-password="true"></el-input>
+                </el-form-item>
+                <el-form-item label="确认新密码" prop="check">
+                    <el-input v-model="form.check" style="width:100%" :show-password="true"></el-input>
+                </el-form-item>
+            </el-form>
+        </div>
+        <template #footer>
+            <div class="btn-content">
+                <el-button type="primary" style="width:80px;margin-right:24px;" @click="handleSubmitForm">保存</el-button>
+                <el-button style="width:80px;" @click="emit('closeDia')">取消</el-button>
+            </div>
+        </template>
+    </el-dialog>
 </template>
 
 <style scoped lang="scss">
-
+.el-dialog{
+    .btn-content{
+        text-align: center;
+        margin-bottom: 20px;
+    }
+}
 </style>

+ 24 - 5
src/views/system_manage/depart_manage/departManage.vue

@@ -10,6 +10,8 @@ import { ElMessage } from 'element-plus'
 import UserDetail from './components/UserDetail.vue'
 import ModifyUserDialog from './components/ModifyUserDialog.vue'
 import ModifyNodeDialog from './components/ModifyNodeDialog.vue'
+import ResetPassDialog from './components/ResetPassDialog.vue'
+import MoveDepartDialog from './components/MoveDepartDialog.vue'
 
 const {
         defaultDepart,defaultGroup,departArr,tableParams,tableData,groupTeamId,
@@ -19,12 +21,14 @@ const {
 const {checkAllowDrag,checkAllowDrop,handleDropOver} = useTreeMove()
 const {
         act_node,clickNode,initDepart,removeNode,
-        modifyNodeType,modifyNode,isModifyNodeShow,openNodeDialog
+        modifyNodeType,nodeInfo,isModifyNodeShow,openNodeDialog,
+        modifyNode
     } = useTreeEvent()
 const {
         isShowUserdtl,userObj,
         changeStatus,getUserDetail,
-        openResetPassDialog,openMoveDepartDialog,
+        isResetPassShow,openResetPassDialog,resetUserPassWord,
+        isMoveDepartShow,openMoveDepartDialog,moveDepart,
         getResearchGroup,researchGroup,
         isModifyUserShow,modifyUserType,userInfo,openUserDialog,
         modifyUser,delUser
@@ -122,7 +126,7 @@ getRoles()
                             <img src="~@/assets/img/set_m/add.png" alt="" class="icon-img" @click.stop="openNodeDialog('add',data,node)" v-if="data.IsGroup">
                             <img src="~@/assets/img/set_m/edit.png" alt="" class="icon-img" @click.stop="openNodeDialog('edit',data,node)">
                             <el-popconfirm
-                                @confirm="removeNode(node,data)"
+                                @confirm="removeNode(data)"
                                 confirm-button-text='删除'
                                 cancel-button-text='取消'
                                 confirm-button-type="primary"
@@ -243,10 +247,25 @@ getRoles()
     <ModifyNodeDialog 
         :isShow="isModifyNodeShow"
         :type="modifyNodeType"
-        :nodeInfo="modifyNode"
-        @submitForm="isModifyNodeShow = false"
+        :nodeInfo="nodeInfo"
+        @submitForm="modifyNode"
         @closeDia="isModifyNodeShow = false"
     />
+    <!-- 重置密码弹窗 -->
+    <ResetPassDialog 
+        :isShow="isResetPassShow"
+        :userInfo="userInfo"
+        @submitForm="resetUserPassWord"
+        @closeDia="isResetPassShow = false"
+    />
+    <!-- 移动分组弹窗 -->
+    <MoveDepartDialog 
+        :isShow="isMoveDepartShow"
+        :userInfo="userInfo"
+        :departArr="departArr"
+        @submitForm="moveDepart"
+        @closeDia="isMoveDepartShow = false"
+    />
 </template>
 
 <style scoped lang="scss">

+ 141 - 34
src/views/system_manage/depart_manage/hooks/use-depart.js

@@ -79,9 +79,17 @@ export function useDepart(){
             isModifyUserShow.value = true
         }
         //打开重置密码弹窗
-        function openResetPassDialog(){}
+        let isResetPassShow = ref(false)
+        function openResetPassDialog(data){
+            userInfo.value = data
+            isResetPassShow.value = true
+        }
         //打开移动分组弹窗
-        function openMoveDepartDialog(){}
+        let isMoveDepartShow = ref(false)
+        function openMoveDepartDialog(data){
+            userInfo.value = data
+            isMoveDepartShow.value = true
+        }
         //添加编辑用户
         function modifyUser(data){
             const {type,userForm} = data
@@ -150,9 +158,32 @@ export function useDepart(){
             }).catch(() => {});
         }
         //重置用户密码
-        function resetUserPassWord(){}
+        function resetUserPassWord({user,form}){
+            departInterence.resetSysuserPass({
+                AdminId:Number(user.AdminId),
+                Password:new http.Base64().encode(form.password),
+                RePassword:new http.Base64().encode(form.password)
+            }).then(res=>{
+                if(res.Ret!==200) return 
+                ElMessage.success('重置密码成功')
+                isResetPassShow.value = false
+                getTableUser()
+            })
+        }
         //移动用户分组
-        function moveDepart(){}
+        function moveDepart({user,form}){
+            departInterence.moveSysuser({
+                AdminId:Number(user.AdminId),
+                DepartmentId:Number(form.depart[0]),
+                GroupId:Number(form.depart[1]?form.depart[1]:0),
+                TeamId:Number(form.depart[2]?form.depart[2]:0),
+            }).then(res=>{
+                if(res.Ret!==200) return
+                ElMessage.success('移动分组成功')
+                isMoveDepartShow.value = false
+                getTableUser()
+            })
+        }
         //改变用户启用禁用状态
         async function changeStatus(data){
             const res=await departInterence.statusChange({
@@ -160,6 +191,7 @@ export function useDepart(){
                 Enabled:data.Enabled===1?0:1
             })
             if(res.Ret===200){
+                ElMessage.success('设置成功')
                 getTableUser()
             }
         }
@@ -189,8 +221,9 @@ export function useDepart(){
         return {
             isShowUserdtl,userObj,
             isModifyUserShow,modifyUserType,userInfo,openUserDialog,
-            openResetPassDialog,openMoveDepartDialog,
-            modifyUser,delUser,moveDepart,resetUserPassWord,
+            isResetPassShow,openResetPassDialog,resetUserPassWord,
+            isMoveDepartShow,openMoveDepartDialog,moveDepart,
+            modifyUser,delUser,
             getUserDetail,changeStatus,
             getResearchGroup,researchGroup
         }
@@ -235,54 +268,128 @@ export function useDepart(){
 
         //打开添加/编辑部门/分组弹窗 (原项目中的addNode editNode addDepart合成一个)
         let modifyNodeType = ref('add')
-        let modifyNode = ref(null)
+        let nodeInfo = ref(null)
         let isModifyNodeShow = ref(false)
+        /**
+         * 
+         * @param type  add or edit
+         * @param data 树节点数据
+         * @param node 树节点 只需要用到level
+         */
         function openNodeDialog(type,data,{level}){
-            console.log('type',type)
-            console.log('data',data)
-            console.log('level',level)
-    
             modifyNodeType.value = type
-            modifyNode.value = {data,level}
+            nodeInfo.value = {data,level}
             isModifyNodeShow.value = true
         }
+        //添加编辑部门or分组
+        /**
+         * @param params
+         * @param params.type add or edit 
+         * @param params.nodeForm 节点修改的数据 {name,group}
+         * @param params.nodeInfo 当前点击的树节点 {data,level}
+         */
+        async function modifyNode({type='add',nodeForm,nodeInfo}){
+            const {level=0} = nodeInfo
+            //根据level和type确定modify类型
+            //level为0 增加部门
+            //level为1 编辑部门&增加分组
+            //level为2 编辑分组&增加分组
+            //level为3 编辑分组
+            const modifyMap = [
+                {'add':addDepart},
+                {'add':addGroup,'edit':editDepart},
+                {'add':addGroup,'edit':editGroup},
+                {'edit':editGroup}
+            ]
+            await modifyMap[level][type](nodeForm,nodeInfo)
+            getDepartArr()
+        }
+        async function addDepart(form,{data}){
+            await departInterence.addDepart({
+                DepartmentName:form.departName
+            }).then(res=>{
+                if(res.Ret!==200) return 
+                ElMessage.success("添加部门成功")
+                isModifyNodeShow.value = false
+            })
+        }
+        async function editDepart(form,{data}){
+            console.log("编辑部门")
+           await  departInterence.editDepart({
+                DepartmentId:Number(data.DepartmentId),
+                DepartmentName:form.departName
+            }).then(res => {
+                if(res.Ret!==200) return 
+                ElMessage.success("编辑部门成功")
+                isModifyNodeShow.value = false
+            })
+        }
+        //部门添加分组 or 分组添加分组
+        async function addGroup(form,{data}){
+            const groups = form.group.map(i=>i.DepartmentName)
+            const params = data.IsGroup
+                ?{
+                    DepartmentId:Number(data.TopId),
+                    GroupId:Number(data.DepartmentId),
+                    TeamName:groups.join(',')
+                }:{
+                    DepartmentId:Number(data.DepartmentId),
+                    GroupName:groups.join(',')
+                }
+            const res = data.IsGroup
+                ?await departInterence.addTeamGroup(params)
+                :await departInterence.addGroup(params)
+            if(res.Ret===200){
+                ElMessage.success("添加分组成功")
+                isModifyNodeShow.value = false
+            }
+
+        }
+        async function editGroup(form,{data}){
+            const params = data.IsGroup
+                ?{
+                    GroupId:Number(data.DepartmentId),
+                    GroupName:form.groupName,
+                }:{
+                    TeamId:Number(data.DepartmentId),
+                    TeamName:form.groupName
+                }
+            const res = data.IsGroup
+                ?await departInterence.editGroup(params)
+                :await departInterence.editTeamGroup(params)
+            if(res.Ret===200) {
+                ElMessage.success("编辑分组成功")
+                isModifyNodeShow.value = false
+            }
+        }
         //删除节点 
-        function removeNode(data){
+        async function removeNode(data){
+            let res = null
             if(data.IsDepartment) {
-                departInterence.delDepart({
+                res = await departInterence.delDepart({
                     DepartmentId:data.DepartmentId
-                }).then(res =>{
-                    if(res.Ret === 200) {
-                        ElMessage.success('删除部门成功')
-                        getDepartArr()
-                    }
                 })
             }else if(data.IsGroup) {
                 /* 删除分组 */
-                departInterence.delGroup({
+                res = await departInterence.delGroup({
                     GroupId:data.DepartmentId
-                }).then(res =>{
-                    if(res.Ret === 200) {
-                        ElMessage.success('删除分组成功')
-                        getDepartArr()
-                    }
                 })
             }else {
-                departInterence.delTeamGroup({
+                res = await departInterence.delTeamGroup({
                     TeamId:data.DepartmentId
-                }).then(res =>{
-                    if(res.Ret === 200) {
-                        ElMessage.success('删除成功')
-                        getDepartArr()
-                    }
                 })
             }
+
+            if(res&&res.Ret===200){
+                ElMessage.success('删除成功')
+                initDepart()
+            }
         }
         return {
             act_node,
-            clickNode,initDepart,
-            modifyNodeType,modifyNode,isModifyNodeShow,openNodeDialog,
-            removeNode
+            clickNode,initDepart,removeNode,
+            modifyNodeType,nodeInfo,isModifyNodeShow,openNodeDialog,modifyNode,
+            
         }
 
     }