控制台-统计信息

This commit is contained in:
2026-01-29 16:45:29 +08:00
parent c3480a0a4a
commit b4219e2d2b
7 changed files with 892 additions and 85 deletions

View File

@@ -20,6 +20,7 @@
}, },
"dependencies": { "dependencies": {
"@ant-design/icons": "^6.1.0", "@ant-design/icons": "^6.1.0",
"@ant-design/plots": "^2.6.8",
"antd": "^6.1.4", "antd": "^6.1.4",
"big.js": "^7.0.1", "big.js": "^7.0.1",
"dayjs": "^1.11.19", "dayjs": "^1.11.19",

656
pnpm-lock.yaml generated
View File

@@ -11,6 +11,9 @@ importers:
'@ant-design/icons': '@ant-design/icons':
specifier: ^6.1.0 specifier: ^6.1.0
version: 6.1.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) version: 6.1.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
'@ant-design/plots':
specifier: ^2.6.8
version: 2.6.8(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
antd: antd:
specifier: ^6.1.4 specifier: ^6.1.4
version: 6.1.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3) version: 6.1.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
@@ -75,6 +78,12 @@ importers:
packages: packages:
'@ant-design/charts-util@0.0.3':
resolution: {integrity: sha512-x1H7UT6t4dXAyGRoHqlOnEsEqBSTANFGTZEAMI0CWYhYUpp13n0o9grl9oPtoL6FEQMjUBTY+zGJKlHkz8smMw==}
peerDependencies:
react: '>=16.8.4'
react-dom: '>=16.8.4'
'@ant-design/colors@8.0.0': '@ant-design/colors@8.0.0':
resolution: {integrity: sha512-6YzkKCw30EI/E9kHOIXsQDHmMvTllT8STzjMb4K2qzit33RW2pqCJP0sk+hidBntXxE+Vz4n1+RvCTfBw6OErw==} resolution: {integrity: sha512-6YzkKCw30EI/E9kHOIXsQDHmMvTllT8STzjMb4K2qzit33RW2pqCJP0sk+hidBntXxE+Vz4n1+RvCTfBw6OErw==}
@@ -104,12 +113,66 @@ packages:
react: '>=16.0.0' react: '>=16.0.0'
react-dom: '>=16.0.0' react-dom: '>=16.0.0'
'@ant-design/plots@2.6.8':
resolution: {integrity: sha512-QsunUs2d5rbq/1BwVhga/siA5H50OaG23YopMYwPD4sPsza6NQzPQ8FM3elNIsD/BIk298tihqX1cJ/MmvVJbQ==}
peerDependencies:
react: '>=16.8.4'
react-dom: '>=16.8.4'
'@ant-design/react-slick@2.0.0': '@ant-design/react-slick@2.0.0':
resolution: {integrity: sha512-HMS9sRoEmZey8LsE/Yo6+klhlzU12PisjrVcydW3So7RdklyEd2qehyU6a7Yp+OYN72mgsYs3NFCyP2lCPFVqg==} resolution: {integrity: sha512-HMS9sRoEmZey8LsE/Yo6+klhlzU12PisjrVcydW3So7RdklyEd2qehyU6a7Yp+OYN72mgsYs3NFCyP2lCPFVqg==}
peerDependencies: peerDependencies:
react: ^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react: ^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
react-dom: ^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
'@antv/component@2.1.11':
resolution: {integrity: sha512-dTdz8VAd3rpjOaGEZTluz82mtzrP4XCtNlNQyrxY7VNRNcjtvpTLDn57bUL2lRu1T+iklKvgbE2llMriWkq9vQ==}
'@antv/coord@0.4.7':
resolution: {integrity: sha512-UTbrMLhwJUkKzqJx5KFnSRpU3BqrdLORJbwUbHK2zHSCT3q3bjcFA//ZYLVfIlwqFDXp/hzfMyRtp0c77A9ZVA==}
'@antv/event-emitter@0.1.3':
resolution: {integrity: sha512-4ddpsiHN9Pd4UIlWuKVK1C4IiZIdbwQvy9i7DUSI3xNJ89FPUFt8lxDYj8GzzfdllV0NkJTRxnG+FvLk0llidg==}
'@antv/expr@1.0.2':
resolution: {integrity: sha512-vrfdmPHkTuiS5voVutKl2l06w1ihBh9A8SFdQPEE+2KMVpkymzGOF1eWpfkbGZ7tiFE15GodVdhhHomD/hdIwg==}
'@antv/g-canvas@2.2.0':
resolution: {integrity: sha512-h7zVBBo2aO64DuGKvq9sG+yTU3sCUb9DALCVm7nz8qGPs8hhLuFOkKPEzUDNfNYZGJUGzY8UDtJ3QRGRFcvEQg==}
'@antv/g-lite@2.7.0':
resolution: {integrity: sha512-uSzgHYa5bwR5L2Au7/5tsOhFmXKZKLPBH90+Q9bP9teVs5VT4kOAi0isPSpDI8uhdDC2/VrfTWu5K9HhWI6FWw==}
'@antv/g-math@3.1.0':
resolution: {integrity: sha512-DtN1Gj/yI0UiK18nSBsZX8RK0LszGwqfb+cBYWgE+ddyTm8dZnW4tPUhV7QXePsS6/A5hHC+JFpAAK7OEGo5ZQ==}
'@antv/g-plugin-dragndrop@2.1.1':
resolution: {integrity: sha512-+aesDUJVQDs6UJ2bOBbDlaGAPCfHmU0MbrMTlQlfpwNplWueqtgVAZ3L57oZ2ZGHRWUHiRwZGPjXMBM3O2LELw==}
'@antv/g2-extension-plot@0.2.2':
resolution: {integrity: sha512-KJXCXO7as+h0hDqirGXf1omrNuYzQmY3VmBmp7lIvkepbQ7sz3pPwy895r1FWETGF3vTk5UeFcAF5yzzBHWgbw==}
'@antv/g2@5.4.8':
resolution: {integrity: sha512-IvgIpwmT4M5/QAd3Mn2WiHIDeBqFJ4WA2gcZhRRSZuZ2KmgCqZWZwwIT0hc+kIGxwYeDoCQqf//t6FMVu3ryBg==}
'@antv/g@6.3.1':
resolution: {integrity: sha512-WYEKqy86LHB2PzTmrZXrIsIe+3Epeds2f68zceQ+BJtRoGki7Sy4IhlC8LrUMztgfT1t3d/0L745NWZwITroKA==}
'@antv/scale@0.4.16':
resolution: {integrity: sha512-5wg/zB5kXHxpTV5OYwJD3ja6R8yTiqIOkjOhmpEJiowkzRlbEC/BOyMvNUq5fqFIHnMCE9woO7+c3zxEQCKPjw==}
'@antv/scale@0.5.2':
resolution: {integrity: sha512-rTHRAwvpHWC5PGZF/mJ2ZuTDqwwvVBDRph0Uu5PV9BXwzV7K8+9lsqGJ+XHVLxe8c6bKog5nlzvV/dcYb0d5Ow==}
'@antv/util@2.0.17':
resolution: {integrity: sha512-o6I9hi5CIUvLGDhth0RxNSFDRwXeywmt6ExR4+RmVAzIi48ps6HUy+svxOCayvrPBN37uE6TAc2KDofRo0nK9Q==}
'@antv/util@3.3.11':
resolution: {integrity: sha512-FII08DFM4ABh2q5rPYdr0hMtKXRgeZazvXaFYCs7J7uTcWDHUhczab2qOCJLNDugoj8jFag1djb7wS9ehaRYBg==}
'@antv/vendor@1.0.11':
resolution: {integrity: sha512-LmhPEQ+aapk3barntaiIxJ5VHno/Tyab2JnfdcPzp5xONh/8VSfed4bo/9xKo5HcUAEydko38vYLfj6lJliLiw==}
'@babel/code-frame@7.27.1': '@babel/code-frame@7.27.1':
resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==}
engines: {node: '>=6.9.0'} engines: {node: '>=6.9.0'}
@@ -966,9 +1029,69 @@ packages:
'@types/big.js@6.2.2': '@types/big.js@6.2.2':
resolution: {integrity: sha512-e2cOW9YlVzFY2iScnGBBkplKsrn2CsObHQ2Hiw4V1sSyiGbgWL8IyqE3zFi1Pt5o1pdAtYkDAIsF3KKUPjdzaA==} resolution: {integrity: sha512-e2cOW9YlVzFY2iScnGBBkplKsrn2CsObHQ2Hiw4V1sSyiGbgWL8IyqE3zFi1Pt5o1pdAtYkDAIsF3KKUPjdzaA==}
'@types/d3-array@3.2.2':
resolution: {integrity: sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==}
'@types/d3-color@3.1.3':
resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==}
'@types/d3-dispatch@3.0.7':
resolution: {integrity: sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==}
'@types/d3-dsv@3.0.7':
resolution: {integrity: sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==}
'@types/d3-ease@3.0.2':
resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==}
'@types/d3-fetch@3.0.7':
resolution: {integrity: sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==}
'@types/d3-force@3.0.10':
resolution: {integrity: sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==}
'@types/d3-format@3.0.4':
resolution: {integrity: sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==}
'@types/d3-geo@3.1.0':
resolution: {integrity: sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==}
'@types/d3-hierarchy@3.1.7':
resolution: {integrity: sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==}
'@types/d3-interpolate@3.0.4':
resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==}
'@types/d3-path@3.1.1':
resolution: {integrity: sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==}
'@types/d3-quadtree@3.0.6':
resolution: {integrity: sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==}
'@types/d3-random@3.0.3':
resolution: {integrity: sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==}
'@types/d3-scale-chromatic@3.1.0':
resolution: {integrity: sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==}
'@types/d3-scale@4.0.9':
resolution: {integrity: sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==}
'@types/d3-shape@3.1.8':
resolution: {integrity: sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==}
'@types/d3-time@3.0.4':
resolution: {integrity: sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==}
'@types/d3-timer@3.0.2':
resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==}
'@types/estree@1.0.8': '@types/estree@1.0.8':
resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
'@types/geojson@7946.0.16':
resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==}
'@types/node@25.0.3': '@types/node@25.0.3':
resolution: {integrity: sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA==} resolution: {integrity: sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA==}
@@ -1003,6 +1126,10 @@ packages:
react: '>=18.0.0' react: '>=18.0.0'
react-dom: '>=18.0.0' react-dom: '>=18.0.0'
base64-arraybuffer@1.0.2:
resolution: {integrity: sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==}
engines: {node: '>= 0.6.0'}
baseline-browser-mapping@2.9.11: baseline-browser-mapping@2.9.11:
resolution: {integrity: sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==} resolution: {integrity: sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==}
hasBin: true hasBin: true
@@ -1041,15 +1168,124 @@ packages:
color-name@1.1.4: color-name@1.1.4:
resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
color-string@1.9.1:
resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==}
commander@7.2.0:
resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==}
engines: {node: '>= 10'}
compute-scroll-into-view@3.1.1: compute-scroll-into-view@3.1.1:
resolution: {integrity: sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==} resolution: {integrity: sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==}
convert-source-map@2.0.0: convert-source-map@2.0.0:
resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
css-line-break@2.1.0:
resolution: {integrity: sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==}
csstype@3.2.3: csstype@3.2.3:
resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==}
d3-array@3.2.4:
resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==}
engines: {node: '>=12'}
d3-binarytree@1.0.2:
resolution: {integrity: sha512-cElUNH+sHu95L04m92pG73t2MEJXKu+GeKUN1TJkFsu93E5W8E9Sc3kHEGJKgenGvj19m6upSn2EunvMgMD2Yw==}
d3-color@3.1.0:
resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==}
engines: {node: '>=12'}
d3-dispatch@3.0.1:
resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==}
engines: {node: '>=12'}
d3-dsv@3.0.1:
resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==}
engines: {node: '>=12'}
hasBin: true
d3-ease@3.0.1:
resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==}
engines: {node: '>=12'}
d3-fetch@3.0.1:
resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==}
engines: {node: '>=12'}
d3-force-3d@3.0.6:
resolution: {integrity: sha512-4tsKHUPLOVkyfEffZo1v6sFHvGFwAIIjt/W8IThbp08DYAsXZck+2pSHEG5W1+gQgEvFLdZkYvmJAbRM2EzMnA==}
engines: {node: '>=12'}
d3-force@3.0.0:
resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==}
engines: {node: '>=12'}
d3-format@3.1.2:
resolution: {integrity: sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==}
engines: {node: '>=12'}
d3-geo-projection@4.0.0:
resolution: {integrity: sha512-p0bK60CEzph1iqmnxut7d/1kyTmm3UWtPlwdkM31AU+LW+BXazd5zJdoCn7VFxNCHXRngPHRnsNn5uGjLRGndg==}
engines: {node: '>=12'}
hasBin: true
d3-geo@3.1.1:
resolution: {integrity: sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==}
engines: {node: '>=12'}
d3-hierarchy@3.1.2:
resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==}
engines: {node: '>=12'}
d3-interpolate@3.0.1:
resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==}
engines: {node: '>=12'}
d3-octree@1.1.0:
resolution: {integrity: sha512-F8gPlqpP+HwRPMO/8uOu5wjH110+6q4cgJvgJT6vlpy3BEaDIKlTZrgHKZSp/i1InRpVfh4puY/kvL6MxK930A==}
d3-path@3.1.0:
resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==}
engines: {node: '>=12'}
d3-quadtree@3.0.1:
resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==}
engines: {node: '>=12'}
d3-random@3.0.1:
resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==}
engines: {node: '>=12'}
d3-regression@1.3.10:
resolution: {integrity: sha512-PF8GWEL70cHHWpx2jUQXc68r1pyPHIA+St16muk/XRokETzlegj5LriNKg7o4LR0TySug4nHYPJNNRz/W+/Niw==}
d3-scale-chromatic@3.1.0:
resolution: {integrity: sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==}
engines: {node: '>=12'}
d3-scale@4.0.2:
resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==}
engines: {node: '>=12'}
d3-shape@3.2.0:
resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==}
engines: {node: '>=12'}
d3-time-format@4.1.0:
resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==}
engines: {node: '>=12'}
d3-time@3.1.0:
resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==}
engines: {node: '>=12'}
d3-timer@3.0.1:
resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==}
engines: {node: '>=12'}
dayjs@1.11.19: dayjs@1.11.19:
resolution: {integrity: sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==} resolution: {integrity: sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==}
@@ -1101,6 +1337,12 @@ packages:
resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
engines: {node: '>=6'} engines: {node: '>=6'}
eventemitter3@5.0.4:
resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==}
fast-deep-equal@3.1.3:
resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
fdir@6.5.0: fdir@6.5.0:
resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==}
engines: {node: '>=12.0.0'} engines: {node: '>=12.0.0'}
@@ -1110,6 +1352,13 @@ packages:
picomatch: picomatch:
optional: true optional: true
fecha@4.2.3:
resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==}
flru@1.0.2:
resolution: {integrity: sha512-kWyh8ADvHBFz6ua5xYOPnUroZTT/bwWfrCeL0Wj1dzG4/YOmOcfJ99W8dOVyyynJN35rZ9aCOtHChqQovV7yog==}
engines: {node: '>=6'}
fsevents@2.3.3: fsevents@2.3.3:
resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
@@ -1134,6 +1383,9 @@ packages:
resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
gl-matrix@3.4.4:
resolution: {integrity: sha512-latSnyDNt/8zYUB6VIJ6PCh2jBjJX6gnDsoCZ7LyW7GkqrD51EWwa9qCoGixj8YqBtETQK/xY7OmpTF8xz1DdQ==}
globals@16.5.0: globals@16.5.0:
resolution: {integrity: sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==} resolution: {integrity: sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==}
engines: {node: '>=18'} engines: {node: '>=18'}
@@ -1150,6 +1402,21 @@ packages:
resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
html2canvas@1.4.1:
resolution: {integrity: sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==}
engines: {node: '>=8.0.0'}
iconv-lite@0.6.3:
resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
engines: {node: '>=0.10.0'}
internmap@2.0.3:
resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==}
engines: {node: '>=12'}
is-arrayish@0.3.4:
resolution: {integrity: sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==}
is-docker@2.2.1: is-docker@2.2.1:
resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==}
engines: {node: '>=8'} engines: {node: '>=8'}
@@ -1252,6 +1519,9 @@ packages:
resolution: {integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==} resolution: {integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==}
engines: {node: '>= 12.0.0'} engines: {node: '>= 12.0.0'}
lodash@4.17.23:
resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==}
lru-cache@5.1.1: lru-cache@5.1.1:
resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
@@ -1278,6 +1548,9 @@ packages:
resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==}
engines: {node: '>=12'} engines: {node: '>=12'}
pdfast@0.2.0:
resolution: {integrity: sha512-cq6TTu6qKSFUHwEahi68k/kqN2mfepjkGrG9Un70cgdRRKLKY6Rf8P8uvP2NvZktaQZNF3YE7agEkLj0vGK9bA==}
picocolors@1.1.1: picocolors@1.1.1:
resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
@@ -1352,6 +1625,12 @@ packages:
engines: {node: '>=18.0.0', npm: '>=8.0.0'} engines: {node: '>=18.0.0', npm: '>=8.0.0'}
hasBin: true hasBin: true
rw@1.3.3:
resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==}
safer-buffer@2.1.2:
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
scheduler@0.27.0: scheduler@0.27.0:
resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==}
@@ -1378,6 +1657,9 @@ packages:
resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
simple-swizzle@0.2.4:
resolution: {integrity: sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==}
source-map-js@1.2.1: source-map-js@1.2.1:
resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
@@ -1400,6 +1682,12 @@ packages:
stylis@4.3.6: stylis@4.3.6:
resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==} resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==}
svg-path-parser@1.1.0:
resolution: {integrity: sha512-jGCUqcQyXpfe38R7RFfhrMyfXcBmpMNJI/B+4CE9/Unkh98UporAc461GTthv+TVDuZXsBx7/WiwJb1Oh4tt4A==}
text-segmentation@1.0.3:
resolution: {integrity: sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==}
throttle-debounce@5.0.2: throttle-debounce@5.0.2:
resolution: {integrity: sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==} resolution: {integrity: sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==}
engines: {node: '>=12.22'} engines: {node: '>=12.22'}
@@ -1425,6 +1713,9 @@ packages:
peerDependencies: peerDependencies:
browserslist: '>= 4.21.0' browserslist: '>= 4.21.0'
utrie@1.0.2:
resolution: {integrity: sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==}
valtio@2.3.0: valtio@2.3.0:
resolution: {integrity: sha512-1MfKNcmOIdBSatiJsYgw420n6jnD+jeoI0V+RkOQbCB0ElLh6GKUfPr0hc9uq/KBGeghivDEarRsKFFdSQQnKw==} resolution: {integrity: sha512-1MfKNcmOIdBSatiJsYgw420n6jnD+jeoI0V+RkOQbCB0ElLh6GKUfPr0hc9uq/KBGeghivDEarRsKFFdSQQnKw==}
engines: {node: '>=12.20.0'} engines: {node: '>=12.20.0'}
@@ -1516,6 +1807,12 @@ packages:
snapshots: snapshots:
'@ant-design/charts-util@0.0.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
dependencies:
lodash: 4.17.23
react: 19.2.3
react-dom: 19.2.3(react@19.2.3)
'@ant-design/colors@8.0.0': '@ant-design/colors@8.0.0':
dependencies: dependencies:
'@ant-design/fast-color': 3.0.0 '@ant-design/fast-color': 3.0.0
@@ -1553,6 +1850,17 @@ snapshots:
react: 19.2.3 react: 19.2.3
react-dom: 19.2.3(react@19.2.3) react-dom: 19.2.3(react@19.2.3)
'@ant-design/plots@2.6.8(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
dependencies:
'@ant-design/charts-util': 0.0.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
'@antv/event-emitter': 0.1.3
'@antv/g': 6.3.1
'@antv/g2': 5.4.8
'@antv/g2-extension-plot': 0.2.2
lodash: 4.17.23
react: 19.2.3
react-dom: 19.2.3(react@19.2.3)
'@ant-design/react-slick@2.0.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': '@ant-design/react-slick@2.0.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
dependencies: dependencies:
'@babel/runtime': 7.28.4 '@babel/runtime': 7.28.4
@@ -1562,6 +1870,152 @@ snapshots:
react-dom: 19.2.3(react@19.2.3) react-dom: 19.2.3(react@19.2.3)
throttle-debounce: 5.0.2 throttle-debounce: 5.0.2
'@antv/component@2.1.11':
dependencies:
'@antv/g': 6.3.1
'@antv/scale': 0.4.16
'@antv/util': 3.3.11
svg-path-parser: 1.1.0
'@antv/coord@0.4.7':
dependencies:
'@antv/scale': 0.4.16
'@antv/util': 2.0.17
gl-matrix: 3.4.4
'@antv/event-emitter@0.1.3': {}
'@antv/expr@1.0.2': {}
'@antv/g-canvas@2.2.0':
dependencies:
'@antv/g-lite': 2.7.0
'@antv/g-math': 3.1.0
'@antv/util': 3.3.11
'@babel/runtime': 7.28.4
gl-matrix: 3.4.4
tslib: 2.8.1
'@antv/g-lite@2.7.0':
dependencies:
'@antv/g-math': 3.1.0
'@antv/util': 3.3.11
'@antv/vendor': 1.0.11
'@babel/runtime': 7.28.4
eventemitter3: 5.0.4
gl-matrix: 3.4.4
tslib: 2.8.1
'@antv/g-math@3.1.0':
dependencies:
'@antv/util': 3.3.11
'@babel/runtime': 7.28.4
gl-matrix: 3.4.4
tslib: 2.8.1
'@antv/g-plugin-dragndrop@2.1.1':
dependencies:
'@antv/g-lite': 2.7.0
'@antv/util': 3.3.11
'@babel/runtime': 7.28.4
tslib: 2.8.1
'@antv/g2-extension-plot@0.2.2':
dependencies:
'@antv/g2': 5.4.8
'@antv/util': 3.3.11
'@antv/vendor': 1.0.11
'@antv/g2@5.4.8':
dependencies:
'@antv/component': 2.1.11
'@antv/coord': 0.4.7
'@antv/event-emitter': 0.1.3
'@antv/expr': 1.0.2
'@antv/g': 6.3.1
'@antv/g-canvas': 2.2.0
'@antv/g-plugin-dragndrop': 2.1.1
'@antv/scale': 0.5.2
'@antv/util': 3.3.11
'@antv/vendor': 1.0.11
flru: 1.0.2
pdfast: 0.2.0
'@antv/g@6.3.1':
dependencies:
'@antv/g-lite': 2.7.0
'@antv/util': 3.3.11
'@babel/runtime': 7.28.4
gl-matrix: 3.4.4
html2canvas: 1.4.1
'@antv/scale@0.4.16':
dependencies:
'@antv/util': 3.3.11
color-string: 1.9.1
fecha: 4.2.3
'@antv/scale@0.5.2':
dependencies:
'@antv/util': 3.3.11
color-string: 1.9.1
fecha: 4.2.3
'@antv/util@2.0.17':
dependencies:
csstype: 3.2.3
tslib: 2.8.1
'@antv/util@3.3.11':
dependencies:
fast-deep-equal: 3.1.3
gl-matrix: 3.4.4
tslib: 2.8.1
'@antv/vendor@1.0.11':
dependencies:
'@types/d3-array': 3.2.2
'@types/d3-color': 3.1.3
'@types/d3-dispatch': 3.0.7
'@types/d3-dsv': 3.0.7
'@types/d3-ease': 3.0.2
'@types/d3-fetch': 3.0.7
'@types/d3-force': 3.0.10
'@types/d3-format': 3.0.4
'@types/d3-geo': 3.1.0
'@types/d3-hierarchy': 3.1.7
'@types/d3-interpolate': 3.0.4
'@types/d3-path': 3.1.1
'@types/d3-quadtree': 3.0.6
'@types/d3-random': 3.0.3
'@types/d3-scale': 4.0.9
'@types/d3-scale-chromatic': 3.1.0
'@types/d3-shape': 3.1.8
'@types/d3-time': 3.0.4
'@types/d3-timer': 3.0.2
d3-array: 3.2.4
d3-color: 3.1.0
d3-dispatch: 3.0.1
d3-dsv: 3.0.1
d3-ease: 3.0.1
d3-fetch: 3.0.1
d3-force: 3.0.0
d3-force-3d: 3.0.6
d3-format: 3.1.2
d3-geo: 3.1.1
d3-geo-projection: 4.0.0
d3-hierarchy: 3.1.2
d3-interpolate: 3.0.1
d3-path: 3.1.0
d3-quadtree: 3.0.1
d3-random: 3.0.1
d3-regression: 1.3.10
d3-scale: 4.0.2
d3-scale-chromatic: 3.1.0
d3-shape: 3.2.0
d3-time: 3.1.0
d3-timer: 3.0.1
'@babel/code-frame@7.27.1': '@babel/code-frame@7.27.1':
dependencies: dependencies:
'@babel/helper-validator-identifier': 7.28.5 '@babel/helper-validator-identifier': 7.28.5
@@ -2346,8 +2800,58 @@ snapshots:
'@types/big.js@6.2.2': {} '@types/big.js@6.2.2': {}
'@types/d3-array@3.2.2': {}
'@types/d3-color@3.1.3': {}
'@types/d3-dispatch@3.0.7': {}
'@types/d3-dsv@3.0.7': {}
'@types/d3-ease@3.0.2': {}
'@types/d3-fetch@3.0.7':
dependencies:
'@types/d3-dsv': 3.0.7
'@types/d3-force@3.0.10': {}
'@types/d3-format@3.0.4': {}
'@types/d3-geo@3.1.0':
dependencies:
'@types/geojson': 7946.0.16
'@types/d3-hierarchy@3.1.7': {}
'@types/d3-interpolate@3.0.4':
dependencies:
'@types/d3-color': 3.1.3
'@types/d3-path@3.1.1': {}
'@types/d3-quadtree@3.0.6': {}
'@types/d3-random@3.0.3': {}
'@types/d3-scale-chromatic@3.1.0': {}
'@types/d3-scale@4.0.9':
dependencies:
'@types/d3-time': 3.0.4
'@types/d3-shape@3.1.8':
dependencies:
'@types/d3-path': 3.1.1
'@types/d3-time@3.0.4': {}
'@types/d3-timer@3.0.2': {}
'@types/estree@1.0.8': {} '@types/estree@1.0.8': {}
'@types/geojson@7946.0.16': {}
'@types/node@25.0.3': '@types/node@25.0.3':
dependencies: dependencies:
undici-types: 7.16.0 undici-types: 7.16.0
@@ -2437,6 +2941,8 @@ snapshots:
- luxon - luxon
- moment - moment
base64-arraybuffer@1.0.2: {}
baseline-browser-mapping@2.9.11: {} baseline-browser-mapping@2.9.11: {}
big.js@7.0.1: {} big.js@7.0.1: {}
@@ -2475,12 +2981,114 @@ snapshots:
color-name@1.1.4: {} color-name@1.1.4: {}
color-string@1.9.1:
dependencies:
color-name: 1.1.4
simple-swizzle: 0.2.4
commander@7.2.0: {}
compute-scroll-into-view@3.1.1: {} compute-scroll-into-view@3.1.1: {}
convert-source-map@2.0.0: {} convert-source-map@2.0.0: {}
css-line-break@2.1.0:
dependencies:
utrie: 1.0.2
csstype@3.2.3: {} csstype@3.2.3: {}
d3-array@3.2.4:
dependencies:
internmap: 2.0.3
d3-binarytree@1.0.2: {}
d3-color@3.1.0: {}
d3-dispatch@3.0.1: {}
d3-dsv@3.0.1:
dependencies:
commander: 7.2.0
iconv-lite: 0.6.3
rw: 1.3.3
d3-ease@3.0.1: {}
d3-fetch@3.0.1:
dependencies:
d3-dsv: 3.0.1
d3-force-3d@3.0.6:
dependencies:
d3-binarytree: 1.0.2
d3-dispatch: 3.0.1
d3-octree: 1.1.0
d3-quadtree: 3.0.1
d3-timer: 3.0.1
d3-force@3.0.0:
dependencies:
d3-dispatch: 3.0.1
d3-quadtree: 3.0.1
d3-timer: 3.0.1
d3-format@3.1.2: {}
d3-geo-projection@4.0.0:
dependencies:
commander: 7.2.0
d3-array: 3.2.4
d3-geo: 3.1.1
d3-geo@3.1.1:
dependencies:
d3-array: 3.2.4
d3-hierarchy@3.1.2: {}
d3-interpolate@3.0.1:
dependencies:
d3-color: 3.1.0
d3-octree@1.1.0: {}
d3-path@3.1.0: {}
d3-quadtree@3.0.1: {}
d3-random@3.0.1: {}
d3-regression@1.3.10: {}
d3-scale-chromatic@3.1.0:
dependencies:
d3-color: 3.1.0
d3-interpolate: 3.0.1
d3-scale@4.0.2:
dependencies:
d3-array: 3.2.4
d3-format: 3.1.2
d3-interpolate: 3.0.1
d3-time: 3.1.0
d3-time-format: 4.1.0
d3-shape@3.2.0:
dependencies:
d3-path: 3.1.0
d3-time-format@4.1.0:
dependencies:
d3-time: 3.1.0
d3-time@3.1.0:
dependencies:
d3-array: 3.2.4
d3-timer@3.0.1: {}
dayjs@1.11.19: {} dayjs@1.11.19: {}
debug@4.4.3: debug@4.4.3:
@@ -2541,10 +3149,18 @@ snapshots:
escalade@3.2.0: {} escalade@3.2.0: {}
eventemitter3@5.0.4: {}
fast-deep-equal@3.1.3: {}
fdir@6.5.0(picomatch@4.0.3): fdir@6.5.0(picomatch@4.0.3):
optionalDependencies: optionalDependencies:
picomatch: 4.0.3 picomatch: 4.0.3
fecha@4.2.3: {}
flru@1.0.2: {}
fsevents@2.3.3: fsevents@2.3.3:
optional: true optional: true
@@ -2572,6 +3188,8 @@ snapshots:
dunder-proto: 1.0.1 dunder-proto: 1.0.1
es-object-atoms: 1.1.1 es-object-atoms: 1.1.1
gl-matrix@3.4.4: {}
globals@16.5.0: {} globals@16.5.0: {}
gopd@1.2.0: {} gopd@1.2.0: {}
@@ -2582,6 +3200,19 @@ snapshots:
dependencies: dependencies:
function-bind: 1.1.2 function-bind: 1.1.2
html2canvas@1.4.1:
dependencies:
css-line-break: 2.1.0
text-segmentation: 1.0.3
iconv-lite@0.6.3:
dependencies:
safer-buffer: 2.1.2
internmap@2.0.3: {}
is-arrayish@0.3.4: {}
is-docker@2.2.1: {} is-docker@2.2.1: {}
is-fullwidth-code-point@3.0.0: {} is-fullwidth-code-point@3.0.0: {}
@@ -2652,6 +3283,8 @@ snapshots:
lightningcss-win32-x64-msvc: 1.30.2 lightningcss-win32-x64-msvc: 1.30.2
optional: true optional: true
lodash@4.17.23: {}
lru-cache@5.1.1: lru-cache@5.1.1:
dependencies: dependencies:
yallist: 3.1.1 yallist: 3.1.1
@@ -2672,6 +3305,8 @@ snapshots:
is-docker: 2.2.1 is-docker: 2.2.1
is-wsl: 2.2.0 is-wsl: 2.2.0
pdfast@0.2.0: {}
picocolors@1.1.1: {} picocolors@1.1.1: {}
picomatch@4.0.3: {} picomatch@4.0.3: {}
@@ -2774,6 +3409,10 @@ snapshots:
'@rollup/rollup-win32-x64-msvc': 4.55.1 '@rollup/rollup-win32-x64-msvc': 4.55.1
fsevents: 2.3.3 fsevents: 2.3.3
rw@1.3.3: {}
safer-buffer@2.1.2: {}
scheduler@0.27.0: {} scheduler@0.27.0: {}
scroll-into-view-if-needed@3.1.0: scroll-into-view-if-needed@3.1.0:
@@ -2810,6 +3449,10 @@ snapshots:
side-channel-map: 1.0.1 side-channel-map: 1.0.1
side-channel-weakmap: 1.0.2 side-channel-weakmap: 1.0.2
simple-swizzle@0.2.4:
dependencies:
is-arrayish: 0.3.4
source-map-js@1.2.1: {} source-map-js@1.2.1: {}
source-map@0.7.6: {} source-map@0.7.6: {}
@@ -2828,6 +3471,12 @@ snapshots:
stylis@4.3.6: {} stylis@4.3.6: {}
svg-path-parser@1.1.0: {}
text-segmentation@1.0.3:
dependencies:
utrie: 1.0.2
throttle-debounce@5.0.2: {} throttle-debounce@5.0.2: {}
tinyglobby@0.2.15: tinyglobby@0.2.15:
@@ -2835,8 +3484,7 @@ snapshots:
fdir: 6.5.0(picomatch@4.0.3) fdir: 6.5.0(picomatch@4.0.3)
picomatch: 4.0.3 picomatch: 4.0.3
tslib@2.8.1: tslib@2.8.1: {}
optional: true
typescript@5.9.3: {} typescript@5.9.3: {}
@@ -2848,6 +3496,10 @@ snapshots:
escalade: 3.2.0 escalade: 3.2.0
picocolors: 1.1.1 picocolors: 1.1.1
utrie@1.0.2:
dependencies:
base64-arraybuffer: 1.0.2
valtio@2.3.0(@types/react@19.2.7)(react@19.2.3): valtio@2.3.0(@types/react@19.2.7)(react@19.2.3):
dependencies: dependencies:
proxy-compare: 3.0.1 proxy-compare: 3.0.1

