Просмотр исходного кода

feat: 登录接口更新, 音色接口更新

王晓东 2 месяцев назад
Родитель
Сommit
f16a97ce1a

+ 1 - 0
package.json

@@ -45,6 +45,7 @@
     "filesize": "^11.0.2",
     "hotkeys-js": "^3.13.15",
     "lucide-vue-next": "^0.544.0",
+    "md5": "^2.3.0",
     "mitt": "^3.0.1",
     "nprogress": "^0.2.0",
     "path-browserify": "^1.0.1",

+ 75 - 0
pnpm-lock.yaml

@@ -86,6 +86,9 @@ importers:
       lucide-vue-next:
         specifier: ^0.544.0
         version: 0.544.0(vue@3.5.21(typescript@5.9.2))
+      md5:
+        specifier: ^2.3.0
+        version: 2.3.0
       mitt:
         specifier: ^3.0.1
         version: 3.0.1
@@ -1941,36 +1944,42 @@ packages:
     engines: {node: '>=14.0.0'}
     cpu: [arm64]
     os: [linux]
+    libc: [glibc]
 
   '@oxc-minify/binding-linux-arm64-musl@0.80.0':
     resolution: {integrity: sha512-D2j5L9Z4OO42We0Lo2GkXT/AaNikzZJ8KZ9V2VVwu7kofI4RsO8kSu8ydWlqRlRdiAprmUpRZU/pNW0ZA7A68w==}
     engines: {node: '>=14.0.0'}
     cpu: [arm64]
     os: [linux]
+    libc: [musl]
 
   '@oxc-minify/binding-linux-riscv64-gnu@0.80.0':
     resolution: {integrity: sha512-2AztlLcio5OGil70wjRLbxbjlfS1yCTzO+CYan49vfUOCXpwSWwwLD2WDzFokhEXAzf8epbbu7pruYk8qorRRg==}
     engines: {node: '>=14.0.0'}
     cpu: [riscv64]
     os: [linux]
+    libc: [glibc]
 
   '@oxc-minify/binding-linux-s390x-gnu@0.80.0':
     resolution: {integrity: sha512-5GMKARe4gYHhA7utM8qOgv3WM7KAXGZGG3Jhvk4UQSRBp0v6PKFmHmz8Q93+Ep8w1m4NqRL30Zk9CZHMH/qi5g==}
     engines: {node: '>=14.0.0'}
     cpu: [s390x]
     os: [linux]
+    libc: [glibc]
 
   '@oxc-minify/binding-linux-x64-gnu@0.80.0':
     resolution: {integrity: sha512-iw45N+OVnPioRQXLHfrsqEcTpydcGSHLphilS3aSpc4uVKnOqCybskKnbEnxsIJqHWbzDZeJgzuRuQa7EhNcqg==}
     engines: {node: '>=14.0.0'}
     cpu: [x64]
     os: [linux]
+    libc: [glibc]
 
   '@oxc-minify/binding-linux-x64-musl@0.80.0':
     resolution: {integrity: sha512-4+dhYznVM+L9Jh855JBbqVyDjwi3p8rpL7RfgN+Ee1oQMaZl2ZPy2shS1Kj56Xr5haTTVGdRKcIqTU8SuF37UQ==}
     engines: {node: '>=14.0.0'}
     cpu: [x64]
     os: [linux]
+    libc: [musl]
 
   '@oxc-minify/binding-wasm32-wasi@0.80.0':
     resolution: {integrity: sha512-flADFeNwC1/XsBBsESAigsJZyONEBloQO86Z38ZNzLSuMmpGRdwB9gUwlPCQgDRND/aB+tvR29hKTSuQoS3yrg==}
@@ -2066,72 +2075,84 @@ packages:
     engines: {node: '>=20.0.0'}
     cpu: [arm64]
     os: [linux]
+    libc: [glibc]
 
   '@oxc-parser/binding-linux-arm64-gnu@0.80.0':
     resolution: {integrity: sha512-y2NEhbFfKPdOkf3ZR/3xwJFJVji6IKxwXKHUN4bEdqpcO0tkXSCiP0MzTxjEY6ql2/MXdkqK0Ym92dYsRsgsyg==}
     engines: {node: '>=20.0.0'}
     cpu: [arm64]
     os: [linux]
+    libc: [glibc]
 
   '@oxc-parser/binding-linux-arm64-musl@0.75.1':
     resolution: {integrity: sha512-8ilN7iG7Y4qvXJTuHERPKy5LKcT1ioSGRn7Yyd988tzuR9Cvp4+gJu8azYZnSUJKfNV6SGOEfVnxLabCLRkG/A==}
     engines: {node: '>=20.0.0'}
     cpu: [arm64]
     os: [linux]
+    libc: [musl]
 
   '@oxc-parser/binding-linux-arm64-musl@0.80.0':
     resolution: {integrity: sha512-j3tKausSXwHS/Ej6ct2dmKJtw0UIME2XJmj6QfPT6LyUSNTndj4yXRXuMSrCOrX9/0qH9GhmqeL9ouU27dQRFw==}
     engines: {node: '>=20.0.0'}
     cpu: [arm64]
     os: [linux]
+    libc: [musl]
 
   '@oxc-parser/binding-linux-riscv64-gnu@0.75.1':
     resolution: {integrity: sha512-/JPJXjT/fkG699rlxzLNvQx0URjvzdk7oHln54F159ybgVJKLLWqb8M45Nhw5z6TeaIYyhwIqMNlrA7yb1Rlrw==}
     engines: {node: '>=20.0.0'}
     cpu: [riscv64]
     os: [linux]
+    libc: [glibc]
 
   '@oxc-parser/binding-linux-riscv64-gnu@0.80.0':
     resolution: {integrity: sha512-h+uPvyTcpTFd946fGPU57sZeec2qHPUYQRZeXHB2uuZjps+9pxQ5zIz0EBM/JgBtnwdtoR93RAu1YNAVbqY5Zw==}
     engines: {node: '>=20.0.0'}
     cpu: [riscv64]
     os: [linux]
