From 4f74c968fe8799d5836971af3d4dc7bbba42b26a Mon Sep 17 00:00:00 2001 From: zhangjiming Date: Sun, 2 Mar 2025 15:47:22 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=99=BB=E5=BD=95=E9=A1=B5?= =?UTF-8?q?=EF=BC=8C=E5=A2=9E=E5=8A=A0=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env | 1 + package-lock.json | 415 +++++++++++++++++++++++++++++++++++++++- package.json | 8 +- src/App.css | 38 ---- src/App.scss | 15 ++ src/App.tsx | 30 ++- src/assets/icon_logo.png | Bin 0 -> 7042 bytes src/assets/icon_logo.svg | 1 + src/assets/icon_pwd.svg | 1 + src/assets/icon_user.svg | 1 + src/assets/img_bg.jpg | Bin 0 -> 51172 bytes src/components/Footer.tsx | 3 + src/components/Header.tsx | 3 + src/index.css | 4 + src/index.tsx | 41 ++-- src/logo.svg | 1 - src/pages/home/Home.module.scss | 3 + src/pages/home/Home.tsx | 9 + src/pages/login/Login.tsx | 47 +++++ src/services/httpRequest.ts | 64 +++++++ src/services/socket.ts | 111 +++++++++++ src/styles/mixins.scss | 0 src/styles/variables.scss | 0 src/utils/index.ts | 5 + tailwind.config.js | 15 ++ 25 files changed, 745 insertions(+), 71 deletions(-) create mode 100644 .env delete mode 100644 src/App.css create mode 100644 src/App.scss create mode 100644 src/assets/icon_logo.png create mode 100644 src/assets/icon_logo.svg create mode 100644 src/assets/icon_pwd.svg create mode 100644 src/assets/icon_user.svg create mode 100644 src/assets/img_bg.jpg create mode 100644 src/components/Footer.tsx create mode 100644 src/components/Header.tsx delete mode 100644 src/logo.svg create mode 100644 src/pages/home/Home.module.scss create mode 100644 src/pages/home/Home.tsx create mode 100644 src/pages/login/Login.tsx create mode 100644 src/services/httpRequest.ts create mode 100644 src/services/socket.ts create mode 100644 src/styles/mixins.scss create mode 100644 src/styles/variables.scss create mode 100644 src/utils/index.ts create mode 100644 tailwind.config.js diff --git a/.env b/.env new file mode 100644 index 0000000..371506d --- /dev/null +++ b/.env @@ -0,0 +1 @@ +REACT_APP_WS_URL=localhost:8080/ws diff --git a/package-lock.json b/package-lock.json index 42b49e2..29d2d9b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,6 +30,7 @@ "browserslist": "^4.18.1", "camelcase": "^6.2.1", "case-sensitive-paths-webpack-plugin": "^2.4.0", + "classnames": "^2.5.1", "css-loader": "^6.5.1", "css-minimizer-webpack-plugin": "^3.2.0", "dotenv": "^10.0.0", @@ -45,7 +46,6 @@ "jest-resolve": "^27.4.2", "jest-watch-typeahead": "^1.0.0", "mini-css-extract-plugin": "^2.4.5", - "postcss": "^8.4.4", "postcss-flexbugs-fixes": "^5.0.2", "postcss-loader": "^6.2.1", "postcss-normalize": "^10.0.1", @@ -58,6 +58,7 @@ "react-dom": "^18.3.1", "react-refresh": "^0.11.0", "react-router": "^6.30.0", + "react-router-dom": "^6.30.0", "resolve": "^1.20.0", "resolve-url-loader": "^4.0.0", "rxjs": "^7.8.2", @@ -73,6 +74,11 @@ "webpack-dev-server": "^4.6.0", "webpack-manifest-plugin": "^4.0.2", "workbox-webpack-plugin": "^6.4.1" + }, + "devDependencies": { + "autoprefixer": "^10.4.20", + "postcss": "^8.5.3", + "sass": "^1.85.1" } }, "node_modules/@adobe/css-tools": { @@ -3211,6 +3217,316 @@ "node": ">= 8" } }, + "node_modules/@parcel/watcher": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher/-/watcher-2.5.1.tgz", + "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.1", + "@parcel/watcher-darwin-arm64": "2.5.1", + "@parcel/watcher-darwin-x64": "2.5.1", + "@parcel/watcher-freebsd-x64": "2.5.1", + "@parcel/watcher-linux-arm-glibc": "2.5.1", + "@parcel/watcher-linux-arm-musl": "2.5.1", + "@parcel/watcher-linux-arm64-glibc": "2.5.1", + "@parcel/watcher-linux-arm64-musl": "2.5.1", + "@parcel/watcher-linux-x64-glibc": "2.5.1", + "@parcel/watcher-linux-x64-musl": "2.5.1", + "@parcel/watcher-win32-arm64": "2.5.1", + "@parcel/watcher-win32-ia32": "2.5.1", + "@parcel/watcher-win32-x64": "2.5.1" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", + "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", + "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", + "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", + "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", + "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", + "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", + "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", + "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", + "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", + "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", + "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", + "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", + "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmmirror.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -7165,6 +7481,20 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmmirror.com/detect-newline/-/detect-newline-3.1.0.tgz", @@ -9763,6 +10093,13 @@ "url": "https://opencollective.com/immer" } }, + "node_modules/immutable": { + "version": "5.0.3", + "resolved": "https://registry.npmmirror.com/immutable/-/immutable-5.0.3.tgz", + "integrity": "sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==", + "devOptional": true, + "license": "MIT" + }, "node_modules/import-fresh": { "version": "3.3.1", "resolved": "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.1.tgz", @@ -12159,6 +12496,14 @@ "tslib": "^2.0.3" } }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmmirror.com/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "license": "MIT", + "optional": true + }, "node_modules/node-forge": { "version": "1.3.1", "resolved": "https://registry.npmmirror.com/node-forge/-/node-forge-1.3.1.tgz", @@ -15168,6 +15513,23 @@ "react": ">=16.8" } }, + "node_modules/react-router-dom": { + "version": "6.30.0", + "resolved": "https://registry.npmmirror.com/react-router-dom/-/react-router-dom-6.30.0.tgz", + "integrity": "sha512-x30B78HV5tFk8ex0ITwzC9TTZMua4jGyA9IUlH1JLQYQTFyxr/ZxwOJq7evg1JX1qGVUcvhsmQSKdPncQrjTgA==", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.23.0", + "react-router": "6.30.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmmirror.com/read-cache/-/read-cache-1.0.0.tgz", @@ -15729,6 +16091,27 @@ "integrity": "sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==", "license": "CC0-1.0" }, + "node_modules/sass": { + "version": "1.85.1", + "resolved": "https://registry.npmmirror.com/sass/-/sass-1.85.1.tgz", + "integrity": "sha512-Uk8WpxM5v+0cMR0XjX9KfRIacmSG86RH4DCCZjLU2rFh5tyutt9siAXJ7G+YfxQ99Q6wrRMbMlVl6KqUms71ag==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "chokidar": "^4.0.0", + "immutable": "^5.0.2", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" + } + }, "node_modules/sass-loader": { "version": "12.6.0", "resolved": "https://registry.npmmirror.com/sass-loader/-/sass-loader-12.6.0.tgz", @@ -15767,6 +16150,36 @@ } } }, + "node_modules/sass/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/sass/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/sax": { "version": "1.2.4", "resolved": "https://registry.npmmirror.com/sax/-/sax-1.2.4.tgz", diff --git a/package.json b/package.json index 394a246..78e550e 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ "browserslist": "^4.18.1", "camelcase": "^6.2.1", "case-sensitive-paths-webpack-plugin": "^2.4.0", + "classnames": "^2.5.1", "css-loader": "^6.5.1", "css-minimizer-webpack-plugin": "^3.2.0", "dotenv": "^10.0.0", @@ -40,7 +41,6 @@ "jest-resolve": "^27.4.2", "jest-watch-typeahead": "^1.0.0", "mini-css-extract-plugin": "^2.4.5", - "postcss": "^8.4.4", "postcss-flexbugs-fixes": "^5.0.2", "postcss-loader": "^6.2.1", "postcss-normalize": "^10.0.1", @@ -53,6 +53,7 @@ "react-dom": "^18.3.1", "react-refresh": "^0.11.0", "react-router": "^6.30.0", + "react-router-dom": "^6.30.0", "resolve": "^1.20.0", "resolve-url-loader": "^4.0.0", "rxjs": "^7.8.2", @@ -147,5 +148,10 @@ "presets": [ "react-app" ] + }, + "devDependencies": { + "autoprefixer": "^10.4.20", + "postcss": "^8.5.3", + "sass": "^1.85.1" } } diff --git a/src/App.css b/src/App.css deleted file mode 100644 index 74b5e05..0000000 --- a/src/App.css +++ /dev/null @@ -1,38 +0,0 @@ -.App { - text-align: center; -} - -.App-logo { - height: 40vmin; - pointer-events: none; -} - -@media (prefers-reduced-motion: no-preference) { - .App-logo { - animation: App-logo-spin infinite 20s linear; - } -} - -.App-header { - background-color: #282c34; - min-height: 100vh; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - font-size: calc(10px + 2vmin); - color: white; -} - -.App-link { - color: #61dafb; -} - -@keyframes App-logo-spin { - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } -} diff --git a/src/App.scss b/src/App.scss new file mode 100644 index 0000000..2c53b72 --- /dev/null +++ b/src/App.scss @@ -0,0 +1,15 @@ +.App { + text-align: center; +} +.App-logo { + animation: App-logo-spin infinite 20s linear; +} + +@keyframes App-logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} diff --git a/src/App.tsx b/src/App.tsx index d249ead..80df7cd 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,26 +1,18 @@ import React from 'react'; -import logo from './logo.svg'; -import './App.css'; -import { Switch } from 'antd'; + +import './App.scss'; +import { Outlet } from 'react-router'; + function App() { return (
-
- logo -

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

- - Learn React - - -
- + APP + +
+ +
); } diff --git a/src/assets/icon_logo.png b/src/assets/icon_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..1b4961bad9e71cd6705907f2c1cbaa36d6ebc27c GIT binary patch literal 7042 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 \ No newline at end of file diff --git a/src/assets/icon_pwd.svg b/src/assets/icon_pwd.svg new file mode 100644 index 0000000..a875ae3 --- /dev/null +++ b/src/assets/icon_pwd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icon_user.svg b/src/assets/icon_user.svg new file mode 100644 index 0000000..46a984b --- /dev/null +++ b/src/assets/icon_user.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/img_bg.jpg b/src/assets/img_bg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3272aff4676a174e10ff7b9740412c3cfd700b27 GIT binary patch literal 51172 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℘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�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 HK92uCY}e@1 literal 0 HcmV?d00001 diff --git a/src/components/Footer.tsx b/src/components/Footer.tsx new file mode 100644 index 0000000..73f9444 --- /dev/null +++ b/src/components/Footer.tsx @@ -0,0 +1,3 @@ +export default function Footer() { + return
Footer
+} \ No newline at end of file diff --git a/src/components/Header.tsx b/src/components/Header.tsx new file mode 100644 index 0000000..6b7e272 --- /dev/null +++ b/src/components/Header.tsx @@ -0,0 +1,3 @@ +export default function Header() { + return
Header
+} \ No newline at end of file diff --git a/src/index.css b/src/index.css index ec2585e..17df0e7 100644 --- a/src/index.css +++ b/src/index.css @@ -1,3 +1,7 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + body { margin: 0; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', diff --git a/src/index.tsx b/src/index.tsx index 032464f..a46276d 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -1,18 +1,37 @@ -import React from 'react'; -import ReactDOM from 'react-dom/client'; -import './index.css'; -import App from './App'; -import reportWebVitals from './reportWebVitals'; +import React from "react"; +import ReactDOM from "react-dom/client"; +import "./index.css"; +import { createBrowserRouter, RouterProvider } from "react-router-dom"; +import Login from "./pages/login/Login"; +import Home from "./pages/home/Home"; +import App from "./App"; +import reportWebVitals from "./reportWebVitals"; -const root = ReactDOM.createRoot( - document.getElementById('root') as HTMLElement -); +const router = createBrowserRouter([ + { + path: "/", + element: , + children: [ + { + path: "home", + element: , + }, + ], + }, + { + path: "/login", + element: , + }, +]); + +const root = ReactDOM.createRoot(document.getElementById("root") as HTMLElement); root.render( - - - + + + ); +console.log(process.env.REACT_APP_WS_URL); // If you want to start measuring performance in your app, pass a function // to log results (for example: reportWebVitals(console.log)) // or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals diff --git a/src/logo.svg b/src/logo.svg deleted file mode 100644 index 9dfc1c0..0000000 --- a/src/logo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/pages/home/Home.module.scss b/src/pages/home/Home.module.scss new file mode 100644 index 0000000..4ee680e --- /dev/null +++ b/src/pages/home/Home.module.scss @@ -0,0 +1,3 @@ +.home { + color: red; +} \ No newline at end of file diff --git a/src/pages/home/Home.tsx b/src/pages/home/Home.tsx new file mode 100644 index 0000000..fcae07f --- /dev/null +++ b/src/pages/home/Home.tsx @@ -0,0 +1,9 @@ +import "./Home.module.scss"; + +export default function Home() { + return ( + <> +
HOME
+ + ); +} diff --git a/src/pages/login/Login.tsx b/src/pages/login/Login.tsx new file mode 100644 index 0000000..4fb3606 --- /dev/null +++ b/src/pages/login/Login.tsx @@ -0,0 +1,47 @@ +import { Button, Form, Input } from "antd"; +import icon_user from "../../assets/icon_user.svg"; +import icon_pwd from "../../assets/icon_pwd.svg"; +import img_bg from "../../assets/img_bg.jpg"; +import img_logo from "../../assets/icon_logo.png"; +import { useNavigate } from "react-router"; + +export default function Login() { + const navigate = useNavigate(); + + const onFinish = (values: any) => { + console.log("Received values of form: ", values); + navigate('/home'); + }; + + return ( +
+
+
+ + + + } placeholder="用户名" className="w-[280px]" /> + + + + } type="password" placeholder="密码" /> + + + + + +

