Files
OCR/FRONTEND_QUICK_REFERENCE.md
2025-11-12 23:55:21 +08:00

398 lines
8.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Tool_OCR 前端快速參考指南
## 文件位置速查表
### 主要文件位置
```
/Users/egg/Projects/Tool_OCR/frontend/
├── src/
│ ├── App.tsx # 路由定義
│ ├── main.tsx # 應用入口
│ ├── index.css # 全局樣式
│ ├── components/
│ │ ├── ui/ # UI 組件庫
│ │ ├── Layout.tsx # 主佈局
│ │ ├── FileUpload.tsx # 文件上傳
│ │ └── ...
│ ├── pages/ # 頁面
│ ├── store/ # 狀態管理
│ ├── services/api.ts # API 客戶端
│ ├── types/api.ts # 類型定義
│ ├── i18n/ # 國際化
│ └── lib/utils.ts # 工具函數
├── vite.config.ts # Vite 配置
├── tailwind.config.js # Tailwind 配置
├── tsconfig.json # TypeScript 配置
└── package.json # 依賴管理
```
---
## 技術棧速查
| 功能 | 技術 | 版本 |
|-----|------|------|
| UI 框架 | React | 19.2.0 |
| 語言 | TypeScript | 5.9.3 |
| 構建 | Vite | 7.2.2 |
| 樣式 | Tailwind CSS | 4.1.17 |
| 狀態管理 | Zustand | 5.0.8 |
| 數據獲取 | React Query | 5.90.7 |
| 路由 | React Router | 7.9.5 |
| 國際化 | i18next | 25.6.2 |
| HTTP | Axios | 1.13.2 |
| 檔案上傳 | react-dropzone | 14.3.8 |
---
## 常用命令
```bash
# 開發
cd frontend
npm run dev # 啟動開發服務器 (localhost:12011)
npm run lint # 代碼檢查
npm run build # 生產構建
# 類型檢查
npx tsc --noEmit # 檢查 TypeScript 錯誤
# 格式化
npm install -D prettier # (如果需要)
npx prettier --write src/ # 格式化代碼
```
---
## 路由結構
```
/login → LoginPage (公開)
/upload → UploadPage (受保護)
/processing → ProcessingPage (受保護)
/results → ResultsPage (受保護)
/export → ExportPage (受保護)
/settings → SettingsPage (受保護)
```
### 添加新路由
```typescript
// 在 App.tsx 中
<Route path="new-page" element={<NewPage />} />
// 在導航中
{ to: '/new-page', label: t('nav.newPage') }
```
---
## 常用代碼片段
### 使用 i18n 翻譯
```typescript
const { t } = useTranslation()
<h1>{t('key.path')}</h1>
```
### 使用 Zustand 狀態
```typescript
const { batchId, setBatchId } = useUploadStore()
const { user, logout } = useAuthStore()
```
### 調用 API
```typescript
const data = await apiClient.uploadFiles(files)
const status = await apiClient.getBatchStatus(batchId)
```
### React Query 查詢
```typescript
const { data, isLoading } = useQuery({
queryKey: ['key', id],
queryFn: () => apiClient.getData(id),
})
```
### Tailwind 樣式
```typescript
className="flex items-center justify-between p-4 bg-card rounded-lg"
className={cn('base', { 'conditional': isActive })}
```
### 提示通知
```typescript
const { toast } = useToast()
toast({
title: 'Success',
description: 'Action completed',
variant: 'success',
})
```
---
## 調試技巧
### 查看存儲在 localStorage 的狀態
```javascript
// 在瀏覽器控制台
console.log(JSON.parse(localStorage.getItem('auth-storage')))
console.log(JSON.parse(localStorage.getItem('tool-ocr-upload-store')))
```
### 查看 React Query 緩存
```javascript
// 在瀏覽器控制台安裝 React Query DevTools
// npm install @tanstack/react-query-devtools
```
### TypeScript 錯誤
```bash
# 運行編譯器檢查類型
npx tsc --noEmit
```
---
## 環境變數配置
### 開發環境 (.env)
```env
VITE_API_BASE_URL=http://localhost:12010
```
### 使用環境變數
```typescript
const baseURL = import.meta.env.VITE_API_BASE_URL
```
---
## 常見問題
### Q: 如何添加新的頁面?
A:
1.`/src/pages` 創建 `NewPage.tsx`
2.`App.tsx` 添加路由
3. 在 Layout.tsx 導航中添加鏈接
### Q: 如何修改主題顏色?
A:
1. 編輯 `src/index.css` 中的 CSS 變數
2. 或編輯 `tailwind.config.js`
### Q: 如何添加新的翻譯?
A:
1. 編輯 `src/i18n/locales/zh-TW.json`
2. 在組件中使用 `t('key.path')`
### Q: 如何調試 API 請求?
A:
1. 打開瀏覽器開發者工具 (Network 標籤)
2. 檢查 `/api/v1/` 的請求
### Q: 上傳文件怎樣無法工作?
A:
1. 檢查後端是否在運行 (localhost:12010)
2. 檢查文件格式是否被支持
3. 檢查文件大小是否超過 50MB
### Q: 認證登錄失敗?
A:
1. 檢查用戶名和密碼
2. 檢查後端認證端點 `/api/v1/auth/login`
3. 檢查 localStorage 中的 token
---
## 依賴更新
```bash
# 檢查過期依賴
npm outdated
# 更新依賴
npm update
# 更新到最新版本
npm install --save-latest package-name
# 清除 node_modules 並重新安裝
rm -rf node_modules package-lock.json
npm install
```
---
## 性能優化
### 代碼分割
```typescript
import { lazy, Suspense } from 'react'
const NewPage = lazy(() => import('./pages/NewPage'))
// 在 Routes 中
<Suspense fallback={<div>Loading...</div>}>
<NewPage />
</Suspense>
```
### 優化 React Query
```typescript
const { data } = useQuery({
queryKey: ['items'],
queryFn: () => apiClient.getItems(),
staleTime: 1000 * 60 * 5, // 5 分鐘內不重新獲取
gcTime: 1000 * 60 * 10, // 10 分鐘後從緩存中移除
})
```
### 優化組件
```typescript
// 使用 React.memo 避免不必要的重新渲染
export default React.memo(function MyComponent(props) {
return <div>{props.data}</div>
})
```
---
## 測試 (可選)
```bash
# 安裝測試工具
npm install -D vitest @testing-library/react
# 運行測試
npm test
# 生成覆蓋率報告
npm test -- --coverage
```
---
## 構建和部署
```bash
# 生產構建
npm run build
# 預覽構建
npm run preview
# 構建後的文件位置
# dist/
# 部署
# 將 dist/ 目錄上傳到服務器
# 配置 Web 服務器支持 SPA (所有路由都指向 index.html)
```
---
## 貢獻指南
### 代碼風格
- 使用 TypeScript 進行類型安全
- 遵循現有的命名約定
- 優先使用 Tailwind CSS
- 添加必要的類型定義
### 提交代碼
```bash
# 檢查代碼
npm run lint
# 提交
git add .
git commit -m "description of changes"
git push
```
---
## 有用的資源
### 文檔
- [React 文檔](https://react.dev)
- [Tailwind CSS](https://tailwindcss.com)
- [React Router](https://reactrouter.com)
- [Zustand](https://github.com/pmndrs/zustand)
- [React Query](https://tanstack.com/query)
- [i18next](https://www.i18next.com)
### 工具
- [Vite 文檔](https://vitejs.dev)
- [TypeScript 文檔](https://www.typescriptlang.org)
- [ESLint 文檔](https://eslint.org)
### IDE 擴展 (VS Code)
- Tailwind CSS IntelliSense
- Thunder Client (API 測試)
- React Developer Tools
- Redux DevTools (狀態檢查)
---
## 快速開始
```bash
# 1. 進入前端目錄
cd /Users/egg/Projects/Tool_OCR/frontend
# 2. 安裝依賴
npm install
# 3. 啟動開發服務器
npm run dev
# 4. 打開瀏覽器
# 訪問 http://localhost:12011
# 5. 登錄
# 使用後端提供的帳號密碼
# 6. 開始使用
# 上傳檔案 → 處理 → 查看結果 → 匯出
```
---
## 常用快捷鍵
### VS Code
- `Ctrl+Shift+F` (或 `Cmd+Shift+F` 在 Mac) - 全文搜索
- `Ctrl+K Ctrl+X` - 刪除行
- `Alt+Up/Down` - 移動行
- `Ctrl+/` - 註解行
### 瀏覽器開發者工具
- `F12``Ctrl+Shift+I` - 打開開發者工具
- `Ctrl+Shift+C` - 元素檢查器
- `Ctrl+Shift+M` - 響應式設計模式
---
## 總結速記
**架構**React 19 + TypeScript + Vite
**樣式**Tailwind CSS 4
**狀態**Zustand (輕量) + React Query (數據)
**路由**React Router v7
**API**Axios 單例客戶端
**國際化**i18next (繁體中文)
**開發端口**12011
**後端 API**localhost:12010
**核心文件**
- App.tsx (路由)
- main.tsx (入口)
- services/api.ts (API)
- store/*.ts (狀態)
- pages/ (頁面)
- components/ (組件)