+    libc: [glibc]
 
   '@oxc-parser/binding-linux-s390x-gnu@0.75.1':
     resolution: {integrity: sha512-t6/E4j+2dT7/4R5hQNX4LBtR1+wxxtJNUVBD89YuiWHPgeEoghqSa0mGMrGyOZPbHMb4V8xdT/CrMMeDpuqRaQ==}
     engines: {node: '>=20.0.0'}
     cpu: [s390x]
     os: [linux]
+    libc: [glibc]
 
   '@oxc-parser/binding-linux-s390x-gnu@0.80.0':
     resolution: {integrity: sha512-+u74hV+WwCPL4UBNOJaIGRozTCfZ7pM5JCEe8zAlMkKexftUzbtvW02314bVD9bqoRAL3Gg6jcZrjNjwDX2FwQ==}
     engines: {node: '>=20.0.0'}
     cpu: [s390x]
     os: [linux]
+    libc: [glibc]
 
   '@oxc-parser/binding-linux-x64-gnu@0.75.1':
     resolution: {integrity: sha512-zJ2t+d1rV5dcPJHxN3B1Fxc2KDN+gPgdXtlzp0/EH4iO3s5OePpPvTTZA/d1vfPoQFiFOT7VYNmaD9XjHfMQaw==}
     engines: {node: '>=20.0.0'}
     cpu: [x64]
     os: [linux]
+    libc: [glibc]
 
   '@oxc-parser/binding-linux-x64-gnu@0.80.0':
     resolution: {integrity: sha512-N9UGnWVWMlOJH+6550tqyBxd9qkMd0f4m+YRA0gly6efJTuLbPQpjkJm7pJbMu+GULcvSJ/Y0bkMAIQTtwP0vQ==}
     engines: {node: '>=20.0.0'}
     cpu: [x64]
     os: [linux]
+    libc: [glibc]
 
   '@oxc-parser/binding-linux-x64-musl@0.75.1':
     resolution: {integrity: sha512-62hG/1IoOr0hpmGtF2k1MJUzAXLH7DH3fSAttZ1vEvDThhLplqA7jcqOP0IFMIVZ0kt9cA/rW5pF4tnXjiWeSA==}
     engines: {node: '>=20.0.0'}
     cpu: [x64]
     os: [linux]
+    libc: [musl]
 
   '@oxc-parser/binding-linux-x64-musl@0.80.0':
     resolution: {integrity: sha512-l2N/GlFEri27QBMi0e53V/SlpQotIvHbz+rZZG/EO+vn58ZEr0eTG+PjJoOY/T8+TQb8nrCtRe4S/zNDpV6zSQ==}
     engines: {node: '>=20.0.0'}
     cpu: [x64]
     os: [linux]
+    libc: [musl]
 
   '@oxc-parser/binding-wasm32-wasi@0.75.1':
     resolution: {integrity: sha512-txS7vK0EU/1Ey7d1pxGrlp2q/JrxkvLU+r9c3gKxW9mVgvFMQzAxQhuc9tT3ZiS793pkvZ+C1w9GS2DpJi7QYg==}
@@ -2214,36 +2235,42 @@ packages:
     engines: {node: '>=14.0.0'}
     cpu: [arm64]
     os: [linux]
+    libc: [glibc]
 
   '@oxc-transform/binding-linux-arm64-musl@0.80.0':
     resolution: {integrity: sha512-kBBCQwr1GCkr/b0iXH+ijsg+CSPCAMSV2tu4LmG2PFaxBnZilMYfUyWHCAiskbbUADikecUfwX6hHIaQoMaixg==}
     engines: {node: '>=14.0.0'}
     cpu: [arm64]
     os: [linux]
+    libc: [musl]
 
   '@oxc-transform/binding-linux-riscv64-gnu@0.80.0':
     resolution: {integrity: sha512-8CGJhHoD2Ttw8HtCNd/IWnGtL0Nsn448L2hZJtbDDGVUZUF4bbZFdXPnRt0QrEbupywoH6InN6q2imLous6xnw==}
     engines: {node: '>=14.0.0'}
     cpu: [riscv64]
     os: [linux]
+    libc: [glibc]
 
   '@oxc-transform/binding-linux-s390x-gnu@0.80.0':
     resolution: {integrity: sha512-V/Lb6m5loWzvdB/qo6eYvVXidQku/PA706JbeE/PPCup8At+BwOXnZjktv7LDxrpuqnO32tZDHUUc9Y3bzOEBw==}
     engines: {node: '>=14.0.0'}
     cpu: [s390x]
     os: [linux]
+    libc: [glibc]
 
   '@oxc-transform/binding-linux-x64-gnu@0.80.0':
     resolution: {integrity: sha512-03hHW04MQNb+ak27xo79nUkMjVu6146TNgeSapcDRATH4R0YMmXB2oPQK1K2nuBJzVZjBjH7Bus/I7tR3JasAg==}
     engines: {node: '>=14.0.0'}
     cpu: [x64]
     os: [linux]
+    libc: [glibc]
 
   '@oxc-transform/binding-linux-x64-musl@0.80.0':
     resolution: {integrity: sha512-BkXniuuHpo9cR2S3JDKIvmUrNvmm335owGW4rfp07HjVUsbq9e7bSnvOnyA3gXGdrPR2IgCWGi5nnXk2NN5Q0A==}
     engines: {node: '>=14.0.0'}
     cpu: [x64]
     os: [linux]
+    libc: [musl]
 
   '@oxc-transform/binding-wasm32-wasi@0.80.0':
     resolution: {integrity: sha512-jfRRXLtfSgTeJXBHj6qb+HHUd6hmYcyUNMBcTY8/k+JVsx0ThfrmCIufNlSJTt1zB+ugnMVMuQGeB0oF+aa86w==}