CHINA LOGISTICS

+
+
+
+ ); +} diff --git a/src/services/httpRequest.ts b/src/services/httpRequest.ts new file mode 100644 index 0000000..46ed9f7 --- /dev/null +++ b/src/services/httpRequest.ts @@ -0,0 +1,64 @@ +import { Subject } from "rxjs"; + +export interface BaseResponse { + success: boolean; + code: string; + msg: string; + data: T; +} + +type HttpReqParam = { + url: string; + method?: "GET" | "POST" | "PATCH" | "PUT" | "DELETE"; + params?: Record; + encode?: "form" | "json"; // 入参编码类型 + headers?: Record; +}; + +export type ApiException = "invalidToken" | "serverError"; + +const exceptionSub = new Subject(); +export const exceptionOb = exceptionSub.asObservable(); + +function extHandle(res: BaseResponse) { + if (res.code === "A0230") { + // 访问令牌无效或已过期 + exceptionSub.next("invalidToken"); + } + return { + ...res, + success: res.code === "00000", + }; +} + +export default async function httpRequest({ url, method = "GET", params = {}, encode = "json", headers = {} }: HttpReqParam) { + const token = sessionStorage.getItem("token"); + if (token) { + headers = { Authorization: token, ...headers }; + } + if (method === "GET") { + const query = urlEncode(params); + const _url = query ? url + "?" + query : url; + const res = await fetch(_url, { headers }); + return res.json().then(res => extHandle(res) as T); + } else { + const body = encode === "json" ? JSON.stringify(params) : urlEncode(params); + const _headers = + encode === "json" + ? { "Content-Type": "application/json; charset=utf-8", ...headers } + : { "Content-Type": "application/x-www-form-urlencoded; charset=utf-8", ...headers }; + const res = await fetch(url, { method, headers: _headers, body }); + return res.json().then(res => extHandle(res) as T); + } +} +export function urlEncode(params?: Record) { + let query = ""; + if (params && Object.keys(params).length > 0) { + const qs = []; + for (let attr in params) { + qs.push(`${attr}=${encodeURIComponent(params[attr])}`); + } + query = qs.join("&"); + } + return query; +} diff --git a/src/services/socket.ts b/src/services/socket.ts new file mode 100644 index 0000000..82c1b3c --- /dev/null +++ b/src/services/socket.ts @@ -0,0 +1,111 @@ +import { Subject } from "rxjs"; + +export type SocketState = 'open' | 'close' | 'error' + +class WebSocketClient { + private ws: WebSocket | null = null; + private url: string; + private reconnectAttempts: number = -1; + private maxReconnectAttempts: number = 5; + private reconnectInterval: number = 3000; + + readonly dataOb = new Subject() + readonly stateOb = new Subject() + + constructor(url: string) { + this.url = url; + } + + // 连接 WebSocket + connect(): void { + try { + // WebSocket.CONNECTING (0) WebSocket.OPEN (1) + if (this.ws && this.ws.readyState <= 1) { + // 已连接 + console.log(`${this.url} 正在连接或已连接,无需重复连接`); + } else { + this.ws = new WebSocket(this.url); + this.bindEvents(); + } + } catch (error) { + console.error("WebSocket 连接失败:", error); + this.reconnect(); + } + } + + // 绑定事件 + private bindEvents(): void { + if (!this.ws) return; + + // 连接建立时的处理 + this.ws.onopen = () => { + console.log("WebSocket 连接已建立"); + this.reconnectAttempts = -1; // 重置重连次数 + this.stateOb.next('open') + }; + + // 接收消息的处理 + this.ws.onmessage = (event: MessageEvent) => { + try { + const data = JSON.parse(event.data); + // console.log('🚀 ~ WebSocketClient ~ bindEvents ~ data:', data) + this.dataOb.next(data) + } catch (error) { + console.error("消息解析错误:", error); + } + }; + + this.ws.onclose = () => { + this.stateOb.next('close') + console.log("WebSocket 连接已关闭"); + this.reconnect(); + }; + + this.ws.onerror = error => { + this.stateOb.next('error') + console.error("WebSocket 错误:", error); + }; + } + + // 重连机制 + private reconnect(): void { + if (this.reconnectAttempts === -1) { + this.reconnectAttempts = 0; + } + if (this.reconnectAttempts >= this.maxReconnectAttempts) { + console.log("达到最大重连次数,停止重连"); + this.reconnectAttempts = -1; + return; + } + + setTimeout(() => { + console.log(`尝试第 ${this.reconnectAttempts + 1} 次重连...`); + this.reconnectAttempts++; + this.connect(); + }, this.reconnectInterval); + } + + // 关闭连接 + disconnect(): void { + if (this.ws) { + this.ws.close(); + this.ws = null; + } + } +} + +const urlSocketMap = new Map(); + +// 导出 WebSocket 客户端 +export const createWebSocket = (url: string): WebSocketClient => { + if (urlSocketMap.has(url)) { + return urlSocketMap.get(url)!; + } else { + const client = new WebSocketClient(url); + urlSocketMap.set(url, client); + return client; + } +}; + + +export const sharedWsUrl = `ws://${process.env.REACT_APP_WS_URL}`; \ No newline at end of file diff --git a/src/styles/mixins.scss b/src/styles/mixins.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/styles/variables.scss b/src/styles/variables.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/utils/index.ts b/src/utils/index.ts new file mode 100644 index 0000000..1c1eb9a --- /dev/null +++ b/src/utils/index.ts @@ -0,0 +1,5 @@ +export function formatRemainTime(seconds: number) { + const min = Math.floor(seconds / 60).toFixed(); + const sec = (seconds % 60).toFixed(); + return min.padStart(2, "0") + ":" + sec.padStart(2, "0"); +} diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 0000000..3555d90 --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,15 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: ["./src/**/*.{js,jsx,ts,tsx}"], + theme: { + colors: { + primary: "#1989fa", + white: "#FFF", + title: "#646566", + text: "#333", + warn: "#f05a28", + }, + extend: {}, + }, + plugins: [], +};