diff --git a/.gitignore b/.gitignore index eeceb58..029a244 100644 --- a/.gitignore +++ b/.gitignore @@ -38,3 +38,8 @@ docker-compose.override.yml # ===== Misc ===== *.log *.tmp + +# ===== 排除独立项目/个人文档 ===== +track-uniapp/ +track1.0.md +PROJECT_STATUS.md diff --git a/frontend/package-lock.json b/frontend/package-lock.json index e94acf8..8b178e8 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -12,6 +12,8 @@ "@tauri-apps/api": "^2.11.1", "@tauri-apps/plugin-shell": "^2.3.5", "axios": "^1.19.0", + "html5-qrcode": "^2.3.8", + "lucide-react": "^1.28.0", "react": "^19.2.8", "react-dom": "^19.2.8", "react-router-dom": "^7.18.2", @@ -23,6 +25,7 @@ "@types/node": "^24.13.3", "@types/react": "^19.2.17", "@types/react-dom": "^19.2.3", + "@vitejs/plugin-basic-ssl": "^2.3.0", "@vitejs/plugin-react": "^6.0.4", "oxlint": "^1.75.0", "typescript": "~6.0.2", @@ -210,9 +213,6 @@ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -230,9 +230,6 @@ "arm64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -250,9 +247,6 @@ "ppc64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -270,9 +264,6 @@ "riscv64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -290,9 +281,6 @@ "riscv64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -310,9 +298,6 @@ "s390x" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -330,9 +315,6 @@ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -350,9 +332,6 @@ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -517,9 +496,6 @@ "cpu": [ "arm64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -536,9 +512,6 @@ "cpu": [ "arm64" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -555,9 +528,6 @@ "cpu": [ "ppc64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -574,9 +544,6 @@ "cpu": [ "s390x" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -593,9 +560,6 @@ "cpu": [ "x64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -612,9 +576,6 @@ "cpu": [ "x64" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -803,9 +764,6 @@ "cpu": [ "arm64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -822,9 +780,6 @@ "cpu": [ "arm64" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -841,9 +796,6 @@ "cpu": [ "x64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -860,9 +812,6 @@ "cpu": [ "x64" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -1046,9 +995,6 @@ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "Apache-2.0 OR MIT", "optional": true, "os": [ @@ -1066,9 +1012,6 @@ "arm64" ], "dev": true, - "libc": [ - "musl" - ], "license": "Apache-2.0 OR MIT", "optional": true, "os": [ @@ -1086,9 +1029,6 @@ "riscv64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "Apache-2.0 OR MIT", "optional": true, "os": [ @@ -1106,9 +1046,6 @@ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "Apache-2.0 OR MIT", "optional": true, "os": [ @@ -1126,9 +1063,6 @@ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "Apache-2.0 OR MIT", "optional": true, "os": [ @@ -1228,6 +1162,19 @@ "@types/react": "^19.2.0" } }, + "node_modules/@vitejs/plugin-basic-ssl": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-2.3.0.tgz", + "integrity": "sha512-bdyo8rB3NnQbikdMpHaML9Z1OZPBu6fFOBo+OtxsBlvMJtysWskmBcnbIDhUqgC8tcxNv/a+BcV5U+2nQMm1OQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "peerDependencies": { + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, "node_modules/@vitejs/plugin-react": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.5.tgz", @@ -1606,6 +1553,12 @@ "node": ">= 0.4" } }, + "node_modules/html5-qrcode": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/html5-qrcode/-/html5-qrcode-2.3.8.tgz", + "integrity": "sha512-jsr4vafJhwoLVEDW3n1KvPnCCXWaQfRng0/EEYk1vNcQGcG/htAdhJX0be8YyqMoSz7+hZvOZSTAepsabiuhiQ==", + "license": "Apache-2.0" + }, "node_modules/https-proxy-agent": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", @@ -1764,9 +1717,6 @@ "cpu": [ "arm64" ], - "libc": [ - "glibc" - ], "license": "MPL-2.0", "optional": true, "os": [ @@ -1787,9 +1737,6 @@ "cpu": [ "arm64" ], - "libc": [ - "musl" - ], "license": "MPL-2.0", "optional": true, "os": [ @@ -1810,9 +1757,6 @@ "cpu": [ "x64" ], - "libc": [ - "glibc" - ], "license": "MPL-2.0", "optional": true, "os": [ @@ -1833,9 +1777,6 @@ "cpu": [ "x64" ], - "libc": [ - "musl" - ], "license": "MPL-2.0", "optional": true, "os": [ @@ -1889,6 +1830,15 @@ "url": "https://opencollective.com/parcel" } }, + "node_modules/lucide-react": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.28.0.tgz", + "integrity": "sha512-fARAFJULsGuDDydjp6+6blekG/sBIM29TerzLjc9bQUKAcEfrSc4ZQKb25KRz4OMKd87cZTb5dgq0w/T6KufVg==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/magic-string": { "version": "0.30.21", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", @@ -2437,9 +2387,6 @@ "cpu": [ "arm64" ], - "libc": [ - "glibc" - ], "license": "MPL-2.0", "optional": true, "os": [ @@ -2460,9 +2407,6 @@ "cpu": [ "arm64" ], - "libc": [ - "musl" - ], "license": "MPL-2.0", "optional": true, "os": [ @@ -2483,9 +2427,6 @@ "cpu": [ "x64" ], - "libc": [ - "glibc" - ], "license": "MPL-2.0", "optional": true, "os": [ @@ -2506,9 +2447,6 @@ "cpu": [ "x64" ], - "libc": [ - "musl" - ], "license": "MPL-2.0", "optional": true, "os": [ diff --git a/frontend/package.json b/frontend/package.json index 9139350..b4bd916 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -19,6 +19,8 @@ "@tauri-apps/api": "^2.11.1", "@tauri-apps/plugin-shell": "^2.3.5", "axios": "^1.19.0", + "html5-qrcode": "^2.3.8", + "lucide-react": "^1.28.0", "react": "^19.2.8", "react-dom": "^19.2.8", "react-router-dom": "^7.18.2", @@ -30,6 +32,7 @@ "@types/node": "^24.13.3", "@types/react": "^19.2.17", "@types/react-dom": "^19.2.3", + "@vitejs/plugin-basic-ssl": "^2.3.0", "@vitejs/plugin-react": "^6.0.4", "oxlint": "^1.75.0", "typescript": "~6.0.2", diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 9c8fda9..819c89e 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -1,23 +1,35 @@ -import { BrowserRouter, Routes, Route } from "react-router-dom"; +import { BrowserRouter, Routes, Route, Navigate } from "react-router-dom"; -function Home() { - return ( -
-