@@ -2291,36 +2318,42 @@ packages:
     engines: {node: '>= 10.0.0'}
     cpu: [arm]
     os: [linux]
+    libc: [glibc]
 
   '@parcel/watcher-linux-arm-musl@2.5.1':
     resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==}
     engines: {node: '>= 10.0.0'}
     cpu: [arm]
     os: [linux]
+    libc: [musl]
 
   '@parcel/watcher-linux-arm64-glibc@2.5.1':
     resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==}
     engines: {node: '>= 10.0.0'}
     cpu: [arm64]
     os: [linux]
+    libc: [glibc]
 
   '@parcel/watcher-linux-arm64-musl@2.5.1':
     resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==}
     engines: {node: '>= 10.0.0'}
     cpu: [arm64]
     os: [linux]
+    libc: [musl]
 
   '@parcel/watcher-linux-x64-glibc@2.5.1':
     resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==}
     engines: {node: '>= 10.0.0'}
     cpu: [x64]
     os: [linux]
+    libc: [glibc]
 
   '@parcel/watcher-linux-x64-musl@2.5.1':
     resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==}
     engines: {node: '>= 10.0.0'}
     cpu: [x64]
     os: [linux]
+    libc: [musl]
 
   '@parcel/watcher-wasm@2.5.1':
     resolution: {integrity: sha512-RJxlQQLkaMMIuWRozy+z2vEqbaQlCuaCgVZIUCzQLYggY22LZbP5Y1+ia+FD724Ids9e+XIyOLXLrLgQSHIthw==}
@@ -2411,24 +2444,28 @@ packages:
     engines: {node: '>= 10'}
     cpu: [arm64]
     os: [linux]
+    libc: [glibc]
 
   '@resvg/resvg-js-linux-arm64-musl@2.4.1':
     resolution: {integrity: sha512-6mT0+JBCsermKMdi/O2mMk3m7SqOjwi9TKAwSngRZ/nQoL3Z0Z5zV+572ztgbWr0GODB422uD8e9R9zzz38dRQ==}
     engines: {node: '>= 10'}
     cpu: [arm64]
     os: [linux]
+    libc: [musl]
 
   '@resvg/resvg-js-linux-x64-gnu@2.4.1':
     resolution: {integrity: sha512-60KnrscLj6VGhkYOJEmmzPlqqfcw1keDh6U+vMcNDjPhV3B5vRSkpP/D/a8sfokyeh4VEacPSYkWGezvzS2/mg==}
     engines: {node: '>= 10'}
     cpu: [x64]
     os: [linux]
+    libc: [glibc]
 
   '@resvg/resvg-js-linux-x64-musl@2.4.1':
     resolution: {integrity: sha512-0AMyZSICC1D7ge115cOZQW8Pcad6PjWuZkBFF3FJuSxC6Dgok0MQnLTs2MfMdKBlAcwO9dXsf3bv9tJZj8pATA==}
     engines: {node: '>= 10'}
     cpu: [x64]
     os: [linux]
+    libc: [musl]
 
   '@resvg/resvg-js-win32-arm64-msvc@2.4.1':
     resolution: {integrity: sha512-76XDFOFSa3d0QotmcNyChh2xHwk+JTFiEQBVxMlHpHMeq7hNrQJ1IpE1zcHSQvrckvkdfLboKRrlGB86B10Qjw==}
@@ -2564,56 +2601,67 @@ packages:
     resolution: {integrity: sha512-EtP8aquZ0xQg0ETFcxUbU71MZlHaw9MChwrQzatiE8U/bvi5uv/oChExXC4mWhjiqK7azGJBqU0tt5H123SzVA==}
     cpu: [arm]
     os: [linux]
+    libc: [glibc]
 
   '@rollup/rollup-linux-arm-musleabihf@4.46.2':
     resolution: {integrity: sha512-qO7F7U3u1nfxYRPM8HqFtLd+raev2K137dsV08q/LRKRLEc7RsiDWihUnrINdsWQxPR9jqZ8DIIZ1zJJAm5PjQ==}
     cpu: [arm]
     os: [linux]
+    libc: [musl]
 
   '@rollup/rollup-linux-arm64-gnu@4.46.2':
     resolution: {integrity: sha512-3dRaqLfcOXYsfvw5xMrxAk9Lb1f395gkoBYzSFcc/scgRFptRXL9DOaDpMiehf9CO8ZDRJW2z45b6fpU5nwjng==}
     cpu: [arm64]
     os: [linux]
+    libc: [glibc]
 
   '@rollup/rollup-linux-arm64-musl@4.46.2':
     resolution: {integrity: sha512-fhHFTutA7SM+IrR6lIfiHskxmpmPTJUXpWIsBXpeEwNgZzZZSg/q4i6FU4J8qOGyJ0TR+wXBwx/L7Ho9z0+uDg==}
     cpu: [arm64]
     os: [linux]
+    libc: [musl]
 
   '@rollup/rollup-linux-loongarch64-gnu@4.46.2':
     resolution: {integrity: sha512-i7wfGFXu8x4+FRqPymzjD+Hyav8l95UIZ773j7J7zRYc3Xsxy2wIn4x+llpunexXe6laaO72iEjeeGyUFmjKeA==}
     cpu: [loong64]
     os: [linux]
+    libc: [glibc]
 
   '@rollup/rollup-linux-ppc64-gnu@4.46.2':
     resolution: {integrity: sha512-B/l0dFcHVUnqcGZWKcWBSV2PF01YUt0Rvlurci5P+neqY/yMKchGU8ullZvIv5e8Y1C6wOn+U03mrDylP5q9Yw==}
     cpu: [ppc64]
     os: [linux]
