# 药箱前端开发文档
## 1. 项目概述
药箱(YaoXiang)是一个家庭药品与应急物资管理系统,前端采用 React + TypeScript + Vite 技术栈,支持 PWA 和大屏模式。
## 2. 技术栈
| 技术 | 版本 | 说明 |
|------|------|------|
| React | 18.2.0 | UI 框架 |
| TypeScript | 5.2.2 | 类型系统 |
| Vite | 5.0.0 | 构建工具 |
| React Router | 6.20.0 | 路由管理 |
| Zustand | 4.4.7 | 状态管理 |
| Ant Design Mobile | 5.34.0 | UI 组件库 |
| Axios | 1.6.2 | HTTP 客户端 |
| Day.js | 1.11.10 | 日期处理 |
## 3. 项目结构
```
frontend/
├── public/ # 静态资源
│ ├── favicon.svg # 网站图标
│ ├── manifest.json # PWA 配置
│ └── icons/ # 应用图标
│
├── src/
│ ├── api/ # API 调用层
│ │ ├── client.ts # Axios 实例配置
│ │ ├── auth.ts # 认证相关 API
│ │ ├── medicines.ts # 药品管理 API
│ │ ├── batches.ts # 批次管理 API
│ │ ├── categories.ts # 分类管理 API
│ │ ├── search.ts # 搜索 API
│ │ ├── notifications.ts # 通知 API
│ │ ├── users.ts # 用户管理 API
│ │ └── index.ts # 导出汇总
│ │
│ ├── components/ # 公共组件
│ │ ├── Layout/ # 布局组件(含 TabBar)
│ │ ├── MedicineCard/ # 药品卡片
│ │ ├── QuantitySelector/ # 数量选择器
│ │ ├── SearchBar/ # 搜索栏
│ │ ├── CameraCapture/ # 摄像头捕获
│ │ ├── CategoryTree/ # 分类树
│ │ └── index.ts # 导出汇总
│ │
│ ├── pages/ # 页面组件
│ │ ├── Home/ # 首页(库存概览)
│ │ ├── Login/ # 登录页
│ │ ├── MedicineList/ # 药品列表
│ │ ├── MedicineDetail/ # 药品详情
│ │ ├── AddMedicine/ # 添加/编辑药品
│ │ ├── QuickDispense/ # 快速取药(大屏模式)
│ │ ├── Search/ # 搜索页
│ │ ├── Notifications/ # 通知中心
│ │ ├── Settings/ # 设置页
│ │ └── index.ts # 导出汇总
│ │
│ ├── stores/ # 状态管理
│ │ ├── authStore.ts # 认证状态
│ │ ├── medicineStore.ts # 药品状态
│ │ ├── categoryStore.ts # 分类状态
│ │ ├── notificationStore.ts # 通知状态
│ │ ├── uiStore.ts # UI 状态
│ │ └── index.ts # 导出汇总
│ │
│ ├── hooks/ # 自定义 Hooks
│ │ ├── useAuth.ts # 认证 Hook
│ │ ├── useMedicine.ts # 药品 Hook
│ │ ├── useCamera.ts # 摄像头 Hook
│ │ ├── useNotification.ts # 通知 Hook
│ │ └── index.ts # 导出汇总
│ │
│ ├── types/ # TypeScript 类型定义
│ │ ├── user.ts # 用户类型
│ │ ├── medicine.ts # 药品类型
│ │ ├── batch.ts # 批次类型
│ │ ├── category.ts # 分类类型
│ │ ├── notification.ts # 通知类型
│ │ ├── api.ts # API 响应类型
│ │ └── index.ts # 导出汇总
│ │
│ ├── utils/ # 工具函数
│ │ ├── date.ts # 日期处理
│ │ ├── storage.ts # 本地存储
│ │ ├── validators.ts # 表单验证
│ │ ├── constants.ts # 常量定义
│ │ └── index.ts # 导出汇总
│ │
│ ├── styles/ # 样式文件
│ │ ├── global.css # 全局样式
│ │ ├── variables.css # CSS 变量
│ │ ├── mixins.css # CSS 混入
│ │ └── index.css # 导入汇总
│ │
│ ├── App.tsx # 根组件
│ ├── main.tsx # 入口文件
│ └── router.tsx # 路由配置
│
├── index.html # HTML 模板
├── package.json # 依赖配置
├── vite.config.ts # Vite 配置
├── tsconfig.json # TypeScript 配置
├── tsconfig.node.json # Node TypeScript 配置
├── .env.example # 环境变量示例
└── .gitignore # Git 忽略文件
```
## 4. 快速开始
### 4.1 环境准备
```bash
# 进入前端目录
cd frontend
# 安装依赖
npm install
```
### 4.2 配置环境变量
```bash
# 复制环境变量示例文件
cp .env.example .env
# 编辑 .env 文件
VITE_API_BASE_URL=/api
```
### 4.3 启动开发服务器
```bash
npm run dev
```
访问 http://localhost:5173
### 4.4 构建生产版本
```bash
npm run build
```
构建产物位于 `dist/` 目录。
### 4.5 预览生产版本
```bash
npm run preview
```
## 5. 路由配置
### 5.1 路由表
| 路径 | 页面 | 说明 | 权限 |
|------|------|------|------|
| `/login` | Login | 登录页 | 公开 |
| `/` | Home | 首页 | 登录用户 |
| `/medicines` | MedicineList | 药品列表 | 登录用户 |
| `/medicines/add` | AddMedicine | 添加药品 | admin/user |
| `/medicines/:id` | MedicineDetail | 药品详情 | 登录用户 |
| `/medicines/edit/:id` | AddMedicine | 编辑药品 | admin/user |
| `/quick-dispense` | QuickDispense | 快速取药 | 登录用户 |
| `/search` | Search | 搜索页 | 登录用户 |
| `/notifications` | Notifications | 通知中心 | 登录用户 |
| `/settings` | Settings | 设置页 | 登录用户 |
### 5.2 路由守卫
路由守卫通过 `useAuth` Hook 实现:
```tsx
import { useAuth } from '../hooks';
const ProtectedRoute = ({ children }) => {
const { isAuthenticated } = useAuth();
if (!isAuthenticated) {
return