material_manage_system/docs/superpowers/specs/2026-09-07-wmms-vue-migration-design.md
2026-09-15 16:08:18 +08:00

272 lines
8.7 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.

# WMMS Vue 重构设计方案
**日期**:2026-09-07
**项目**:仓库物料管理系统(WMMS)
**目标**:jQuery 前端 → Vue 3 前端
---
## 一、技术选型
| 层 | 选型 | 说明 |
|---|---|---|
| 框架 | Vue 3 (Composition API) | 最新稳定版 |
| 构建工具 | Vite | 快速开发热更新 |
| 状态管理 | Pinia | Vue 3 官方推荐 |
| 路由 | Vue Router 4 | History 模式 |
| UI 组件库 | Element Plus | 后台管理系统标配 |
| HTTP 客户端 | Axios | 封装请求拦截器 |
| 开发端口 | 8081 | 与旧版 8080 分离 |
---
## 二、项目结构
```
warehouse-mms/
├── web/ # 旧版 jQuery 前端(已禁用)
│ ├── index.html # 已重命名为 index.html.bak
│ ├── js/
│ └── css/
├── frontend/ # 新版 Vue 项目
│ ├── src/
│ │ ├── assets/ # 静态资源
│ │ ├── components/ # 基础组件
│ │ │ ├── business/ # 业务组件
│ │ │ │ ├── BaseTable.vue
│ │ │ │ ├── BasePagination.vue
│ │ │ │ ├── BaseModal.vue
│ │ │ │ ├── BaseForm.vue
│ │ │ │ ├── StatusBadge.vue
│ │ │ │ ├── RoleBadge.vue
│ │ │ │ ├── DeleteConfirm.vue
│ │ │ │ ├── AlertTip.vue
│ │ │ │ ├── LoadingOverlay.vue
│ │ │ │ ├── ImagePreview.vue
│ │ │ │ ├── DatePicker.vue
│ │ │ │ └── MaterialSelect.vue
│ │ │ └── layout/ # 布局组件
│ │ │ ├── AppHeader.vue
│ │ │ └── AppSidebar.vue
│ │ ├── views/ # 页面组件
│ │ │ ├── Login.vue
│ │ │ ├── Materials.vue
│ │ │ ├── Inbound.vue
│ │ │ ├── Outbound.vue
│ │ │ ├── Stock.vue
│ │ │ ├── Application.vue
│ │ │ ├── Approval.vue
│ │ │ ├── Logs.vue
│ │ │ └── Users.vue
│ │ ├── stores/ # Pinia Store
│ │ │ ├── auth.js
│ │ │ ├── materials.js
│ │ │ ├── stock.js
│ │ │ ├── inbound.js
│ │ │ ├── outbound.js
│ │ │ ├── application.js
│ │ │ ├── approval.js
│ │ │ ├── logs.js
│ │ │ ├── users.js
│ │ │ └── ui.js
│ │ ├── api/ # API 封装层
│ │ │ ├── index.js # Axios 实例
│ │ │ ├── auth.js
│ │ │ ├── materials.js
│ │ │ ├── inbound.js
│ │ │ ├── outbound.js
│ │ │ ├── stock.js
│ │ │ ├── application.js
│ │ │ ├── logs.js
│ │ │ └── users.js
│ │ ├── router/ # 路由配置
│ │ │ └── index.js
│ │ ├── App.vue
│ │ └── main.js
│ ├── public/
│ ├── index.html
│ ├── vite.config.js
│ └── package.json
└── internal/ # Go 后端(不变)
```
---
## 三、路由设计
| 路径 | 页面 | 权限 |
|---|---|---|
| /login | 登录页 | 游客 |
| /materials | 物料管理 | admin |
| /inbound | 入库管理 | admin |
| /outbound | 出库管理 | admin |
| /stock | 库存查询 | 登录用户 |
| /application | 物料申请 | 登录用户 |
| /approval | 申请审批 | admin |
| /logs | 日志记录 | admin |
| /users | 用户管理 | admin |
**路由守卫**:
- `authRequired`:需登录
- `adminOnly`:需管理员权限
- `guestOnly`:仅限未登录用户
---
## 四、组件设计
### 4.1 布局组件
**AppHeader**
- 顶部导航栏
- 显示系统标题、当前用户、角色徽章、退出按钮
- Props: `user`, `isLoggedIn`
- Emits: `logout`
**AppSidebar**
- 左侧菜单
- 根据用户权限动态显示菜单项
- 高亮当前激活菜单
- Props: `menuItems`, `activeMenu`
- Emits: `menu-select`
### 4.2 基础组件
| 组件 | 职责 |
|---|---|
| BaseTable | 通用表格,封装分页、加载状态 |
| BasePagination | 分页组件 |
| BaseModal | 弹窗基础组件 |
| BaseForm | 表单基础组件 |
| StatusBadge | 状态徽章(pending/completed/processing) |
| RoleBadge | 角色徽章(admin/user) |
| DeleteConfirm | 删除确认弹窗 |
| AlertTip | 提示消息 |
| LoadingOverlay | 加载遮罩 |
| ImagePreview | 图片预览 |
| DatePicker | 日期选择 |
| MaterialSelect | 物料选择器 |
### 4.3 业务组件
| 组件 | 对应模块 | 职责 |
|---|---|---|
| MaterialTable | materials.js | 物料列表、新增编辑删除 |
| MaterialForm | materials.js | 物料表单 |
| InboundTable | inbound.js | 入库单列表 |
| InboundForm | inbound.js | 入库单表单 |
| OutboundTable | outbound.js | 出库单列表 |
| OutboundForm | outbound.js | 出库单表单 |
| StockTable | stock.js | 库存列表 |
| StockWarning | stock.js | 库存预警 |
| StockLogs | stock.js | 库存变动日志 |
| ApplicationForm | application.js | 物料申请表单 |
| MyApplications | application.js | 我的申请列表 |
| ApprovalTable | application.js | 审批列表 |
| LogsTable | logs.js | 日志记录 |
| UserTable | users.js | 用户管理 |
---
## 五、Pinia Store 设计
### auth
- State: `token`, `user`, `isLoggedIn`, `isAdmin`
- Actions: `login`, `logout`, `fetchCurrentUser`, `saveAuth`, `clearAuth`
### materials
- State: `materials`, `materialsCache`, `categoryMap`, `loading`, `pagination`
- Actions: `fetchMaterials`, `createMaterial`, `updateMaterial`, `deleteMaterial`
### stock
- State: `stockList`, `warningList`, `logs`, `loading`, `stockPage`, `warningPage`, `logsPage`
- Actions: `fetchStock`, `fetchStockWarning`, `fetchStockLogs`
### inbound
- State: `inboundList`, `currentInbound`, `loading`, `page`
- Actions: `fetchInboundList`, `createInbound`, `updateInbound`, `deleteInbound`
### outbound
- State: `outboundList`, `currentOutbound`, `loading`, `page`
- Actions: `fetchOutboundList`, `createOutbound`, `updateOutbound`, `deleteOutbound`
### application
- State: `myApplications`, `materialsCache`, `loading`, `myPage`
- Actions: `createApplication`, `fetchMyApplications`, `cancelApplication`
### approval
- State: `applications`, `loading`, `approvalPage`
- Actions: `fetchPendingApplications`, `approveApplication`, `rejectApplication`
### logs
- State: `logs`, `loading`, `page`, `filters`
- Actions: `fetchLogs`, `setFilters`, `resetFilters`
### users
- State: `users`, `loading`, `page`
- Actions: `fetchUsers`, `createUser`, `updateUser`, `deleteUser`
### ui
- State: `loading`, `loadingText`, `activeTab`, `sidebarCollapsed`
- Actions: `setLoading`, `setActiveTab`, `toggleSidebar`
---
## 六、API 层设计
基于现有 `web/js/api.js` 重构为 `frontend/src/api/` 模块化结构。
**Axios 实例配置**:
- baseURL: `/api`
- timeout: 30000ms
- 请求拦截器:添加 `Authorization: Bearer token`
- 响应拦截器:2xx 直接返回 data,401 跳转登录
**API 模块**:
- `auth.js` - 登录、获取当前用户
- `materials.js` - 物料 CRUD
- `inbound.js` - 入库单 CRUD
- `outbound.js` - 出库单 CRUD
- `stock.js` - 库存查询、预警、日志
- `application.js` - 申请单
- `logs.js` - 操作日志
- `users.js` - 用户 CRUD
**WebSocket**:
- 端口:8080/ws(与后端相同)
- 重连机制:指数退避
- 用途:实时库存更新推送
---
## 七、实施计划
| Day | 任务 | 交付物 |
|---|---|---|
| Day 1 | 初始化 Vue 项目 + API 层 + Pinia 基础 | 项目架子、API 接口封装、Store 基础模块 |
| Day 2 | 基础组件 + 登录/物料/库存页面 | 10 个基础组件、3 个主要页面 |
| Day 3 | 出入库/申请/审批/日志/用户 + 权限 | 剩余页面、路由守卫、权限控制 |
---
## 八、风险与应对
| 风险 | 影响 | 应对 |
|---|---|---|
| 业务逻辑遗漏 | 重构后功能不完整 | 逐模块对照旧版代码、详细测试 |
| 性能退化 | 大数据量时变慢 | 虚拟滚动、合理使用 computed |
| WebSocket 重连 | 实时功能失效 | 指数退避重连 + 心跳检测 |
| 权限控制绕过 | 安全风险 | 后端 API 也有 AdminOnly 验证 |
---
## 九、测试验收标准
1. 所有 8 个页面功能正常
2. 登录/登出正常
3. 权限控制生效(admin vs 普通用户)
4. 分页、搜索功能正常
5. 新增/编辑/删除操作正常
6. WebSocket 实时推送正常
7. 旧版 `web/` 可随时恢复