+    libc: [glibc]
 
   '@rollup/rollup-linux-riscv64-gnu@4.46.2':
     resolution: {integrity: sha512-32k4ENb5ygtkMwPMucAb8MtV8olkPT03oiTxJbgkJa7lJ7dZMr0GCFJlyvy+K8iq7F/iuOr41ZdUHaOiqyR3iQ==}
     cpu: [riscv64]
     os: [linux]
+    libc: [glibc]
 
   '@rollup/rollup-linux-riscv64-musl@4.46.2':
     resolution: {integrity: sha512-t5B2loThlFEauloaQkZg9gxV05BYeITLvLkWOkRXogP4qHXLkWSbSHKM9S6H1schf/0YGP/qNKtiISlxvfmmZw==}
     cpu: [riscv64]
     os: [linux]
+    libc: [musl]
 
   '@rollup/rollup-linux-s390x-gnu@4.46.2':
     resolution: {integrity: sha512-YKjekwTEKgbB7n17gmODSmJVUIvj8CX7q5442/CK80L8nqOUbMtf8b01QkG3jOqyr1rotrAnW6B/qiHwfcuWQA==}
     cpu: [s390x]
     os: [linux]
+    libc: [glibc]
 
   '@rollup/rollup-linux-x64-gnu@4.46.2':
     resolution: {integrity: sha512-Jj5a9RUoe5ra+MEyERkDKLwTXVu6s3aACP51nkfnK9wJTraCC8IMe3snOfALkrjTYd2G1ViE1hICj0fZ7ALBPA==}
     cpu: [x64]
     os: [linux]
+    libc: [glibc]
 
   '@rollup/rollup-linux-x64-musl@4.46.2':
     resolution: {integrity: sha512-7kX69DIrBeD7yNp4A5b81izs8BqoZkCIaxQaOpumcJ1S/kmqNFjPhDu1LHeVXv0SexfHQv5cqHsxLOjETuqDuA==}
     cpu: [x64]
     os: [linux]
+    libc: [musl]
 
   '@rollup/rollup-win32-arm64-msvc@4.46.2':
     resolution: {integrity: sha512-wiJWMIpeaak/jsbaq2HMh/rzZxHVW1rU6coyeNNpMwk5isiPjSTx0a4YLSlYDwBH/WBvLz+EtsNqQScZTLJy3g==}
@@ -3817,6 +3865,9 @@ packages:
   chardet@0.7.0:
     resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==}
 
+  charenc@0.0.2:
+    resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==}
+
   chokidar@3.6.0:
     resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
     engines: {node: '>= 8.10.0'}
@@ -4100,6 +4151,9 @@ packages:
   crossws@0.3.5:
     resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==}
 
+  crypt@0.0.2:
+    resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==}
+
   css-declaration-sorter@7.2.0:
     resolution: {integrity: sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==}
     engines: {node: ^14 || ^16 || >=18}
@@ -6249,6 +6303,9 @@ packages:
   mathml-tag-names@2.1.3:
     resolution: {integrity: sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==}
 
+  md5@2.3.0:
+    resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==}
+
   mdast-util-definitions@5.1.2:
     resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==}
 
@@ -7890,48 +7947,56 @@ packages:
     engines: {node: '>=14.0.0'}
     cpu: [arm64]
     os: [linux]
+    libc: glibc
 
   sass-embedded-linux-arm@1.92.1:
     resolution: {integrity: sha512-cT3w8yoQTqrtZvWLJeutEGmawITDTY4J6oSVQjeDcPnnoPt0gOFxem8YMznraACXvahw/2+KJDH33BTNgiPo0A==}
     engines: {node: '>=14.0.0'}
     cpu: [arm]
     os: [linux]
+    libc: glibc
 
   sass-embedded-linux-musl-arm64@1.92.1:
     resolution: {integrity: sha512-TfiEBkCyNzVoOhjHXUT+vZ6+p0ueDbvRw6f4jHdkvljZzXdXMby4wh7BU1odl69rgRTkSvYKhgbErRLDR/F7pQ==}
     engines: {node: '>=14.0.0'}
     cpu: [arm64]
     os: [linux]
+    libc: musl
 
   sass-embedded-linux-musl-arm@1.92.1:
     resolution: {integrity: sha512-nPBos6lI31ef2zQhqTZhFOU7ar4impJbLIax0XsqS269YsiCwjhk11VmUloJTpFlJuKMiVXNo7dPx+katxhD/Q==}
     engines: {node: '>=14.0.0'}
     cpu: [arm]
     os: [linux]
+    libc: musl
 
   sass-embedded-linux-musl-riscv64@1.92.1:
     resolution: {integrity: sha512-R+RcJA4EYpJDE9JM1GgPYgZo7x94FlxZ6jPodOQkEaZ1S9kvXVCuP5X/0PXRPhu08KJOfeMsAElzfdAjUf7KJg==}
     engines: {node: '>=14.0.0'}
     cpu: [riscv64]
     os: [linux]
+    libc: musl
 
   sass-embedded-linux-musl-x64@1.92.1:
     resolution: {integrity: sha512-/HolYRGXJjx8nLw6oj5ZrkR7PFM7X/5kE4MYZaFMpDIPIcw3bqB2fUXLo/MYlRLsw7gBAT6hJAMBrNdKuTphfw==}
     engines: {node: '>=14.0.0'}
     cpu: [x64]
     os: [linux]
+    libc: musl
 
   sass-embedded-linux-riscv64@1.92.1:
     resolution: {integrity: sha512-b9bxe0CMsbSsLx3nrR0cq8xpIkoAC6X36o4DGMITF3m2v3KsojC7ru9X0Gz+zUFr6rwpq/0lTNzFLNu6sPNo3w==}
     engines: {node: '>=14.0.0'}
     cpu: [riscv64]
     os: [linux]