- 工厂生产流转管理系统 -

-
- ); -} +import AppLayout from "./components/layout/AppLayout"; +import ScanPage from "./pages/ScanPage"; +import MyTasksPage from "./pages/MyTasksPage"; +import NotificationsPage from "./pages/NotificationsPage"; +import ProfilePage from "./pages/ProfilePage"; -function App() { +import AdminLayout from "./components/layout/AdminLayout"; +import AdminDashboard from "./pages/admin/AdminDashboard"; +import AdminProductsPage from "./pages/admin/AdminProductsPage"; + +export default function App() { return ( - } /> + {/* 移动端 */} + } /> + }> + } /> + } /> + } /> + } /> + + + {/* PC 管理端 */} + } /> + }> + } /> + } /> + ); } - -export default App; diff --git a/frontend/src/index.css b/frontend/src/index.css index f1d8c73..5e7534b 100644 --- a/frontend/src/index.css +++ b/frontend/src/index.css @@ -1 +1,36 @@ @import "tailwindcss"; + +/* ============================================================ + 移动端安全区适配(刘海屏 / 底部指示条) + TailwindCSS v4 自定义 utility + ============================================================ */ + +@utility pt-safe { + padding-top: max(1rem, env(safe-area-inset-top)); +} + +@utility pb-safe { + padding-bottom: max(0.5rem, env(safe-area-inset-bottom)); +} + +/* ============================================================ + 全局基样式 + ============================================================ */ + +html { + /* 防止 iOS Safari 橡皮筋效果导致误触导航 */ + overscroll-behavior: none; +} + +body { + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + /* 禁止用户缩放(移动端 PWA 常用) */ + touch-action: manipulation; +} + +/* 隐藏默认的滚动条(移动端无滚动条更干净) */ +::-webkit-scrollbar { + width: 0; + height: 0; +} diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts index ad821d1..a8aceb2 100644 --- a/frontend/vite.config.ts +++ b/frontend/vite.config.ts @@ -1,18 +1,27 @@ import { defineConfig } from "vite"; import react from "@vitejs/plugin-react"; import tailwindcss from "@tailwindcss/vite"; +import basicSsl from "@vitejs/plugin-basic-ssl"; // https://vite.dev/config/ export default defineConfig({ - plugins: [react(), tailwindcss()], + plugins: [react(), tailwindcss(), basicSsl()], clearScreen: false, server: { - host: "0.0.0.0", // 允许局域网访问(手机真机调试) + host: "0.0.0.0", port: 1420, strictPort: true, + // Docker on Windows/WSL 必须用 polling 才能检测到文件变化 watch: { + usePolling: true, ignored: ["**/src-tauri/**"], }, + proxy: { + "/api": { + target: "http://backend:8000", // Docker 内部用服务名 + changeOrigin: true, + }, + }, }, });