View File

@@ -1,7 +1,8 @@
import { DownOutlined, SettingOutlined } from '@ant-design/icons'; import { DownOutlined, SettingOutlined, UserOutlined } from '@ant-design/icons';
import { Button, Dropdown, Popconfirm, Space } from 'antd'; import { Avatar, Button, Dropdown, Popconfirm, Space } from 'antd';
import { navigate } from '@/router/routerUtils'; import { navigate } from '@/router/routerUtils';
import { useUserStore } from '@/store/UserStore'; import { useUserStore } from '@/store/UserStore';
import { imgWithPrefix } from '@/utils/common';
import { GapBox } from '../GapBox'; import { GapBox } from '../GapBox';
export const HeaderUserInfo: React.FC = () => { export const HeaderUserInfo: React.FC = () => {
@@ -14,19 +15,51 @@ export const HeaderUserInfo: React.FC = () => {
trigger={['click']} trigger={['click']}
placement='bottomRight' placement='bottomRight'
arrow arrow
getPopupContainer={(triggerNode) => triggerNode.parentElement!}
menu={{ menu={{
items: [ items: [
{ {
key: 'admin-info', key: 'admin-info',
disabled: true, // 只展示,不可操作 disabled: true,
label: ( label: (
<Space size={8} style={{ color: 'rgba(0,0,0,0.88)' }}> <div
<span> style={{
display: 'flex',
flexDirection: 'column',
alignItems: 'center',
//padding: '0px 6px', // 控制整体上下留白
}}
>
<Avatar
size={40}
src={`${imgWithPrefix(userInfo.avatar)}?v=${encodeURIComponent(userInfo.update_date)}`}
icon={<UserOutlined />}
style={{ marginBottom: 4 }} // 👈 控制头像和名字的间距
/>
<span
style={{
fontSize: 14,
lineHeight: '18px',
color: 'rgba(0,0,0,0.88)',
whiteSpace: 'nowrap',
}}
>
{userInfo.username} ({userInfo.nickname}) {userInfo.username} ({userInfo.nickname})
</span> </span>
</Space> </div>
), ),
}, },
// {
// key: 'admin-info',
// disabled: true, // 只展示,不可操作
// label: (
// <Space size={8} style={{ color: 'rgba(0,0,0,0.88)' }}>
// <span>
// {userInfo.username} ({userInfo.nickname})
// </span>
// </Space>
// ),
// },
{ {
type: 'divider', type: 'divider',
}, },

View File

@@ -33,9 +33,9 @@ const authMenu: MenuDataItem = {
{ name: '管理员信息', path: '/staff/list', auth: 'SF_ADMIN_ADMIN_VIEW' }, { name: '管理员信息', path: '/staff/list', auth: 'SF_ADMIN_ADMIN_VIEW' },
{ name: '组织架构', path: '/staff/dept', auth: 'SF_ADMIN_DEPART_VIEW' }, { name: '组织架构', path: '/staff/dept', auth: 'SF_ADMIN_DEPART_VIEW' },
{ name: '岗位角色', path: '/staff/group', auth: 'SF_ADMIN_GROUP_VIEW' }, { name: '岗位角色', path: '/staff/group', auth: 'SF_ADMIN_GROUP_VIEW' },
{ name: '我的权限', path: '/staff/auth', auth: 'SF_ADMIN_AUTH_VIEW' }, { name: '我的权限', path: '/staff/auth', auth: 'SF_ADMIN_PERM_VIEW' },
{ name: '登录日志', path: '/staff/login', auth: 'SF_LOGIN_LOG_VIEW' }, { name: '登录日志', path: '/staff/login', auth: 'SF_ADMIN_LOGIN_LOG_VIEW' },
{ name: '操作日志', path: '/staff/sys', auth: 'SF_OPERATE_LOG_VIEW' }, { name: '操作日志', path: '/staff/sys', auth: 'SF_ADMIN_SYS_LOG_VIEW' },
], ],
}; };

View File

@@ -1,18 +1,25 @@
import { Card, Col, Descriptions, Row, Tooltip } from 'antd'; import { TeamOutlined, UserOutlined } from '@ant-design/icons';
import { Line } from '@ant-design/plots';
import { Card, Col, Descriptions, Row, Statistic, Tabs, Tooltip } from 'antd';
import { useEffect, useState } from 'react'; import { useEffect, useState } from 'react';
import { DefaultERPName } from '@/configs/config'; import { DefaultERPName } from '@/configs/config';
import { HomeServices } from '@/services/HomeServices'; import { HomeServices } from '@/services/HomeServices';
import { useRequest } from '@/utils/useRequest'; import { useRequest } from '@/utils/useRequest';
const { TabPane } = Tabs;
const Index: React.FC = () => { const Index: React.FC = () => {
const [projectInfo, setProjectInfo] = useState<any>([]); // 项目信息 const [projectInfo, setProjectInfo] = useState<any>({});
const [serverInfo, setServerInfo] = useState<any>([]); // 服务器信息 const [serverInfo, setServerInfo] = useState<any>({});
const [admin, setAdminInfo] = useState<any>([]); // 登录信息 const [admin, setAdminInfo] = useState<any>({});
const [stats, setStats] = useState<any>({}); // 统计据
const { loading: listLoading, request: listRequest } = useRequest(HomeServices.index, { const { loading: listLoading, request: listRequest } = useRequest(HomeServices.index, {
onSuccessCodeZero: (res) => { onSuccessCodeZero: (res) => {
setProjectInfo(res?.data?.projectInfo || {}); setProjectInfo(res?.data?.projectInfo || {});
setServerInfo(res?.data?.serverInfo || {}); setServerInfo(res?.data?.serverInfo || {});
setAdminInfo(res?.data?.admin || {}); setAdminInfo(res?.data?.admin || {});
setStats(res?.data?.stats || {});
}, },
}); });
@@ -22,9 +29,21 @@ const Index: React.FC = () => {
} }
}, []); }, []);
const lineConfig = {
data: stats?.weekly_register,
xField: 'date',
yField: 'count',
smooth: true, // 平滑曲线
point: { size: 4, shape: 'circle' }, // 小圆点
tooltip: { showMarkers: true },
height: 300,
};
return ( return (
<div style={{ padding: 24 }}> <div style={{ padding: 24 }}>
{/* 上面登录信息 */} <Tabs defaultActiveKey='1'>
{/* Tab 1: 系统信息 */}
<TabPane tab='系统信息' key='1'>
<Card title='登录信息' style={{ marginBottom: 24 }}> <Card title='登录信息' style={{ marginBottom: 24 }}>
<Descriptions column={1}> <Descriptions column={1}>
<Descriptions.Item label='管理员'>{admin?.username}</Descriptions.Item> <Descriptions.Item label='管理员'>{admin?.username}</Descriptions.Item>
@@ -33,7 +52,6 @@ const Index: React.FC = () => {
</Descriptions> </Descriptions>
</Card> </Card>
{/* 下面两列:左服务器,右项目 */}
<Row gutter={24}> <Row gutter={24}>
<Col span={12}> <Col span={12}>
<Card title='服务器信息'> <Card title='服务器信息'>
@@ -57,21 +75,16 @@ const Index: React.FC = () => {
<Descriptions.Item label='ThinkPHP版本'>{projectInfo?.framework}</Descriptions.Item> <Descriptions.Item label='ThinkPHP版本'>{projectInfo?.framework}</Descriptions.Item>
<Descriptions.Item label='时区'>{projectInfo?.timezone}</Descriptions.Item> <Descriptions.Item label='时区'>{projectInfo?.timezone}</Descriptions.Item>
<Descriptions.Item label='是否开启调试模式'>{String(projectInfo?.debug)}</Descriptions.Item> <Descriptions.Item label='是否开启调试模式'>{String(projectInfo?.debug)}</Descriptions.Item>
<Descriptions.Item label='Storage 目录可写?'>{String(projectInfo?.storage_writable)}</Descriptions.Item> <Descriptions.Item label='Storage 目录可写?'>
{String(projectInfo?.storage_writable)}
</Descriptions.Item>
<Descriptions.Item label='Cache 目录可写?'>{String(projectInfo?.cache_writable)}</Descriptions.Item> <Descriptions.Item label='Cache 目录可写?'>{String(projectInfo?.cache_writable)}</Descriptions.Item>
<Descriptions.Item label='缓存驱动'>{projectInfo?.cache_driver}</Descriptions.Item> <Descriptions.Item label='缓存驱动'>{projectInfo?.cache_driver}</Descriptions.Item>
<Descriptions.Item label='Session 驱动'>{projectInfo?.session_driver}</Descriptions.Item> <Descriptions.Item label='Session 驱动'>{projectInfo?.session_driver}</Descriptions.Item>
<Descriptions.Item label='依赖版本'> <Descriptions.Item label='依赖版本'>
<Tooltip <Tooltip
title={ title={
<div <div style={{ maxWidth: 480, maxHeight: 200, overflowY: 'auto', whiteSpace: 'normal' }}>
style={{
maxWidth: 480,
maxHeight: 200,
overflowY: 'auto',
whiteSpace: 'normal',
}}
>
{projectInfo?.dependencies} {projectInfo?.dependencies}
</div> </div>
} }
@@ -94,6 +107,88 @@ const Index: React.FC = () => {
</Card> </Card>
</Col> </Col>
</Row> </Row>
</TabPane>
{/* Tab 2: 统计信息 */}
<TabPane tab='统计信息' key='2'>
<Row gutter={24} style={{ marginBottom: 24 }}>
<Col span={12}>
<Card style={{ backgroundColor: '#f6ffed' }}>
{/* 背景色 */}
<Statistic
title='总用户数'
value={stats?.member_count || 0}
precision={0}
prefix={<UserOutlined style={{ color: '#52c41a' }} />} // 图标颜色
style={{ fontSize: 24, fontWeight: 500, color: '#52c41a' }} // 数字颜色
/>
</Card>
</Col>
<Col span={12}>
<Card style={{ backgroundColor: '#fff1f0' }}>
<Statistic
title='总管理员数'
value={stats?.admin_count || 0}
precision={0}
prefix={<TeamOutlined style={{ color: '#f5222d' }} />}
style={{ fontSize: 24, fontWeight: 500, color: '#f5222d' }}
/>
</Card>
</Col>
</Row>
<Row gutter={24} style={{ display: 'flex', alignItems: 'stretch' }}>
{/* 左边统计卡片 */}
<Col span={12}>
<Row gutter={[16, 16]}>
<Col span={12}>
<Card style={{ height: '100%' }}>
<Statistic title='今日注册' value={stats?.today_register || 0} />
</Card>
</Col>
<Col span={12}>
<Card style={{ height: '100%' }}>
<Statistic title='今日登录' value={stats?.today_login || 0} />
</Card>
</Col>
<Col span={12}>
<Card style={{ height: '100%' }}>
<Statistic title='三日新增' value={stats?.last_3days_new || 0} />
</Card>
</Col>
<Col span={12}>
<Card style={{ height: '100%' }}>
<Statistic title='七日新增' value={stats?.last_7days_new || 0} />
</Card>
</Col>
<Col span={12}>
<Card style={{ height: '100%' }}>
<Statistic title='今日用户登录次数' value={stats?.today_login_cnt || 0} />
</Card>
</Col>
<Col span={12}>
<Card style={{ height: '100%' }}>
<Statistic title='七日活跃' value={stats?.last_7days_active || 0} />
</Card>
</Col>
<Col span={24}>
<Card style={{ height: '100%' }}>
<Statistic title='月活跃' value={stats?.month_active || 0} />
</Card>
</Col>
</Row>
</Col>
{/* 右边折线图 */}
<Col span={12}>
<Card title='一周用户注册趋势' style={{ height: '100%' }}>
<Line {...lineConfig} />
</Card>
</Col>
</Row>
</TabPane>
</Tabs>
</div> </div>
); );
}; };

View File

@@ -3,6 +3,7 @@ import type React from 'react';
import { useEffect, useRef, useState } from 'react'; import { useEffect, useRef, useState } from 'react';
import { AdminServices } from '@/services/AdminServices'; import { AdminServices } from '@/services/AdminServices';
import { useUserStore } from '@/store/UserStore'; import { useUserStore } from '@/store/UserStore';
import { imgWithPrefix, toObject } from '@/utils/common';
import type { IRef } from '@/utils/type'; import type { IRef } from '@/utils/type';
import { useRequest } from '@/utils/useRequest'; import { useRequest } from '@/utils/useRequest';
@@ -16,7 +17,8 @@ export type IProfileEditFormType = {
export const ProfileEditForm: React.FC<IProps> = (props) => { export const ProfileEditForm: React.FC<IProps> = (props) => {
const [form] = Form.useForm(); const [form] = Form.useForm();
const userInfo = useUserStore().user; const userStore = useUserStore();
const userInfo = userStore.user;
const [previewUrl, setPreviewUrl] = useState<string>(); const [previewUrl, setPreviewUrl] = useState<string>();
const avatarFileRef = useRef<File | null>(null); const avatarFileRef = useRef<File | null>(null);
const { notification } = App.useApp(); const { notification } = App.useApp();
@@ -25,6 +27,8 @@ export const ProfileEditForm: React.FC<IProps> = (props) => {
const success = (res: any) => { const success = (res: any) => {
if (res.err_code === 0) { if (res.err_code === 0) {
notification.success({ title: '保存成功' }); notification.success({ title: '保存成功' });
userStore.updateUser(toObject(res.data));
props.onCallback?.(); props.onCallback?.();
} }
}; };
@@ -67,7 +71,7 @@ export const ProfileEditForm: React.FC<IProps> = (props) => {
// 只在「没选择新头像」时,使用后端头像 // 只在「没选择新头像」时,使用后端头像
if (!avatarFileRef.current) { if (!avatarFileRef.current) {
const uri = avatar ? `/api/${avatar}?v=${encodeURIComponent(userInfo.update_date)}` : ''; const uri = `${imgWithPrefix(avatar)}?v=${encodeURIComponent(userInfo.update_date)}`;
setPreviewUrl(uri); setPreviewUrl(uri);
} }

View File

@@ -44,6 +44,28 @@ export const pathAddApiString = (path: string): string => {
return path; return path;
}; };
/**
* 给资源路径自动加上 /api 前缀
* - 已包含 http(s) 的不处理
* - 已包含 /api 的不重复加
* - 自动处理多余的 /
*/
export function imgWithPrefix(path?: string): string {
if (!path) return '';
// 已是完整地址http / https
if (/^https?:\/\//i.test(path)) {
return path;
}
// 已经带 /api
if (path.startsWith('/api/')) {
return path;
}
return `/api/${path.replace(/^\/+/, '')}`;
}
/** 只保留数字 */ /** 只保留数字 */
export const preserveNumbers = (val: any): string => { export const preserveNumbers = (val: any): string => {
return `${val}`.replace(/[^0-9]/gi, ''); return `${val}`.replace(/[^0-9]/gi, '');