+    libc: glibc
 
   sass-embedded-linux-x64@1.92.1:
     resolution: {integrity: sha512-xuiK5Jp5NldW4bvlC7AuX1Wf7o0gLZ3md/hNg+bkTvxtCDgnUHtfdo8Q+xWP11bD9QX31xXFWpmUB8UDLi6XQQ==}
     engines: {node: '>=14.0.0'}
     cpu: [x64]
     os: [linux]
+    libc: glibc
 
   sass-embedded-unknown-all@1.92.1:
     resolution: {integrity: sha512-AT9oXvtNY4N+Nd0wvoWqq9A5HjdH/X3aUH4boQUtXyaJ/9DUwnQmBpP5Gtn028ZS8exOGBdobmmWAuigv0k/OA==}
@@ -13552,6 +13617,8 @@ snapshots:
 
   chardet@0.7.0: {}
 
+  charenc@0.0.2: {}
+
   chokidar@3.6.0:
     dependencies:
       anymatch: 3.1.3
@@ -13815,6 +13882,8 @@ snapshots:
     dependencies:
       uncrypto: 0.1.3
 
+  crypt@0.0.2: {}
+
   css-declaration-sorter@7.2.0(postcss@8.5.6):
     dependencies:
       postcss: 8.5.6
@@ -16252,6 +16321,12 @@ snapshots:
 
   mathml-tag-names@2.1.3: {}
 
+  md5@2.3.0:
+    dependencies:
+      charenc: 0.0.2
+      crypt: 0.0.2
+      is-buffer: 1.1.6
+
   mdast-util-definitions@5.1.2:
     dependencies:
       '@types/mdast': 3.0.15

+ 1 - 0
src/api/index.ts

@@ -26,6 +26,7 @@ const api = axios.create({
   headers: {
       Accept: 'application/json',
       'Content-Type': 'application/json',
+      'AppTag': 'app.anycall'
       // 'accessToken': 'rcOBHJ0Hb8h5xgM/CWtNd8RBhA6WS4OPyJcxrxk4xPZtzeh5PtRXVDA7Um0NZA6NQmnbnZgWB0nNPb8iCrneQj4badFveWLrFq4LrySto3pIo/Zg1dJubbwmu3Vr1LCbSYyVIFrrgt9PXiA85kb9g38FSG3KTSi3AEY/UgjLNLBtH2+91YXKEy2KRZV3v75f',
   },
 })

+ 3 - 2
src/api/modules/user.ts

