From d5f328a288844df3dbd56d0222c1a4c0b3d7774c Mon Sep 17 00:00:00 2001 From: Voge1imkafig <2390349500@qq.com> Date: Fri, 4 Jul 2025 15:00:43 +0800 Subject: [PATCH] 1 --- package-lock.json | 1053 +++++++++++++++++++++++++++++++ package.json | 2 + public/pictures/R-C.jpg | Bin 0 -> 21852 bytes src/App.css | 704 ++++++++++++++++++++- src/App.js | 268 +++++++- src/components/DEFINE.js | 3 + src/components/EditableField.js | 44 ++ src/components/ImageAPI.js | 73 +++ src/components/ImagePreview.js | 63 ++ src/components/LinkForm.js | 165 +++++ src/components/UserFilter.js | 40 ++ src/components/weatherselect.js | 76 +++ src/constants.js | 3 + 13 files changed, 2458 insertions(+), 36 deletions(-) create mode 100644 public/pictures/R-C.jpg create mode 100644 src/components/DEFINE.js create mode 100644 src/components/EditableField.js create mode 100644 src/components/ImageAPI.js create mode 100644 src/components/ImagePreview.js create mode 100644 src/components/LinkForm.js create mode 100644 src/components/UserFilter.js create mode 100644 src/components/weatherselect.js create mode 100644 src/constants.js diff --git a/package-lock.json b/package-lock.json index 788ec70..64fcbb7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,8 @@ "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^16.3.0", "@testing-library/user-event": "^13.5.0", + "antd": "^5.25.4", + "axios": "^1.9.0", "react": "^19.1.0", "react-dom": "^19.1.0", "react-scripts": "5.0.1", @@ -49,6 +51,103 @@ "node": ">=6.0.0" } }, + "node_modules/@ant-design/colors": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-7.2.1.tgz", + "integrity": "sha512-lCHDcEzieu4GA3n8ELeZ5VQ8pKQAWcGGLRTQ50aQM2iqPpq2evTxER84jfdPvsPAtEcZ7m44NI45edFMo8oOYQ==", + "license": "MIT", + "dependencies": { + "@ant-design/fast-color": "^2.0.6" + } + }, + "node_modules/@ant-design/cssinjs": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@ant-design/cssinjs/-/cssinjs-1.23.0.tgz", + "integrity": "sha512-7GAg9bD/iC9ikWatU9ym+P9ugJhi/WbsTWzcKN6T4gU0aehsprtke1UAaaSxxkjjmkJb3llet/rbUSLPgwlY4w==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.1", + "@emotion/hash": "^0.8.0", + "@emotion/unitless": "^0.7.5", + "classnames": "^2.3.1", + "csstype": "^3.1.3", + "rc-util": "^5.35.0", + "stylis": "^4.3.4" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/@ant-design/cssinjs-utils": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@ant-design/cssinjs-utils/-/cssinjs-utils-1.1.3.tgz", + "integrity": "sha512-nOoQMLW1l+xR1Co8NFVYiP8pZp3VjIIzqV6D6ShYF2ljtdwWJn5WSsH+7kvCktXL/yhEtWURKOfH5Xz/gzlwsg==", + "license": "MIT", + "dependencies": { + "@ant-design/cssinjs": "^1.21.0", + "@babel/runtime": "^7.23.2", + "rc-util": "^5.38.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@ant-design/fast-color": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@ant-design/fast-color/-/fast-color-2.0.6.tgz", + "integrity": "sha512-y2217gk4NqL35giHl72o6Zzqji9O7vHh9YmhUVkPtAOpoTCH4uWxo/pr4VE8t0+ChEPs0qo4eJRC5Q1eXWo3vA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.7" + }, + "engines": { + "node": ">=8.x" + } + }, + "node_modules/@ant-design/icons": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-5.6.1.tgz", + "integrity": "sha512-0/xS39c91WjPAZOWsvi1//zjx6kAp4kxWwctR6kuU6p133w8RU0D2dSCvZC19uQyharg/sAvYxGYWl01BbZZfg==", + "license": "MIT", + "dependencies": { + "@ant-design/colors": "^7.0.0", + "@ant-design/icons-svg": "^4.4.0", + "@babel/runtime": "^7.24.8", + "classnames": "^2.2.6", + "rc-util": "^5.31.1" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/@ant-design/icons-svg": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.4.2.tgz", + "integrity": "sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==", + "license": "MIT" + }, + "node_modules/@ant-design/react-slick": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ant-design/react-slick/-/react-slick-1.1.2.tgz", + "integrity": "sha512-EzlvzE6xQUBrZuuhSAFTdsr4P2bBBHGZwKFemEfq8gIGyIQCxalYfZW/T2ORbtQx5rU69o+WycP3exY/7T1hGA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.4", + "classnames": "^2.2.5", + "json2mq": "^0.2.0", + "resize-observer-polyfill": "^1.5.1", + "throttle-debounce": "^5.0.0" + }, + "peerDependencies": { + "react": ">=16.9.0" + } + }, "node_modules/@babel/code-frame": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", @@ -2351,6 +2450,18 @@ "postcss-selector-parser": "^6.0.10" } }, + "node_modules/@emotion/hash": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==", + "license": "MIT" + }, + "node_modules/@emotion/unitless": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==", + "license": "MIT" + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", @@ -3087,6 +3198,155 @@ } } }, + "node_modules/@rc-component/async-validator": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@rc-component/async-validator/-/async-validator-5.0.4.tgz", + "integrity": "sha512-qgGdcVIF604M9EqjNF0hbUTz42bz/RDtxWdWuU5EQe3hi7M8ob54B6B35rOsvX5eSvIHIzT9iH1R3n+hk3CGfg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.4" + }, + "engines": { + "node": ">=14.x" + } + }, + "node_modules/@rc-component/color-picker": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@rc-component/color-picker/-/color-picker-2.0.1.tgz", + "integrity": "sha512-WcZYwAThV/b2GISQ8F+7650r5ZZJ043E57aVBFkQ+kSY4C6wdofXgB0hBx+GPGpIU0Z81eETNoDUJMr7oy/P8Q==", + "license": "MIT", + "dependencies": { + "@ant-design/fast-color": "^2.0.6", + "@babel/runtime": "^7.23.6", + "classnames": "^2.2.6", + "rc-util": "^5.38.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/context": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@rc-component/context/-/context-1.4.0.tgz", + "integrity": "sha512-kFcNxg9oLRMoL3qki0OMxK+7g5mypjgaaJp/pkOis/6rVxma9nJBF/8kCIuTYHUQNr0ii7MxqE33wirPZLJQ2w==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/mini-decimal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rc-component/mini-decimal/-/mini-decimal-1.1.0.tgz", + "integrity": "sha512-jS4E7T9Li2GuYwI6PyiVXmxTiM6b07rlD9Ge8uGZSCz3WlzcG5ZK7g5bbuKNeZ9pgUuPK/5guV781ujdVpm4HQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.0" + }, + "engines": { + "node": ">=8.x" + } + }, + "node_modules/@rc-component/mutate-observer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rc-component/mutate-observer/-/mutate-observer-1.1.0.tgz", + "integrity": "sha512-QjrOsDXQusNwGZPf4/qRQasg7UFEj06XiCJ8iuiq/Io7CrHrgVi6Uuetw60WAMG1799v+aM8kyc+1L/GBbHSlw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.0", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/portal": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@rc-component/portal/-/portal-1.1.2.tgz", + "integrity": "sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.0", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/qrcode": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@rc-component/qrcode/-/qrcode-1.0.0.tgz", + "integrity": "sha512-L+rZ4HXP2sJ1gHMGHjsg9jlYBX/SLN2D6OxP9Zn3qgtpMWtO2vUfxVFwiogHpAIqs54FnALxraUy/BCO1yRIgg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.7", + "classnames": "^2.3.2", + "rc-util": "^5.38.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/tour": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/@rc-component/tour/-/tour-1.15.1.tgz", + "integrity": "sha512-Tr2t7J1DKZUpfJuDZWHxyxWpfmj8EZrqSgyMZ+BCdvKZ6r1UDsfU46M/iWAAFBy961Ssfom2kv5f3UcjIL2CmQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.0", + "@rc-component/portal": "^1.0.0-9", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/trigger": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@rc-component/trigger/-/trigger-2.2.6.tgz", + "integrity": "sha512-/9zuTnWwhQ3S3WT1T8BubuFTT46kvnXgaERR9f4BTKyn61/wpf/BvbImzYBubzJibU707FxwbKszLlHjcLiv1Q==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.2", + "@rc-component/portal": "^1.1.0", + "classnames": "^2.3.2", + "rc-motion": "^2.0.0", + "rc-resize-observer": "^1.3.1", + "rc-util": "^5.44.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, "node_modules/@rollup/plugin-babel": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", @@ -4561,6 +4821,71 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/antd": { + "version": "5.25.4", + "resolved": "https://registry.npmjs.org/antd/-/antd-5.25.4.tgz", + "integrity": "sha512-yXdWqq1NJSZnD1HoPZWnWuQJGVYYnB3h0Ufsz4sbt3T0N9SdJ4G9GPpLMk8Gn9zWtwBekfR4THPVZ9uzAyhBHQ==", + "license": "MIT", + "dependencies": { + "@ant-design/colors": "^7.2.1", + "@ant-design/cssinjs": "^1.23.0", + "@ant-design/cssinjs-utils": "^1.1.3", + "@ant-design/fast-color": "^2.0.6", + "@ant-design/icons": "^5.6.1", + "@ant-design/react-slick": "~1.1.2", + "@babel/runtime": "^7.26.0", + "@rc-component/color-picker": "~2.0.1", + "@rc-component/mutate-observer": "^1.1.0", + "@rc-component/qrcode": "~1.0.0", + "@rc-component/tour": "~1.15.1", + "@rc-component/trigger": "^2.2.6", + "classnames": "^2.5.1", + "copy-to-clipboard": "^3.3.3", + "dayjs": "^1.11.11", + "rc-cascader": "~3.34.0", + "rc-checkbox": "~3.5.0", + "rc-collapse": "~3.9.0", + "rc-dialog": "~9.6.0", + "rc-drawer": "~7.3.0", + "rc-dropdown": "~4.2.1", + "rc-field-form": "~2.7.0", + "rc-image": "~7.12.0", + "rc-input": "~1.8.0", + "rc-input-number": "~9.5.0", + "rc-mentions": "~2.20.0", + "rc-menu": "~9.16.1", + "rc-motion": "^2.9.5", + "rc-notification": "~5.6.4", + "rc-pagination": "~5.1.0", + "rc-picker": "~4.11.3", + "rc-progress": "~4.0.0", + "rc-rate": "~2.13.1", + "rc-resize-observer": "^1.4.3", + "rc-segmented": "~2.7.0", + "rc-select": "~14.16.8", + "rc-slider": "~11.1.8", + "rc-steps": "~6.0.1", + "rc-switch": "~4.1.0", + "rc-table": "~7.50.5", + "rc-tabs": "~15.6.1", + "rc-textarea": "~1.10.0", + "rc-tooltip": "~6.4.0", + "rc-tree": "~5.13.1", + "rc-tree-select": "~5.27.0", + "rc-upload": "~4.9.2", + "rc-util": "^5.44.4", + "scroll-into-view-if-needed": "^3.1.0", + "throttle-debounce": "^5.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ant-design" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, "node_modules/any-promise": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", @@ -4896,6 +5221,32 @@ "node": ">=4" } }, + "node_modules/axios": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.9.0.tgz", + "integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axios/node_modules/form-data": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", + "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/axobject-query": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", @@ -5602,6 +5953,12 @@ "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", "license": "MIT" }, + "node_modules/classnames": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", + "license": "MIT" + }, "node_modules/clean-css": { "version": "5.3.3", "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", @@ -5846,6 +6203,12 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, + "node_modules/compute-scroll-into-view": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.1.1.tgz", + "integrity": "sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==", + "license": "MIT" + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -5909,6 +6272,15 @@ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", "license": "MIT" }, + "node_modules/copy-to-clipboard": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", + "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", + "license": "MIT", + "dependencies": { + "toggle-selection": "^1.0.6" + } + }, "node_modules/core-js": { "version": "3.42.0", "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.42.0.tgz", @@ -6364,6 +6736,12 @@ "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", "license": "MIT" }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" + }, "node_modules/damerau-levenshtein": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", @@ -6435,6 +6813,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/dayjs": { + "version": "1.11.13", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", + "license": "MIT" + }, "node_modules/debug": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", @@ -10961,6 +11345,15 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "license": "MIT" }, + "node_modules/json2mq": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz", + "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==", + "license": "MIT", + "dependencies": { + "string-convert": "^0.2.0" + } + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -13643,6 +14036,12 @@ "node": ">= 0.10" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, "node_modules/psl": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", @@ -13770,6 +14169,618 @@ "node": ">=0.10.0" } }, + "node_modules/rc-cascader": { + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/rc-cascader/-/rc-cascader-3.34.0.tgz", + "integrity": "sha512-KpXypcvju9ptjW9FaN2NFcA2QH9E9LHKq169Y0eWtH4e/wHQ5Wh5qZakAgvb8EKZ736WZ3B0zLLOBsrsja5Dag==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.25.7", + "classnames": "^2.3.1", + "rc-select": "~14.16.2", + "rc-tree": "~5.13.0", + "rc-util": "^5.43.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-checkbox": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/rc-checkbox/-/rc-checkbox-3.5.0.tgz", + "integrity": "sha512-aOAQc3E98HteIIsSqm6Xk2FPKIER6+5vyEFMZfo73TqM+VVAIqOkHoPjgKLqSNtVLWScoaM7vY2ZrGEheI79yg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.3.2", + "rc-util": "^5.25.2" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-collapse": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/rc-collapse/-/rc-collapse-3.9.0.tgz", + "integrity": "sha512-swDdz4QZ4dFTo4RAUMLL50qP0EY62N2kvmk2We5xYdRwcRn8WcYtuetCJpwpaCbUfUt5+huLpVxhvmnK+PHrkA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.3.4", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-dialog": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/rc-dialog/-/rc-dialog-9.6.0.tgz", + "integrity": "sha512-ApoVi9Z8PaCQg6FsUzS8yvBEQy0ZL2PkuvAgrmohPkN3okps5WZ5WQWPc1RNuiOKaAYv8B97ACdsFU5LizzCqg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/portal": "^1.0.0-8", + "classnames": "^2.2.6", + "rc-motion": "^2.3.0", + "rc-util": "^5.21.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-drawer": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/rc-drawer/-/rc-drawer-7.3.0.tgz", + "integrity": "sha512-DX6CIgiBWNpJIMGFO8BAISFkxiuKitoizooj4BDyee8/SnBn0zwO2FHrNDpqqepj0E/TFTDpmEBCyFuTgC7MOg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@rc-component/portal": "^1.1.1", + "classnames": "^2.2.6", + "rc-motion": "^2.6.1", + "rc-util": "^5.38.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-dropdown": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/rc-dropdown/-/rc-dropdown-4.2.1.tgz", + "integrity": "sha512-YDAlXsPv3I1n42dv1JpdM7wJ+gSUBfeyPK59ZpBD9jQhK9jVuxpjj3NmWQHOBceA1zEPVX84T2wbdb2SD0UjmA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.2.6", + "rc-util": "^5.44.1" + }, + "peerDependencies": { + "react": ">=16.11.0", + "react-dom": ">=16.11.0" + } + }, + "node_modules/rc-field-form": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/rc-field-form/-/rc-field-form-2.7.0.tgz", + "integrity": "sha512-hgKsCay2taxzVnBPZl+1n4ZondsV78G++XVsMIJCAoioMjlMQR9YwAp7JZDIECzIu2Z66R+f4SFIRrO2DjDNAA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.0", + "@rc-component/async-validator": "^5.0.3", + "rc-util": "^5.32.2" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-image": { + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/rc-image/-/rc-image-7.12.0.tgz", + "integrity": "sha512-cZ3HTyyckPnNnUb9/DRqduqzLfrQRyi+CdHjdqgsyDpI3Ln5UX1kXnAhPBSJj9pVRzwRFgqkN7p9b6HBDjmu/Q==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.2", + "@rc-component/portal": "^1.0.2", + "classnames": "^2.2.6", + "rc-dialog": "~9.6.0", + "rc-motion": "^2.6.2", + "rc-util": "^5.34.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-input": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/rc-input/-/rc-input-1.8.0.tgz", + "integrity": "sha512-KXvaTbX+7ha8a/k+eg6SYRVERK0NddX8QX7a7AnRvUa/rEH0CNMlpcBzBkhI0wp2C8C4HlMoYl8TImSN+fuHKA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-util": "^5.18.1" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/rc-input-number": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/rc-input-number/-/rc-input-number-9.5.0.tgz", + "integrity": "sha512-bKaEvB5tHebUURAEXw35LDcnRZLq3x1k7GxfAqBMzmpHkDGzjAtnUL8y4y5N15rIFIg5IJgwr211jInl3cipag==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/mini-decimal": "^1.0.1", + "classnames": "^2.2.5", + "rc-input": "~1.8.0", + "rc-util": "^5.40.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-mentions": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/rc-mentions/-/rc-mentions-2.20.0.tgz", + "integrity": "sha512-w8HCMZEh3f0nR8ZEd466ATqmXFCMGMN5UFCzEUL0bM/nGw/wOS2GgRzKBcm19K++jDyuWCOJOdgcKGXU3fXfbQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.22.5", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.2.6", + "rc-input": "~1.8.0", + "rc-menu": "~9.16.0", + "rc-textarea": "~1.10.0", + "rc-util": "^5.34.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-menu": { + "version": "9.16.1", + "resolved": "https://registry.npmjs.org/rc-menu/-/rc-menu-9.16.1.tgz", + "integrity": "sha512-ghHx6/6Dvp+fw8CJhDUHFHDJ84hJE3BXNCzSgLdmNiFErWSOaZNsihDAsKq9ByTALo/xkNIwtDFGIl6r+RPXBg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/trigger": "^2.0.0", + "classnames": "2.x", + "rc-motion": "^2.4.3", + "rc-overflow": "^1.3.1", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-motion": { + "version": "2.9.5", + "resolved": "https://registry.npmjs.org/rc-motion/-/rc-motion-2.9.5.tgz", + "integrity": "sha512-w+XTUrfh7ArbYEd2582uDrEhmBHwK1ZENJiSJVb7uRxdE7qJSYjbO2eksRXmndqyKqKoYPc9ClpPh5242mV1vA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-util": "^5.44.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-notification": { + "version": "5.6.4", + "resolved": "https://registry.npmjs.org/rc-notification/-/rc-notification-5.6.4.tgz", + "integrity": "sha512-KcS4O6B4qzM3KH7lkwOB7ooLPZ4b6J+VMmQgT51VZCeEcmghdeR4IrMcFq0LG+RPdnbe/ArT086tGM8Snimgiw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.9.0", + "rc-util": "^5.20.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-overflow": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rc-overflow/-/rc-overflow-1.4.1.tgz", + "integrity": "sha512-3MoPQQPV1uKyOMVNd6SZfONi+f3st0r8PksexIdBTeIYbMX0Jr+k7pHEDvsXtR4BpCv90/Pv2MovVNhktKrwvw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.37.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-pagination": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/rc-pagination/-/rc-pagination-5.1.0.tgz", + "integrity": "sha512-8416Yip/+eclTFdHXLKTxZvn70duYVGTvUUWbckCCZoIl3jagqke3GLsFrMs0bsQBikiYpZLD9206Ej4SOdOXQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.3.2", + "rc-util": "^5.38.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-picker": { + "version": "4.11.3", + "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-4.11.3.tgz", + "integrity": "sha512-MJ5teb7FlNE0NFHTncxXQ62Y5lytq6sh5nUw0iH8OkHL/TjARSEvSHpr940pWgjGANpjCwyMdvsEV55l5tYNSg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.7", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.2.1", + "rc-overflow": "^1.3.2", + "rc-resize-observer": "^1.4.0", + "rc-util": "^5.43.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "date-fns": ">= 2.x", + "dayjs": ">= 1.x", + "luxon": ">= 3.x", + "moment": ">= 2.x", + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + }, + "peerDependenciesMeta": { + "date-fns": { + "optional": true + }, + "dayjs": { + "optional": true + }, + "luxon": { + "optional": true + }, + "moment": { + "optional": true + } + } + }, + "node_modules/rc-progress": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/rc-progress/-/rc-progress-4.0.0.tgz", + "integrity": "sha512-oofVMMafOCokIUIBnZLNcOZFsABaUw8PPrf1/y0ZBvKZNpOiu5h4AO9vv11Sw0p4Hb3D0yGWuEattcQGtNJ/aw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.6", + "rc-util": "^5.16.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-rate": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/rc-rate/-/rc-rate-2.13.1.tgz", + "integrity": "sha512-QUhQ9ivQ8Gy7mtMZPAjLbxBt5y9GRp65VcUyGUMF3N3fhiftivPHdpuDIaWIMOTEprAjZPC08bls1dQB+I1F2Q==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-util": "^5.0.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-resize-observer": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-1.4.3.tgz", + "integrity": "sha512-YZLjUbyIWox8E9i9C3Tm7ia+W7euPItNWSPX5sCcQTYbnwDb5uNpnLHQCG1f22oZWUhLw4Mv2tFmeWe68CDQRQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.7", + "classnames": "^2.2.1", + "rc-util": "^5.44.1", + "resize-observer-polyfill": "^1.5.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-segmented": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/rc-segmented/-/rc-segmented-2.7.0.tgz", + "integrity": "sha512-liijAjXz+KnTRVnxxXG2sYDGd6iLL7VpGGdR8gwoxAXy2KglviKCxLWZdjKYJzYzGSUwKDSTdYk8brj54Bn5BA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-motion": "^2.4.4", + "rc-util": "^5.17.0" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/rc-select": { + "version": "14.16.8", + "resolved": "https://registry.npmjs.org/rc-select/-/rc-select-14.16.8.tgz", + "integrity": "sha512-NOV5BZa1wZrsdkKaiK7LHRuo5ZjZYMDxPP6/1+09+FB4KoNi8jcG1ZqLE3AVCxEsYMBe65OBx71wFoHRTP3LRg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/trigger": "^2.1.1", + "classnames": "2.x", + "rc-motion": "^2.0.1", + "rc-overflow": "^1.3.1", + "rc-util": "^5.16.1", + "rc-virtual-list": "^3.5.2" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/rc-slider": { + "version": "11.1.8", + "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-11.1.8.tgz", + "integrity": "sha512-2gg/72YFSpKP+Ja5AjC5DPL1YnV8DEITDQrcc1eASrUYjl0esptaBVJBh5nLTXCCp15eD8EuGjwezVGSHhs9tQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-util": "^5.36.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-steps": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/rc-steps/-/rc-steps-6.0.1.tgz", + "integrity": "sha512-lKHL+Sny0SeHkQKKDJlAjV5oZ8DwCdS2hFhAkIjuQt1/pB81M0cA0ErVFdHq9+jmPmFw1vJB2F5NBzFXLJxV+g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.16.7", + "classnames": "^2.2.3", + "rc-util": "^5.16.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-switch": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rc-switch/-/rc-switch-4.1.0.tgz", + "integrity": "sha512-TI8ufP2Az9oEbvyCeVE4+90PDSljGyuwix3fV58p7HV2o4wBnVToEyomJRVyTaZeqNPAp+vqeo4Wnj5u0ZZQBg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.21.0", + "classnames": "^2.2.1", + "rc-util": "^5.30.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-table": { + "version": "7.50.5", + "resolved": "https://registry.npmjs.org/rc-table/-/rc-table-7.50.5.tgz", + "integrity": "sha512-FDZu8aolhSYd3v9KOc3lZOVAU77wmRRu44R0Wfb8Oj1dXRUsloFaXMSl6f7yuWZUxArJTli7k8TEOX2mvhDl4A==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/context": "^1.4.0", + "classnames": "^2.2.5", + "rc-resize-observer": "^1.1.0", + "rc-util": "^5.44.3", + "rc-virtual-list": "^3.14.2" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-tabs": { + "version": "15.6.1", + "resolved": "https://registry.npmjs.org/rc-tabs/-/rc-tabs-15.6.1.tgz", + "integrity": "sha512-/HzDV1VqOsUWyuC0c6AkxVYFjvx9+rFPKZ32ejxX0Uc7QCzcEjTA9/xMgv4HemPKwzBNX8KhGVbbumDjnj92aA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.2", + "classnames": "2.x", + "rc-dropdown": "~4.2.0", + "rc-menu": "~9.16.0", + "rc-motion": "^2.6.2", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.34.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-textarea": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/rc-textarea/-/rc-textarea-1.10.0.tgz", + "integrity": "sha512-ai9IkanNuyBS4x6sOL8qu/Ld40e6cEs6pgk93R+XLYg0mDSjNBGey6/ZpDs5+gNLD7urQ14po3V6Ck2dJLt9SA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1", + "rc-input": "~1.8.0", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-tooltip": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-6.4.0.tgz", + "integrity": "sha512-kqyivim5cp8I5RkHmpsp1Nn/Wk+1oeloMv9c7LXNgDxUpGm+RbXJGL+OPvDlcRnx9DBeOe4wyOIl4OKUERyH1g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.2", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.3.1", + "rc-util": "^5.44.3" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-tree": { + "version": "5.13.1", + "resolved": "https://registry.npmjs.org/rc-tree/-/rc-tree-5.13.1.tgz", + "integrity": "sha512-FNhIefhftobCdUJshO7M8uZTA9F4OPGVXqGfZkkD/5soDeOhwO06T/aKTrg0WD8gRg/pyfq+ql3aMymLHCTC4A==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.0.1", + "rc-util": "^5.16.1", + "rc-virtual-list": "^3.5.1" + }, + "engines": { + "node": ">=10.x" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/rc-tree-select": { + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/rc-tree-select/-/rc-tree-select-5.27.0.tgz", + "integrity": "sha512-2qTBTzwIT7LRI1o7zLyrCzmo5tQanmyGbSaGTIf7sYimCklAToVVfpMC6OAldSKolcnjorBYPNSKQqJmN3TCww==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.25.7", + "classnames": "2.x", + "rc-select": "~14.16.2", + "rc-tree": "~5.13.0", + "rc-util": "^5.43.0" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/rc-upload": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/rc-upload/-/rc-upload-4.9.2.tgz", + "integrity": "sha512-nHx+9rbd1FKMiMRYsqQ3NkXUv7COHPBo3X1Obwq9SWS6/diF/A0aJ5OHubvwUAIDs+4RMleljV0pcrNUc823GQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "classnames": "^2.2.5", + "rc-util": "^5.2.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-util": { + "version": "5.44.4", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.44.4.tgz", + "integrity": "sha512-resueRJzmHG9Q6rI/DfK6Kdv9/Lfls05vzMs1Sk3M2P+3cJa+MakaZyWY8IPfehVuhPJFKrIY1IK4GqbiaiY5w==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "react-is": "^18.2.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-util/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" + }, + "node_modules/rc-virtual-list": { + "version": "3.18.6", + "resolved": "https://registry.npmjs.org/rc-virtual-list/-/rc-virtual-list-3.18.6.tgz", + "integrity": "sha512-TQ5SsutL3McvWmmxqQtMIbfeoE3dGjJrRSfKekgby7WQMpPIFvv4ghytp5Z0s3D8Nik9i9YNOCqHBfk86AwgAA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.0", + "classnames": "^2.2.6", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.36.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, "node_modules/react": { "version": "19.1.0", "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", @@ -14232,6 +15243,12 @@ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "license": "MIT" }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==", + "license": "MIT" + }, "node_modules/resolve": { "version": "1.22.10", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", @@ -14659,6 +15676,15 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "license": "MIT" }, + "node_modules/scroll-into-view-if-needed": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz", + "integrity": "sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==", + "license": "MIT", + "dependencies": { + "compute-scroll-into-view": "^3.0.2" + } + }, "node_modules/select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", @@ -15301,6 +16327,12 @@ "safe-buffer": "~5.2.0" } }, + "node_modules/string-convert": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz", + "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==", + "license": "MIT" + }, "node_modules/string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", @@ -15590,6 +16622,12 @@ "postcss": "^8.2.15" } }, + "node_modules/stylis": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz", + "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==", + "license": "MIT" + }, "node_modules/sucrase": { "version": "3.35.0", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", @@ -16090,6 +17128,15 @@ "integrity": "sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==", "license": "MIT" }, + "node_modules/throttle-debounce": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.2.tgz", + "integrity": "sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==", + "license": "MIT", + "engines": { + "node": ">=12.22" + } + }, "node_modules/thunky": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", @@ -16114,6 +17161,12 @@ "node": ">=8.0" } }, + "node_modules/toggle-selection": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", + "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==", + "license": "MIT" + }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", diff --git a/package.json b/package.json index 2c46698..0a5e4c2 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,8 @@ "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^16.3.0", "@testing-library/user-event": "^13.5.0", + "antd": "^5.25.4", + "axios": "^1.9.0", "react": "^19.1.0", "react-dom": "^19.1.0", "react-scripts": "5.0.1", diff --git a/public/pictures/R-C.jpg b/public/pictures/R-C.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6d3ac8c060ca7bfa6d7a1f24bd1308f9144d6d52 GIT binary patch literal 21852 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 F`43$NlK}t# literal 0 HcmV?d00001 diff --git a/src/App.css b/src/App.css index 74b5e05..08f123f 100644 --- a/src/App.css +++ b/src/App.css @@ -1,38 +1,702 @@ -.App { +/* App.css */ +.app { + font-family: Arial, sans-serif; + max-width: 1200px; + margin: 0 auto; + padding: 20px; +} + +.app-header { + margin-bottom: 30px; + padding-bottom: 20px; + border-bottom: 1px solid #eee; +} + +.app-header h1 { + margin: 0 0 15px 0; + color: #333; text-align: center; } -.App-logo { - height: 40vmin; +.stats { + display: flex; + justify-content: center; + gap: 20px; + margin-bottom: 20px; + font-size: 16px; + color: #666; +} + +.stats span { + padding: 5px 15px; + background-color: #f0f0f0; + border-radius: 4px; +} + +.controls { + display: flex; + flex-direction: column; + gap: 15px; +} + +.filter-controls { + display: flex; + flex-wrap: wrap; + gap: 20px; +} + +.token-input, .user-filter { + flex: 1; + min-width: 250px; +} + +.token-input label, .user-filter label { + display: block; + font-weight: bold; + margin-bottom: 5px; + color: #555; +} + +.token-input input, .user-filter select { + width: 100%; + padding: 8px 12px; + border: 1px solid #ddd; + border-radius: 4px; + font-size: 14px; +} + +.refresh-btn { + padding: 10px 20px; + background-color: #1890ff; + color: white; + border: none; + border-radius: 4px; + cursor: pointer; + font-size: 14px; + transition: background-color 0.3s; + align-self: flex-end; +} + +.refresh-btn:hover { + background-color: #40a9ff; +} + +.refresh-btn:disabled { + background-color: #d9d9d9; + cursor: not-allowed; +} + +.status-message { + padding: 30px; + text-align: center; + font-size: 18px; + border-radius: 4px; + margin: 20px 0; +} + +.loading { + color: #1890ff; + background-color: #e6f7ff; +} + +.error { + color: #f5222d; + background-color: #fff1f0; +} + +.no-data { + color: #faad14; + background-color: #fffbe6; +} + +.image-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); + gap: 20px; + margin-top: 20px; +} + +.image-card { + border: 1px solid #eee; + border-radius: 8px; + overflow: hidden; + box-shadow: 0 2px 8px rgba(0,0,0,0.1); + transition: all 0.3s ease; + cursor: pointer; + background-color: white; +} + +.image-card:hover { + transform: translateY(-5px); + box-shadow: 0 5px 15px rgba(0,0,0,0.1); +} + +.image-preview { + height: 200px; + background-color: #fafafa; + display: flex; + align-items: center; + justify-content: center; + border-bottom: 1px solid #eee; +} + +.image-preview img { + max-width: 100%; + max-height: 100%; + object-fit: contain; +} + +.image-placeholder { + color: #bfbfbf; + font-size: 16px; +} + +.image-details { + padding: 15px; +} + +.image-details h3 { + margin: 0 0 10px; + font-size: 16px; + color: #333; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.image-details p { + margin: 6px 0; + font-size: 14px; + color: #666; +} + +.image-details p strong { + color: #444; +} + +/* 模态框样式 */ +.modal-overlay { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.5); + display: flex; + justify-content: center; + align-items: center; + z-index: 1000; +} + +.modal-content { + background-color: white; + border-radius: 8px; + width: 90%; + max-width: 900px; + max-height: 90vh; + overflow-y: auto; + padding: 25px; + position: relative; + box-shadow: 0 5px 20px rgba(0,0,0,0.2); +} + +.close-btn { + position: absolute; + top: 15px; + right: 15px; + font-size: 24px; + background: none; + border: none; + cursor: pointer; + color: #999; + padding: 5px; +} + +.close-btn:hover { + color: #666; +} + +.modal-content h2 { + margin-top: 0; + color: #333; + border-bottom: 1px solid #eee; + padding-bottom: 10px; +} + +.modal-body { + display: flex; + flex-direction: column; + gap: 20px; + margin-top: 20px; +} + +@media (min-width: 768px) { + .modal-body { + flex-direction: row; + } +} + +.modal-image-preview { + flex: 1; + min-height: 300px; + background-color: #fafafa; + display: flex; + align-items: center; + justify-content: center; + border: 1px solid #eee; + border-radius: 4px; + padding: 15px; +} + +.modal-image-preview img { + max-width: 100%; + max-height: 400px; + object-fit: contain; +} + +.image-metadata { + flex: 1; + min-width: 300px; +} + +.image-metadata h3 { + margin-top: 0; + color: #333; + font-size: 18px; + border-bottom: 1px solid #eee; + padding-bottom: 10px; +} + +.metadata-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); + gap: 15px; + margin-top: 15px; +} + +.metadata-item { + display: flex; + flex-direction: column; +} + +.metadata-item label { + font-size: 13px; + color: #888; + margin-bottom: 3px; +} + +.metadata-item span { + font-size: 14px; + color: #333; + word-break: break-word; +} + +/* 图片悬停信息 */ +.image-hover-info { + position: absolute; + bottom: 0; + left: 0; + right: 0; + background: rgba(0, 0, 0, 0.7); + color: white; + padding: 5px; + font-size: 12px; + opacity: 0; + transition: opacity 0.3s; pointer-events: none; } -@media (prefers-reduced-motion: no-preference) { - .App-logo { - animation: App-logo-spin infinite 20s linear; - } +.image-wrapper:hover .image-hover-info { + opacity: 1; } -.App-header { - background-color: #282c34; - min-height: 100vh; +.image-wrapper { + position: relative; +} + +/* 放大图片样式 */ +.enlarged-overlay { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(0, 0, 0, 0.9); display: flex; - flex-direction: column; - align-items: center; justify-content: center; - font-size: calc(10px + 2vmin); + align-items: center; + z-index: 1000; +} + +.enlarged-content { + position: relative; + max-width: 90%; + max-height: 90%; +} + +.enlarged-image { + max-width: 100%; + max-height: 80vh; + object-fit: contain; +} + +.enlarged-content .close-btn { + position: absolute; + top: -40px; + right: 0; + background: transparent; + border: none; + color: white; + font-size: 30px; + cursor: pointer; +} + +/* 模态框中的图片预览 */ +.modal-preview .image-preview { + cursor: zoom-in; + max-height: 300px; +} + +/* 已选择图片样式 */ +.image-card.selected { + border: 2px solid #1890ff; + background-color: #f0f7ff; +} + +.image-checkbox { + position: absolute; + top: 5px; + right: 5px; + z-index: 1; +} + +/* 关联按钮样式 */ +.action-buttons { + display: flex; + gap: 10px; +} + +.link-btn { + background-color: #52c41a; color: white; } -.App-link { - color: #61dafb; +.link-btn:hover { + background-color: #73d13d; } -@keyframes App-logo-spin { - from { - transform: rotate(0deg); +.selected-count { + margin-left: 15px; + color: #1890ff; + font-weight: bold; +} + +/* 关联模态框样式 */ +.link-modal { + max-width: 800px; +} + +.link-form { + margin-top: 20px; +} + +.selected-images-preview { + margin-bottom: 20px; +} + +.preview-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(100px, 1fr)); + gap: 10px; + max-height: 200px; + overflow-y: auto; +} + +.small-preview .image-preview { + max-height: 80px; + width: auto; +} + +.small-preview .image-wrapper { + height: 80px; + display: flex; + align-items: center; + justify-content: center; +} + +.small-preview .image-hover-info { + display: none; +} + +/* 数字输入框样式 */ +input[type="number"] { + width: 100%; + padding: 8px; + border: 1px solid #d9d9d9; + border-radius: 4px; +} + +select { + width: 100%; + padding: 8px; + border: 1px solid #d9d9d9; + border-radius: 4px; + background-color: white; +} + +/* 关联模式下的图片卡片样式 */ +.image-card.linking-mode { + cursor: pointer; +} + +.image-card.linking-mode:hover { + box-shadow: 0 0 0 2px #1890ff; +} + +/* 取消按钮样式 */ +.cancel-btn { + background-color: #ff4d4f; + color: white; +} + +.cancel-btn:hover { + background-color: #ff7875; +} + +/* 详情模态框中的部件ID字段 */ +.image-metadata .metadata-item { + margin-bottom: 10px; +} + +/* 关联模式下隐藏的悬停信息 */ +.linking-mode .image-hover-info { + display: none; +} + +/* 图片选择复选框样式 */ +.image-checkbox { + position: absolute; + top: 5px; + right: 5px; + z-index: 1; +} + +.image-checkbox input { + width: 16px; + height: 16px; +} + +.adaptive-link-form { + display: flex; + flex-direction: column; + width: 100%; +} + +.image-container { + width: 100%; + margin-bottom: 16px; + display: flex; + justify-content: center; +} + +.adaptive-image { + max-width: 100%; + max-height: 40vh; /* 图片最大高度 */ + object-fit: contain; + border-radius: 8px; +} + +.form-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); + gap: 20px; + overflow-y: auto; /* 仅表单区域可滚动 */ + flex-grow: 1; + padding: 8px; +} + +.form-group { + background: #f8f9fa; + padding: 16px; + border-radius: 8px; + display: flex; + flex-direction: column; + gap: 12px; +} + +.form-group h4 { + margin: 0 0 12px 0; + color: #333; + font-size: 16px; +} + +.form-item { + display: flex; + flex-direction: column; + gap: 4px; +} + +.form-item label { + font-size: 12px; + color: #666; +} + +.form-item .value { + padding: 8px; + background: white; + border-radius: 4px; + border: 1px solid #eee; +} + +.inline-fields { + display: flex; + gap: 12px; +} + +.form-actions { + position: sticky; + bottom: 0; + background: white; + padding: 16px 0; + display: flex; + justify-content: flex-end; +} + +/* 响应式调整 */ +@media (max-width: 768px) { + .form-grid { + grid-template-columns: 1fr; } - to { - transform: rotate(360deg); +} + +/* 主容器 (与modal-body配合) */ +.modal-body { + display: flex; + height: 80vh; + gap: 24px; +} + +.modal-image-preview { + flex: 0 0 45%; + overflow: hidden; +} + +.link-form-container { + flex: 1; + display: flex; + flex-direction: column; + overflow-y: auto; + padding-right: 8px; +} + +/* 表单标题区 */ +.form-header { + margin-bottom: 20px; + padding-bottom: 12px; + border-bottom: 1px solid #eee; +} + +.form-header h3 { + margin: 0 0 8px 0; + font-size: 18px; +} + +.image-meta { + display: flex; + justify-content: space-between; + color: #666; + font-size: 13px; +} + +/* 表单网格布局 */ +.form-grid { + display: flex; + flex-direction: column; + gap: 20px; + flex-grow: 1; +} + +.form-group { + background: white; + padding: 16px; + border-radius: 8px; + box-shadow: 0 1px 3px rgba(0,0,0,0.08); +} + +.form-row { + display: flex; + gap: 16px; + margin-bottom: 12px; +} + +.form-row:last-child { + margin-bottom: 0; +} + +.form-item { + flex: 1; + display: flex; + flex-direction: column; + gap: 6px; +} + +.form-item label { + font-size: 13px; + color: #666; +} + +.form-item select { + padding: 8px 12px; + border: 1px solid #ddd; + border-radius: 4px; + background: white; +} + +/* 操作按钮 */ +.form-actions { + position: sticky; + bottom: 0; + background: white; + padding: 16px 0; + margin-top: auto; +} + +.submit-button { + padding: 10px 24px; + background: #1890ff; + color: white; + border: none; + border-radius: 4px; + cursor: pointer; + width: 100%; +} + +.submit-button:hover { + background: #40a9ff; +} + +.submit-button:disabled { + background: #d9d9d9; + cursor: not-allowed; +} + +/* 响应式调整 */ +@media (max-width: 992px) { + .modal-body { + flex-direction: column; + height: auto; + max-height: 90vh; + } + + .modal-image-preview { + flex: auto; + max-height: 40vh; } } + +@media (max-width: 576px) { + .form-row { + flex-direction: column; + gap: 12px; + } +} \ No newline at end of file diff --git a/src/App.js b/src/App.js index 3784575..d235f4b 100644 --- a/src/App.js +++ b/src/App.js @@ -1,25 +1,261 @@ -import logo from './logo.svg'; +/** + * 主应用组件 + * 图片管理系统入口,整合所有子组件 + * 主要功能: + * - 显示图片列表 + * - 提供筛选功能 + * - 显示图片详情和关联表单 + */ +import React, { useState, useEffect } from 'react'; import './App.css'; +import { fetchImages, linkImagesToPart } from './components/ImageAPI.js'; +import ImagePreview from './components/ImagePreview'; +import LinkForm from './components/LinkForm'; +import UserFilter from './components/UserFilter'; function App() { + const [images, setImages] = useState([]); + const [filteredImages, setFilteredImages] = useState([]); + const [loading, setLoading] = useState(false); + const [error, setError] = useState(null); + const [token, setToken] = useState(''); + const [selectedImage, setSelectedImage] = useState(null); + const [showModal, setShowModal] = useState(false); + const [uploadUsers, setUploadUsers] = useState(['all']); + const [selectedUser, setSelectedUser] = useState('all'); + const [enlargedImage, setEnlargedImage] = useState(null); + const [linkFormData, setLinkFormData] = useState({ + collectorId: '', + collectorName: '', + humidness: '', + imagePaths: [], + partId: '', + shootingDistance: '', + shootingMethod: '', + shootingTimeBegin: '', + shootingTimeEnd: '', + temperatureMax: '', + temperatureMin: '', + weather: '', + windLevel: '' + }); + + // 获取图片数据 + const fetchImageData = async () => { + try { + setLoading(true); + setError(null); + + const imagesData = await fetchImages(token); + setImages(imagesData); + + // 提取所有不重复的上传用户 + const users = [...new Set(imagesData.map(img => img.uploadUser || '未知'))]; + setUploadUsers(['all', ...users]); + + // 设置默认用户筛选 + if (users.length > 0) { + setSelectedUser(users[0]); + setFilteredImages(imagesData.filter(img => img.uploadUser === users[0])); + } else { + setFilteredImages(imagesData); + } + } catch (err) { + setError(err.message); + } finally { + setLoading(false); + } + }; + + // 初始化加载 + useEffect(() => { + fetchImageData(); + }, []); + + // 用户筛选处理 + useEffect(() => { + if (selectedUser === 'all') { + setFilteredImages(images); + } else { + setFilteredImages(images.filter(img => img.uploadUser === selectedUser)); + } + }, [selectedUser, images]); + + const handleTokenChange = (e) => { + setToken(e.target.value); + }; + + const handleRefresh = () => { + fetchImageData(); + }; + + const handleImageClick = (image) => { + setSelectedImage(image); + setShowModal(true); + + // 初始化关联表单数据 + setLinkFormData({ + collectorId: image.collectorId || '', + collectorName: image.collectorName || '', + humidness: image.humidness || '', + imagePaths: [image.imagePath], + partId: image.partId || '', + shootingDistance: image.shootingDistance || '', + shootingMethod: image.shootingMethod || '', + shootingTimeBegin: image.shootingTimeBegin || '', + shootingTimeEnd: image.shootingTimeEnd || '', + temperatureMax: image.temperatureMax || '', + temperatureMin: image.temperatureMin || '', + weather: image.weather || '', + windLevel: image.windLevel || '' + }); + }; + + const closeModal = () => { + setShowModal(false); + setSelectedImage(null); + setEnlargedImage(null); + }; + + const handleUserFilterChange = (e) => { + setSelectedUser(e.target.value); + }; + + // 处理关联表单字段变化 + const handleLinkFormChange = (fieldName, value) => { + setLinkFormData(prev => ({ + ...prev, + [fieldName]: value + })); + }; + + // 提交关联图片到机组 + const handleLinkImages = async () => { + if (!linkFormData.partId) { + alert('请填写部件ID'); + return; + } + + try { + setLoading(true); + await linkImagesToPart(token, linkFormData); + alert('图片关联成功'); + closeModal(); + fetchImageData(); + } catch (err) { + setError(err.message); + } finally { + setLoading(false); + } + }; + return ( -
-
- logo -

