# Features 架构迁移计划 ## 目标架构设计 ### 目录结构 ``` frontend/src/ ├── features/ # 业务功能模块(按业务领域组织) │ ├── auth/ # 认证与账户 │ │ ├── api/ # API 调用 │ │ ├── components/ # 该模块专属组件 │ │ ├── composables/ # 业务逻辑 │ │ ├── views/ # 页面视图 │ │ ├── types.ts # 类型定义 │ │ └── index.ts # 模块导出 │ ├── listings/ # 商品浏览与搜索 │ ├── orders/ # 订单管理 │ ├── chats/ # 聊天消息 │ ├── wallet/ # 钱包支付 │ ├── disputes/ # 争议仲裁 │ ├── seller/ # 卖家中心 │ └── admin/ # 管理后台 ├── shared/ # 跨模块共享资源 │ ├── components/ # 通用UI组件 │ │ ├── ui/ # 基础组件 (Button, Input...) │ │ ├── business/ # 业务组件 (ListingCard, OrderStatus...) │ │ └── layout/ # 布局组件 │ ├── composables/ # 通用工具函数 │ │ ├── useDebounce.ts │ │ ├── useLazyLoad.ts │ │ └── useMoney.ts │ ├── utils/ # 工具函数 │ ├── types/ # 全局类型定义 │ ├── styles/ # 全局样式 │ └── api/ # API 基础设施 │ ├── client.ts # axios 实例 │ └── types.ts # 通用 API 类型 ├── stores/ # 全局状态管理(仅全局状态) ├── router/ # 路由配置 ├── layouts/ # 布局模板 ├── App.vue └── main.ts ``` --- ## 渐进式迁移策略 ### 阶段 1:基础设施准备(P0) **目标:** 创建新的目录结构,建立共享层 **任务:** 1. 创建 `features/` 和 `shared/` 目录 2. 迁移共享资源到 `shared/`: - `shared/api/` ← `api/client.ts`, `api/types.ts` - `shared/utils/` ← `utils/` - `shared/types/` ← `types/` - `shared/composables/` ← 通用 composables 3. 保持原有路径的 re-export 兼容层 --- ### 阶段 2:第一批核心模块迁移(P1) **优先级排序依据:** 边界清晰 + 高复用 + 当前开发热点 #### 2.1 订单模块(orders)- 最高优先级 **理由:** 当前开发重点,边界清晰,依赖关系多 **迁移内容:** ``` features/orders/ ├── api/ │ └── orders.ts ← api/orders.ts ├── components/ │ ├── OrderCard.vue ← views/account/components/ │ ├── OrderStatusBadge.vue │ └── PaymentQRCode.vue ├── composables/ │ ├── useOrderDetail.ts ← composables/order/useOrderDetail.ts(需拆分) │ ├── useOrderSnapshot.ts ← composables/order/useOrderSnapshot.ts │ ├── usePaymentPolling.ts # 新:从 useOrderDetail 拆分 │ └── useSettlement.ts # 新:从 useOrderDetail 拆分 ├── views/ │ ├── OrdersView.vue ← views/account/OrdersView.vue │ ├── OrderDetailView.vue ← views/account/OrderDetailView.vue │ ├── OrderCreateView.vue ← views/account/OrderCreateView.vue │ ├── MobileOrdersView.vue ← views/mobile/MobileOrdersView.vue │ └── MobileOrderDetailView.vue ├── types.ts └── index.ts ``` **重构点:** - 拆分 `useOrderDetail.ts`(目前混合了订单、支付、结算、争议逻辑) - 提取支付轮询逻辑到独立 composable - 提取结算逻辑到独立 composable --- #### 2.2 钱包模块(wallet) **理由:** 边界清晰,被订单依赖 **迁移内容:** ``` features/wallet/ ├── api/ │ └── wallet.ts ← api/wallet.ts ├── composables/ │ ├── useWallet.ts # 新:封装钱包状态 │ ├── useMoney.ts ← composables/useMoney.ts │ └── usePricingCalculator.ts ← composables/usePricingCalculator.ts ├── views/ │ └── WalletView.vue ← views/account/WalletView.vue ├── types.ts └── index.ts ``` --- #### 2.3 聊天模块(chats) **理由:** 边界清晰,独立性强 **迁移内容:** ``` features/chats/ ├── api/ │ └── chats.ts ← api/chats.ts ├── components/ │ ├── ChatBubble.vue ← views/account/components/ │ ├── MessageInput.vue │ └── ChatAttachmentImage.vue ← components/ChatAttachmentImage.vue ├── composables/ │ └── useChatSSE.ts ← composables/useChatSSE.ts ├── views/ │ ├── ChatView.vue ← views/account/ChatView.vue │ ├── MessagesView.vue ← views/account/MessagesView.vue │ ├── MobileChatView.vue ← views/mobile/MobileChatView.vue │ └── MobileMessagesView.vue ├── types.ts └── index.ts ``` --- ### 阶段 3:第二批模块迁移(P2) #### 3.1 商品浏览模块(listings) ``` features/listings/ ├── api/ │ ├── listings.ts ← api/listings.ts │ ├── listingOptions.ts ← api/listingOptions.ts │ └── homeConfig.ts ← api/homeConfig.ts ├── components/ │ ├── ListingCard.vue ← views/public/components/ │ ├── HomeFilters.vue │ ├── RangeFilter.vue │ └── SkinFilter.vue ├── composables/ │ ├── useHomeFilters.ts ← composables/home/useHomeFilters.ts │ ├── useFilterOptions.ts ← composables/home/useFilterOptions.ts │ └── useListingQuery.ts ← composables/home/useListingQuery.ts ├── views/ │ ├── HomeView.vue ← views/public/HomeView.vue │ ├── ListingsView.vue ← views/public/ListingsView.vue │ ├── ListingDetailView.vue ← views/public/ListingDetailView.vue │ ├── MobileHomeView.vue ← views/mobile/MobileHomeView.vue │ └── MobileListingDetailView.vue ├── types.ts └── index.ts ``` #### 3.2 用户认证模块(auth) ``` features/auth/ ├── api/ │ ├── auth.ts ← api/auth.ts │ ├── realname.ts ← api/realname.ts │ └── notifications.ts ← api/notifications.ts ├── composables/ │ ├── useSmsCountdown.ts ← composables/useSmsCountdown.ts │ └── useAuth.ts # 新:封装认证逻辑 ├── views/ │ ├── LoginView.vue ← views/public/LoginView.vue │ ├── ProfileView.vue ← views/account/ProfileView.vue │ ├── RealnameView.vue ← views/account/RealnameView.vue │ ├── NotificationsView.vue ← views/account/NotificationsView.vue │ └── Mobile*.vue ├── types.ts └── index.ts ``` --- ### 阶段 4:剩余模块迁移(P3) #### 4.1 卖家中心(seller) ``` features/seller/ ├── api/ # 复用 listings.ts ├── composables/ │ ├── usePublishForm.ts ← composables/usePublishForm.ts │ └── usePublishDraft.ts ← composables/usePublishDraft.ts ├── views/ │ ├── SellerListingsView.vue │ ├── SellerListingCreateView.vue │ ├── SellerHandoffsView.vue │ └── SellerEarningsView.vue └── index.ts ``` #### 4.2 争议模块(disputes) ``` features/disputes/ ├── api/ │ └── disputes.ts ← api/disputes.ts ├── components/ │ └── DisputeDialog.vue # 从 OrderDetail 拆分 ├── composables/ │ └── useDispute.ts # 从 useOrderDetail 拆分 └── index.ts ``` #### 4.3 管理后台(admin) ``` features/admin/ ├── api/ │ ├── adminAuth.ts │ ├── adminDashboard.ts │ ├── adminUsers.ts │ └── ...(其他admin API) ├── components/ │ └── (管理端组件) ├── composables/ │ ├── useAdminTable.ts ← composables/useAdminTable.ts │ └── useAdminPaginatedTable.ts ├── views/ │ └── Admin*.vue ← views/admin/ └── index.ts ``` --- ## 迁移实施步骤(单个模块) ### Step 1: 创建目标目录结构 ```bash mkdir -p features/{module}/api mkdir -p features/{module}/components mkdir -p features/{module}/composables mkdir -p features/{module}/views ``` ### Step 2: 移动文件 ```bash # API mv src/api/{module}.ts features/{module}/api/ # Views mv src/views/account/{Module}*.vue features/{module}/views/ mv src/views/mobile/Mobile{Module}*.vue features/{module}/views/ # Composables mv src/composables/{module}/ features/{module}/composables/ ``` ### Step 3: 更新导入路径 ```typescript // 旧路径 import { getOrders } from '@/api/orders' import { useOrderDetail } from '@/composables/order/useOrderDetail' // 新路径 import { getOrders } from '@/features/orders/api/orders' import { useOrderDetail } from '@/features/orders/composables/useOrderDetail' // 或通过模块入口 import { getOrders, useOrderDetail } from '@/features/orders' ``` ### Step 4: 创建模块 index.ts ```typescript // features/orders/index.ts export * from './api/orders' export * from './composables/useOrderDetail' export * from './composables/useOrderSnapshot' export type * from './types' ``` ### Step 5: 更新路由配置 ```typescript // router/orderRoutes.ts import OrdersView from '@/features/orders/views/OrdersView.vue' import OrderDetailView from '@/features/orders/views/OrderDetailView.vue' ``` ### Step 6: 建立兼容层(可选) 在旧路径保留 re-export,逐步迁移其他模块的导入: ```typescript // api/orders.ts(旧路径) export * from '@/features/orders/api/orders' ``` ### Step 7: 验证与测试 - 运行 `npm run typecheck` 检查类型错误 - 运行 `npm run dev` 验证运行时无误 - 手动测试迁移模块的功能 --- ## 迁移优先级总结 | 阶段 | 模块 | 优先级 | 预计工作量 | 依赖关系 | |------|------|--------|-----------|---------| | P0 | 基础设施 | 最高 | 2小时 | 无 | | P1 | orders | 最高 | 4小时 | 依赖 wallet, chats | | P1 | wallet | 高 | 2小时 | 无 | | P1 | chats | 高 | 2小时 | 无 | | P2 | listings | 中 | 3小时 | 无 | | P2 | auth | 中 | 3小时 | 无 | | P3 | seller | 低 | 2小时 | 依赖 listings | | P3 | disputes | 低 | 1小时 | 依赖 orders | | P3 | admin | 低 | 4小时 | 依赖所有模块 | **总计:** ~23小时工作量 --- ## 迁移检查清单 ### 每个模块完成后需要验证: - [ ] 类型检查通过 (`npm run typecheck`) - [ ] 开发服务器启动正常 (`npm run dev`) - [ ] 路由访问正常 - [ ] API 调用正常 - [ ] 页面功能正常 - [ ] 移动端兼容性正常 - [ ] 无 console 错误 ### 全部迁移完成后: - [ ] 删除旧的 `api/`、`views/`、部分 `composables/` 目录 - [ ] 删除兼容层 re-export - [ ] 更新 `tsconfig.json` 路径别名(如需要) - [ ] 更新团队文档 --- ## 风险与注意事项 ### 高风险点: 1. **循环依赖问题:** features 间互相导入可能导致循环依赖 - **解决方案:** 将共享类型提取到 `shared/types/`,严格控制跨 feature 导入 2. **导入路径大量变更:** 可能引入遗漏的导入错误 - **解决方案:** 每迁移一个模块立即运行 typecheck,使用 VS Code 的"查找所有引用" 3. **移动端与桌面端组件复用:** 同一 feature 内可能有多个平台的 view - **解决方案:** 在 `views/` 下按平台分组或使用文件命名区分 ### 中风险点: 1. **路由配置分散:** 当前路由已按模块分离,需同步更新 2. **Stores 依赖:** session/adminSession 是全局状态,保留在 `stores/` 3. **composables 拆分:** `useOrderDetail.ts` 需要拆分,可能影响现有功能 --- ## 后续优化建议 迁移完成后可以进一步优化: 1. **模块懒加载优化:** 利用 Vite 的动态导入,按 feature 分包 2. **类型安全增强:** 为每个 feature 定义严格的类型边界 3. **测试覆盖:** 为每个 feature 添加单元测试和集成测试 4. **文档完善:** 为每个 feature 添加 README.md 说明职责和使用方法 5. **性能监控:** 利用 `composables/performance/` 对每个 feature 进行性能监控 --- **创建时间:** 2026-06-04 **负责人:** yml **状态:** 待执行