@@ -1,3 +1,4 @@
+import md5 from 'md5';
 import api from '../index'
 import { request } from '@/api'
 export default {
@@ -6,9 +7,9 @@ export default {
     account: string
     password: string
   }) => {
-    return request<string>('/share/user/backPasswordLogin', {
+    return request<string>('/adm_account/signInWithPassword', {
       account: data.account,
-      passWord: data.password
+      password: md5(data.password)
     })
   },
 

+ 17 - 9
src/api/modules/voice.ts

@@ -1,42 +1,50 @@
 // anycall
 import { request } from '@/api'
-import type { TAgent } from '@/types/role'
 import type { TVoice } from '@/types/voice'
+import type { TVoiceTypeNumber } from '@/constants/voiceTypes'
 
 
 
 // 克隆声音
 
-export function cloneVoice(params: {name: string, gender?: number, audioUrl: string}){
+export function cloneVoice(params: {name: string, gender?: number, audioUrl: string, feature?: string}){
   // return request(`/anycall/cloneVoice`, params)
-  return request(`/anycall/admin/cloneVoice`, params)
+  return request(`/share/adm_voice/clone`, params)
 }
 
-
+// 编辑声音
 export function updateVoice(params: {
     "id": string,
     "name": string,
     "photoUrl": string,
     "feature": string
 }){
-  return request(`/voice/update`, params)
+  return request(`/share/adm_voice/update`, params)
 }
 
+// 音色列表
 export function voiceList(params: {
   page: number,
   size: number,
   gender?: number|null,
-  system?: boolean,
+  type?: TVoiceTypeNumber, // 1、系统音色;2、管理员克隆;3、用户克隆
 }){
   return request<{
     total: number,
     content: TVoice[]
-  }>(`/voice/select`, params)
+  }>(`/share/adm_voice/search`, params)
 }
 
-// 激活声音
+// 音色激活
 export function activeVoice(params: {
   id: string,
 }){
-  return request(`/anycall/activeVoice`, params)
+  return request(`/share/adm_voice/active`, params)
+}
+
+// 删除音色
+export function deleteVoice(params: {
+  id: string,
+}){
+  return request(`/share/adm_voice/delete`, params)
 }

+ 5 - 5
src/components/AccountForm/LoginForm.vue

@@ -73,15 +73,15 @@ function testAccount(account: string) {
 </script>
 
 <template>
-  <div class="min-h-[500px] w-full flex flex-col items-center justify-center p-12">
-    <div class="mb-6 space-y-2">
+  <div class="min-h-[500px] w-full flex flex-col justify-center p-12">
+    <!-- <div class="mb-6 space-y-2">
       <h3 class="text-4xl text-[var(--el-text-color-primary)] font-bold">
         欢迎使用 👋🏻
       </h3>
       <p class="text-sm text-muted-foreground lg:text-base">
         {{ title }}
       </p>
-    </div>
+    </div> -->
     <div class="mb-4">
       <FaTabs
         v-model="type"
@@ -155,14 +155,14 @@ function testAccount(account: string) {
               </FormItem>
             </FormField>
           </div>
-          <FaButton
+          <!-- <FaButton
             variant="link"
             class="h-auto p-0"
             type="button"
             @click="emits('onResetPassword', form.values.account)"
           >
             忘记密码了?
-          </FaButton>
+          </FaButton> -->
         </div>
 
         <ElButton

+ 0 - 108
src/constant/languageList.ts

@@ -1,108 +0,0 @@
-export const languageList = [
-  { localName: "العربية", languageName: "Arabic (Israel)", chineseName: "阿拉伯语(以色列)", countryCode: "ar_IL" },
-  { localName: "العربية", languageName: "Arabic (Egypt)", chineseName: "阿拉伯语(埃及)", countryCode: "ar_EG" },
-  { localName: "中文", languageName: "Chinese Simplified", chineseName: "中文简体", countryCode: "zh_CN" },
-  { localName: "中文", languageName: "Chinese Tradition", chineseName: "中文繁体", countryCode: "zh_TW" },
-  { localName: "中文", languageName: "Chinese", chineseName: "中文(香港)", countryCode: "zh_HK" },
-  { localName: "Nederlands", languageName: "Dutch (Netherlands)", chineseName: "荷兰语", countryCode: "nl_NL" },
-  { localName: "Nederlands", languageName: "Dutch (Belgium)", chineseName: "荷兰语(比利时)", countryCode: "nl_BE" },
-  { localName: "English", languageName: "English (United States)", chineseName: "英语(美国)", countryCode: "en_US" },
-  { localName: "English", languageName: "English (Australia)", chineseName: "英语(澳大利亚)", countryCode: "en_AU" },
-  { localName: "English", languageName: "English (Canada)", chineseName: "英语(加拿大)", countryCode: "en_CA" },
-  { localName: "English", languageName: "English (India)", chineseName: "英语(印度)", countryCode: "en_IN" },
-  { localName: "English", languageName: "English (Ireland)", chineseName: "英语(爱尔兰)", countryCode: "en_IE" },
-  { localName: "English", languageName: "English (New Zealand)", chineseName: "英语(新西兰)", countryCode: "en_NZ" },
-  { localName: "English", languageName: "English (Singapore)", chineseName: "英语(新加坡)", countryCode: "en_SG" },
-  { localName: "English", languageName: "English (South Africa)", chineseName: "英语(南非)", countryCode: "en_ZA" },
-  { localName: "English", languageName: "English (United Kingdom)", chineseName: "英语(英国)", countryCode: "en_GB" },
-  { localName: "Français", languageName: "French", chineseName: "法语", countryCode: "fr_FR" },
-  { localName: "Français", languageName: "French (Belgium)", chineseName: "法语(比利时)", countryCode: "fr_BE" },
-  { localName: "Français", languageName: "French (Canada)", chineseName: "法语(加拿大)", countryCode: "fr_CA" },
-  { localName: "Français", languageName: "French (Switzerland)", chineseName: "法语(瑞士)", countryCode: "fr_CH" },
-  { localName: "Deutsch", languageName: "German", chineseName: "德语", countryCode: "de_DE" },
-  { localName: "Deutsch", languageName: "German (Liechtenstein)", chineseName: "德语(列支敦士登)", countryCode: "de_LI" },
-  { localName: "Deutsch", languageName: "German (Austria)", chineseName: "德语(奥地利)", countryCode: "de_AT" },
-  { localName: "Deutsch", languageName: "German (Switzerland)", chineseName: "德语(瑞士)", countryCode: "de_CH" },
-  { localName: "Italiano", languageName: "Italian", chineseName: "意大利语", countryCode: "it_IT" },
-  { localName: "Italiano", languageName: "Italian (Switzerland)", chineseName: "意大利语(瑞士)", countryCode: "it_CH" },
-  { localName: "Português", languageName: "Portuguese (Brazil)", chineseName: "葡萄牙语(巴西)", countryCode: "pt_BR" },
-  { localName: "Português", languageName: "Portuguese", chineseName: "葡萄牙语", countryCode: "pt_PT" },
-  { localName: "Español", languageName: "Spanish", chineseName: "西班牙语", countryCode: "es_ES" },
-  { localName: "Español", languageName: "Spanish (United States)", chineseName: "西班牙语(美国)", countryCode: "es_US" },
-  { localName: "বাংলা", languageName: "Bengali", chineseName: "孟加拉语", countryCode: "bn_BD" },
-  { localName: "বাংলা", languageName: "Bengali (India)", chineseName: "孟加拉语(印度)", countryCode: "bn_IN" },
-  { localName: "hrvatski", languageName: "Croatian", chineseName: "克罗地亚语", countryCode: "hr_HR" },
-  { localName: "čeština", languageName: "Czech", chineseName: "捷克语", countryCode: "cs_CZ" },
-  { localName: "Dansk", languageName: "Danish", chineseName: "丹麦语", countryCode: "da_DK" },
-  { localName: "ελληνικά", languageName: "Greek", chineseName: "希腊语", countryCode: "el_GR" },
-  { localName: "עברית", languageName: "Hebrew (Israel)", chineseName: "希伯来语(以色列)", countryCode: "he_IL" },
-  { localName: "עברית", languageName: "Hebrew (Israel)", chineseName: "希伯来语(以色列)", countryCode: "iw_IL" },
-  { localName: "हिंदी", languageName: "Hindi", chineseName: "印度语", countryCode: "hi_IN" },
-  { localName: "Magyar", languageName: "Hungarian", chineseName: "匈牙利语", countryCode: "hu_HU" },
-  { localName: "", languageName: "Indonesian", chineseName: "印度尼西亚语", countryCode: "in_ID" },
-  { localName: "日本語", languageName: "Japanese", chineseName: "日语", countryCode: "ja_JP" },
-  { localName: "한국어", languageName: "Korean", chineseName: "韩语(朝鲜语)", countryCode: "ko_KR" },
-  { localName: "Bahasa Melayu", languageName: "Malay", chineseName: "马来语", countryCode: "ms_MY" },
-  { localName: "فارسی", languageName: "Persian", chineseName: "波斯语", countryCode: "fa_IR" },
-  { localName: "Polski", languageName: "Polish", chineseName: "波兰语", countryCode: "pl_PL" },
-  { localName: "româna", languageName: "Romanian", chineseName: "罗马尼亚语", countryCode: "ro_RO" },
-  { localName: "Русский", languageName: "Russian", chineseName: "俄罗斯语", countryCode: "ru_RU" },
-  { localName: "српски", languageName: "Serbian", chineseName: "塞尔维亚语", countryCode: "sr_RS" },
-  { localName: "Svenska", languageName: "Swedish", chineseName: "瑞典语", countryCode: "sv_SE" },
-  { localName: "ไทย", languageName: "Thai", chineseName: "泰语", countryCode: "th_TH" },
-  { localName: "Türkçe", languageName: "Turkish", chineseName: "土耳其语", countryCode: "tr_TR" },
-  { localName: "اردو", languageName: "Urdu", chineseName: "乌尔都语", countryCode: "ur_PK" },
-  { localName: "tiếng việt", languageName: "Vietnamese", chineseName: "越南语", countryCode: "vi_VN" },
-  { localName: "català", languageName: "Catalan", chineseName: "加泰隆语(西班牙)", countryCode: "ca_ES" },
-  { localName: "latviešu", languageName: "Latvian", chineseName: "拉脱维亚语", countryCode: "lv_LV" },
-  { localName: "Lietuvių", languageName: "Lithuanian", chineseName: "立陶宛语", countryCode: "lt_LT" },
-  { localName: "Norsk bokmål", languageName: "Norwegian", chineseName: "挪威语", countryCode: "nb_NO" },
-  { localName: "Slovenčina", languageName: "Slovak", chineseName: "斯洛伐克语", countryCode: "sk_SK" },
-  { localName: "Slovenščina", languageName: "Slovenian", chineseName: "斯洛文尼亚语", countryCode: "sl_SI" },
-  { localName: "български", languageName: "Bulgarian", chineseName: "保加利亚语", countryCode: "bg_BG" },
-  { localName: "українська", languageName: "Ukrainian", chineseName: "乌克兰语", countryCode: "uk_UA" },
-  { localName: "Tagalog", languageName: "Filipino", chineseName: "菲律宾语", countryCode: "tl_PH" },
-  { localName: "Suomi", languageName: "Finnish", chineseName: "芬兰语", countryCode: "fi_FI" },
-  { localName: "Afrikaans", languageName: "Afrikaans", chineseName: "南非语", countryCode: "af_ZA" },
-  { localName: "Rumantsch", languageName: "Romansh", chineseName: "罗曼什语(瑞士)", countryCode: "rm_CH" },
-  { localName: "ဗမာ", languageName: "Burmese (Zawgyi)", chineseName: "缅甸语(民间)", countryCode: "my_ZG" },
-  { localName: "ဗမာ", languageName: "Burmese (Padauk)", chineseName: "缅甸语(官方)", countryCode: "my_MM" },
-  { localName: "ខ្មែរ", languageName: "Khmer", chineseName: "柬埔寨语", countryCode: "km_KH" },
-  { localName: "አማርኛ", languageName: "Amharic", chineseName: "阿姆哈拉语(埃塞俄比亚)", countryCode: "am_ET" },
-  { localName: "беларуская", languageName: "Belarusian", chineseName: "白俄罗斯语", countryCode: "be_BY" },
-  { localName: "eesti", languageName: "Estonian", chineseName: "爱沙尼亚语", countryCode: "et_EE" },
-  { localName: "Kiswahili", languageName: "Swahili", chineseName: "斯瓦希里语(坦桑尼亚)", countryCode: "sw_TZ" },
-  { localName: "isiZulu", languageName: "Zulu", chineseName: "祖鲁语(南非)", countryCode: "zu_ZA" },
-  { localName: "azərbaycanca", languageName: "Azerbaijani", chineseName: "阿塞拜疆语", countryCode: "az_AZ" },
-  { localName: "Հայերէն", languageName: "Armenian", chineseName: "亚美尼亚语(亚美尼亚)", countryCode: "hy_AM" },
-  { localName: "ქართული", languageName: "Georgian", chineseName: "格鲁吉亚语(格鲁吉亚)", countryCode: "ka_GE" },
-  { localName: "ລາວ", languageName: "Laotian", chineseName: "老挝语(老挝)", countryCode: "lo_LA" },
-  { localName: "Монгол", languageName: "Mongolian", chineseName: "蒙古语", countryCode: "mn_MN" },
-  { localName: "नेपाली", languageName: "Nepali", chineseName: "尼泊尔语", countryCode: "ne_NP" },
-  { localName: "қазақ тілі", languageName: "Kazakh", chineseName: "哈萨克语", countryCode: "kk_KZ" },
-  { localName: "Galego", languageName: "Galician", chineseName: "加利西亚语", countryCode: "gl_ES" },
-  { localName: "íslenska", languageName: "Icelandic", chineseName: "冰岛语", countryCode: "is_IS" },
-  { localName: "ಕನ್ನಡ", languageName: "Kannada", chineseName: "坎纳达语", countryCode: "kn_IN" },
-  { localName: "кыргыз тили", languageName: "Kyrgyz", chineseName: "吉尔吉斯语", countryCode: "ky_KG" },
-  { localName: "മലയാളം", languageName: "Malayalam", chineseName: "马拉亚拉姆语", countryCode: "ml_IN" },
-  { localName: "मराठी", languageName: "Marathi", chineseName: "马拉提语", countryCode: "mr_IN" },
-  { localName: "தமிழ்", languageName: "Tamil", chineseName: "泰米尔语", countryCode: "ta_IN" },
-  { localName: "македонски јазик", languageName: "Macedonian", chineseName: "马其顿语", countryCode: "mk_MK" },
-  { localName: "తెలుగు", languageName: "Telugu", chineseName: "泰卢固语", countryCode: "te_IN" },
-  { localName: "Ўзбек тили", languageName: "Uzbek", chineseName: "乌兹别克语", countryCode: "uz_UZ" },
-  { localName: "Euskara", languageName: "Basque", chineseName: "巴斯克语", countryCode: "eu_ES" },
-  { localName: "සිංහල", languageName: "Sinhala", chineseName: "僧加罗语(斯里兰卡)", countryCode: "si_LK" }
-];
-
-// 使用示例:
-// 1. 获取所有国家码数组
-export const countryCodes = languageList.map(item => item.countryCode);
-
-// 2. 根据国家码查找语言信息
-export const getLanguageInfo = (code: string) => languageList.find(item => item.countryCode === code);
-
-// 3. 获取中文语言名称映射
-// export const chineseLanguageMap: Record<string, string> = {};
-// languageList.forEach(item => {
-//   chineseLanguageMap[item.countryCode] = item.chineseName;
-// });

+ 53 - 0
src/constants/voiceTypes.ts

@@ -0,0 +1,53 @@
+/**
+ * 语音类型枚举 - 数字值对应后端存储
+ * 展示值通过 `getVoiceTypeLabel()` 方法转换
+ * 1、系统音色;2、管理员克隆;3、用户克隆
+ */
+export enum EVoiceType {
+  SYSTEM = 1,
+  ADMIN_CLONE = 2,
+  USER_CLONE = 3
+}
+
+// 基础类型:严格推导,无需冗余处理
+export type TVoiceTypeNumber = EVoiceType;     // 数字类型 1 | 2 | 3(枚举本质就是联合类型)
+export type TVoiceTypeValue = `${EVoiceType}`; // 字符串数字类型 "1" | "2" | "3"(模板字符串类型自动推导)
+
+// 中文映射(用于前端展示)
+// 优化:用 as const 确保 key 是枚举字面量,无需 Record 显式声明,类型更严格
+export const VOICE_TYPE_LABELS = Object.freeze({
+  [EVoiceType.SYSTEM]: '系统音色',
+  [EVoiceType.ADMIN_CLONE]: '管理员克隆',
+  [EVoiceType.USER_CLONE]: '用户克隆',
+} as const);
+
+// 预生成的下拉选项
+export const VOICE_TYPE_OPTIONS =
+  Object.values(EVoiceType)
+  .filter((v): v is TVoiceTypeNumber => typeof v === 'number') // 筛选数字值(排除反向映射)
+  .map((value) => ({
+    label: VOICE_TYPE_LABELS[value], // 类型安全:value 是枚举值,确保 label 存在
+    value,
+  }))
+
+
+// 工具函数
+// 优化1:完善边界处理,非法值返回默认提示
+// 优化2:简化类型转换逻辑,移除冗余断言
+export function getVoiceTypeLabel(
+  type: TVoiceTypeNumber | TVoiceTypeValue | undefined | null,
+): string {
+  // 空值处理
+  if (type == null) return '未知音色';
+
+  // 统一转换为数字类型的枚举值
+  const enumKey = typeof type === 'string' ? Number(type) : type;
+
+  // 合法值校验(运行时兜底,避免非法数字传入)
+  if (Object.values(EVoiceType).includes(enumKey)) {
+    return VOICE_TYPE_LABELS[enumKey as keyof typeof VOICE_TYPE_LABELS];
+  }
+
+  // 非法值兜底
+  return '未知音色';
+}

+ 4 - 3
src/views/login.vue

@@ -32,8 +32,7 @@ const formType = ref<'login' | 'register' | 'resetPassword'>('login')
   </div>
   <div class="login-box">
     <div class="login-banner">
-      <img src="@/assets/images/logo.svg" class="absolute inset-s-4 inset-t-4 h-8 rounded">
-      <img src="@/assets/images/login-banner.png" class="banner">
+      <h1 class="text-4xl text-[var(--el-text-color-primary)] font-bold">AnyCall</h1>
     </div>
     <div class="login-form flex-col-center">
       <Transition name="fade" mode="out-in">
@@ -129,7 +128,9 @@ const formType = ref<'login' | 'register' | 'resetPassword'>('login')
     position: relative;
     width: 450px;
     overflow: hidden;
-
+    display: flex;
+    align-items: center;
+    justify-content: center;
     &::before {
       position: absolute;
       width: 100%;

+ 6 - 3
src/views/voice-management/components/SearchForm.vue

@@ -2,6 +2,9 @@
 import { Refresh, Search } from '@element-plus/icons-vue'
 import { ElButton, ElCol, ElForm, ElFormItem, ElInput, ElOption, ElRow, ElSelect } from 'element-plus'
 import { ref } from 'vue'
+
+import { VOICE_TYPE_OPTIONS } from '@/constants/voiceTypes'
+
 export type TSearchParams = {
   name: string,
   type: number
@@ -51,6 +54,7 @@ function handleClear() {
   // 清空后自动触发搜索
   handleSearch()
 }
+
 </script>
 
 <template>
@@ -65,11 +69,10 @@ function handleClear() {
               <ElOption :value="2" label="女">女</ElOption>
             </ElSelect>
           </ElFormItem>
+
           <ElFormItem label="类型" prop="type" label-width="120" >
             <ElSelect v-model="searchParams.type" style="width: 120px;">
-              <ElOption :value="1" label="系统">系统</ElOption>
-              <ElOption :value="2" label="系统克隆">系统克隆</ElOption>
-              <ElOption :value="3" label="用户">用户</ElOption>
+              <ElOption :value="item.value" :label="item.label" v-for="item in VOICE_TYPE_OPTIONS">{{ item.label }}</ElOption>
             </ElSelect>
           </ElFormItem>
           <ElFormItem >

+ 0 - 1
src/views/voice-management/index.vue

@@ -79,7 +79,6 @@ async function fetchData() {
   const gender = searchParams.value.gender === -1 ? null : searchParams.value.gender
   const res = await voiceList({
     gender,
-    system: searchParams.value.type === 1 ? true : false,
     name: searchParams.value.name,
     type: searchParams.value.type,
     page: pagination.value.page,