- Edit src/App.js and save to reload. -

- - Learn React - +
+
+

上传图片管理系统

+
+ 总图片数: {images.length} + 当前显示: {filteredImages.length} +
+
+
+
+ + +
+ +
+
+ +
+
+ +
+ {loading && images.length === 0 ? ( +
加载中...
+ ) : error ? ( +
{error}
+ ) : filteredImages.length === 0 ? ( +
+ {selectedUser === 'all' ? '没有找到图片数据' : '该用户没有上传图片'} +
+ ) : ( +
+ {filteredImages.map((image) => ( +
handleImageClick(image)} + > + +
+

{image.imageName || '未命名图片'}

+

上传用户: {image.uploadUser || '未知'}

+

拍摄时间: {image.shootingTime || '未知'}

+ {image.partId &&

关联部件: {image.partId}

} +
+
+ ))} +
+ )} +
+ + {/* 图片详情模态框 */} + {showModal && selectedImage && ( +
+
e.stopPropagation()}> + +

图片关联信息

+ +
+
+ +
+ +
+
+
+ )} + + {/* 放大图片的模态框 */} + {enlargedImage && ( +
setEnlargedImage(null)}> +
e.stopPropagation()}> + + 放大图片 +
+
+ )}
); } -export default App; +export default App; \ No newline at end of file diff --git a/src/components/DEFINE.js b/src/components/DEFINE.js new file mode 100644 index 0000000..8dcaca8 --- /dev/null +++ b/src/components/DEFINE.js @@ -0,0 +1,3 @@ +const DTAI_SITE = 'http://pms.dtyx.net:9158'; + +export default DTAI_SITE; \ No newline at end of file diff --git a/src/components/EditableField.js b/src/components/EditableField.js new file mode 100644 index 0000000..1d41bbe --- /dev/null +++ b/src/components/EditableField.js @@ -0,0 +1,44 @@ +/** + * 可编辑字段组件 + * 提供一个带有标签的可编辑输入字段,支持多种输入类型 + * + * 用法: + * + * + * @param {string} label - 字段标签文本 + * @param {string|number} value - 字段当前值 + * @param {string} fieldName - 字段名称,用于标识字段 + * @param {function} onChange - 字段值变化时的回调函数 (fieldName, newValue) => void + * @param {string} [type="text"] - 输入类型,支持text/number/datetime-local等 + */ +import React, { useState } from 'react'; + +const EditableField = ({ label, value, fieldName, onChange, type = "text" }) => { + const [fieldValue, setFieldValue] = useState(value || ''); + + const handleChange = (e) => { + const newValue = e.target.value; + setFieldValue(newValue); + onChange(fieldName, newValue); + }; + + return ( +
+ + +
+ ); +}; + +export default EditableField; \ No newline at end of file diff --git a/src/components/ImageAPI.js b/src/components/ImageAPI.js new file mode 100644 index 0000000..36fe022 --- /dev/null +++ b/src/components/ImageAPI.js @@ -0,0 +1,73 @@ +/** + * 图片数据API模块 + * 封装所有与图片数据相关的API调用 + * + * 主要函数: + * - fetchImages(token): 获取图片列表 + * - linkImagesToPart(token, formData): 关联图片到部件 + * + * 依赖: + * - axios: HTTP请求库 + * - DTAI_SITE: API基础URL + */ +import axios from 'axios'; +import DTAI_SITE from './DEFINE.js'; + +/** + * 获取图片列表 + * @param {string} token - 授权token(可选) + * @returns {Promise} 图片数据数组 + */ +export const fetchImages = async (token) => { + try { + const headers = {}; + if (token) { + headers.Authorization = token; + } + + const response = await axios.get(`${DTAI_SITE}/image/list/app-upload-images`, { + headers + }); + + if (response.data && response.data.success) { + return response.data.data || []; + } + throw new Error('获取图片失败'); + } catch (err) { + throw new Error(err.message || '获取图片时发生错误'); + } +}; + +/** + * 关联图片到部件 + * @param {string} token - 授权token(可选) + * @param {Object} formData - 关联表单数据 + * @returns {Promise} 响应数据 + */ +export const linkImagesToPart = async (token, formData) => { + const headers = {}; + if (token) { + headers.Authorization = token; + } + + // 转换数值类型字段 + const payload = { + ...formData, + humidness: formData.humidness ? parseInt(formData.humidness) : undefined, + shootingDistance: formData.shootingDistance ? parseInt(formData.shootingDistance) : undefined, + temperatureMax: formData.temperatureMax ? parseFloat(formData.temperatureMax) : undefined, + temperatureMin: formData.temperatureMin ? parseFloat(formData.temperatureMin) : undefined, + windLevel: formData.windLevel ? parseInt(formData.windLevel) : undefined + }; + + const response = await axios.post( + DTAI_SITE + '/image/linkAppImagesToPart', + payload, + { headers } + ); + + if (response.data && response.data.success) { + return response.data; + } + throw new Error('图片关联失败'); +}; \ No newline at end of file diff --git a/src/components/ImagePreview.js b/src/components/ImagePreview.js new file mode 100644 index 0000000..cd26569 --- /dev/null +++ b/src/components/ImagePreview.js @@ -0,0 +1,63 @@ +/** + * 图片预览组件 + * 显示图片预览及基本信息,支持错误处理和点击放大 + * + * 用法: + * + * + * @param {Object} image - 图片数据对象 + * @param {boolean} [isInModal=false] - 是否在模态框中显示 + * @param {function} [onEnlarge] - 点击放大回调函数 + */ +import React from 'react'; +import DTAI_SITE from './DEFINE.js'; + +const ImagePreview = ({ image, isInModal = false, onEnlarge }) => { + /** + * 获取图片预览URL + * @param {string} imagePath - 图片路径 + * @returns {string} 完整图片URL + */ + const getImagePreviewUrl = (imagePath) => { + if (!imagePath) return ''; + return `${DTAI_SITE}${imagePath}`; + }; + + const previewUrl = getImagePreviewUrl(image.imagePath); + const imageSizeInfo = image.imageSize ? `大小: ${image.imageSize}` : '大小: 未知'; + const resolutionInfo = image.imageWidth && image.imageHeight + ? `分辨率: ${image.imageResolution}` + : '分辨率: 未知'; + + return ( +
+ {previewUrl ? ( +
+ {image.imageName { + e.target.onerror = null; + e.target.src = './pictures/R-C.jpg'; + }} + title={`${imageSizeInfo}\n${resolutionInfo}`} + onClick={isInModal && onEnlarge ? () => onEnlarge(previewUrl) : undefined} + /> +
+
{imageSizeInfo}
+
{resolutionInfo}
+
+
+ ) : ( +
无预览图
+ )} +
+ ); +}; + +export default ImagePreview; \ No newline at end of file diff --git a/src/components/LinkForm.js b/src/components/LinkForm.js new file mode 100644 index 0000000..7506844 --- /dev/null +++ b/src/components/LinkForm.js @@ -0,0 +1,165 @@ +/** + * 图片关联表单组件 - 与预览组件配合的布局 + * 自适应右侧表单区域,确保与左侧预览协调 + */ +import React from 'react'; +import EditableField from './EditableField'; +import WeatherSelect from './weatherselect.js'; + +const SHOOTING_METHOD_OPTIONS = [ + 'MANUAL', 'AUTO', 'TRIPOD', 'DRONE', 'ROBOT' +]; + +const LinkForm = ({ formData, image, onChange, onSubmit, loading }) => { + return ( +
+ {/* 表单标题 */} +
+

图片关联信息

+
+ {image.imageName} + {image.imageWidth}×{image.imageHeight} +
+
+ + {/* 自适应表单网格 */} +
+ {/* 第一组:核心信息 */} +
+
+ +
+
+ + +
+
+ + {/* 第二组:拍摄信息 */} +
+
+ onChange('weather', value)} + /> +
+ + +
+
+
+ +
+
+ + {/* 第三组:环境信息 */} +
+
+ + +
+
+ + +
+
+ + {/* 第四组:时间信息 */} +
+
+ +
+
+ +
+
+
+ + {/* 操作按钮 */} +
+ +
+
+ ); +}; + +export default LinkForm; \ No newline at end of file diff --git a/src/components/UserFilter.js b/src/components/UserFilter.js new file mode 100644 index 0000000..fe9b1d3 --- /dev/null +++ b/src/components/UserFilter.js @@ -0,0 +1,40 @@ +/** + * 用户筛选组件 + * 提供按用户筛选图片的功能 + * + * 用法: + * + * + * @param {Array} users - 用户列表,包含'all'选项 + * @param {string} selectedUser - 当前选中的用户 + * @param {function} onChange - 用户选择变化回调 + * @param {boolean} disabled - 是否禁用选择框 + */ +import React from 'react'; + +const UserFilter = ({ users, selectedUser, onChange, disabled }) => { + return ( +
+ + +
+ ); +}; + +export default UserFilter; \ No newline at end of file diff --git a/src/components/weatherselect.js b/src/components/weatherselect.js new file mode 100644 index 0000000..8b2e46c --- /dev/null +++ b/src/components/weatherselect.js @@ -0,0 +1,76 @@ +import React, { useState, useEffect } from 'react'; +import DTAI_SITE from './DEFINE'; + +const WeatherSelect = ({ value, onChange }) => { + const [weatherOptions, setWeatherOptions] = useState([]); + const [loading, setLoading] = useState(true); + + // 默认天气选项 + const defaultWeatherOptions = [ + { value: 'sunny', label: '晴天' }, + { value: 'cloudy', label: '多云' }, + { value: 'light-rain', label: '小雨' }, + { value: 'moderate-rain', label: '中雨' }, + { value: 'heavy-rain', label: '大雨' }, + { value: 'storm', label: '暴雨' } + ]; + + useEffect(() => { + const fetchWeatherOptions = async () => { + try { + const response = await fetch(DTAI_SITE + '/weather-type/list'); + const data = await response.json(); + if (data.code === 0) { + // 转换API数据格式 + const options = data.rows.map(item => ({ + value: item.weatherCode, + label: item.chineseName + })); + // 如果API返回的列表不为空则使用API数据,否则使用默认选项 + setWeatherOptions(options.length > 0 ? options : defaultWeatherOptions); + } else { + // API返回错误时使用默认选项 + setWeatherOptions(defaultWeatherOptions); + } + } catch (error) { + console.error('获取天气选项失败:', error); + // 请求失败时使用默认选项 + setWeatherOptions(defaultWeatherOptions); + } finally { + setLoading(false); + } + }; + + fetchWeatherOptions(); + }, []); + + if (loading) { + return ( +
+ + +
+ ); + } + + return ( +
+ + +
+ ); +}; + +export default WeatherSelect; \ No newline at end of file diff --git a/src/constants.js b/src/constants.js new file mode 100644 index 0000000..8dc6ee5 --- /dev/null +++ b/src/constants.js @@ -0,0 +1,3 @@ +export const SHOOTING_METHOD_OPTIONS = [ + 'MANUAL', 'AUTO', 'TRIPOD', 'DRONE', 'ROBOT' +]; \ No newline at end of file