tasks.md 9.0 KB


description: "Task list for 夜市摊位管理 feature implementation"

Tasks: 夜市摊位管理

Input: Design documents from specs/001-food-stall/ Prerequisites: plan.md, spec.md

Tests: 手动测试(项目无自动化测试框架)

Organization: Tasks are grouped by user story to enable independent implementation and testing of each story.

Format: [ID] [P?] [Story] Description

  • [P]: Can run in parallel (different files, no dependencies)
  • [Story]: Which user story this task belongs to (e.g., US1, US2, US3)
  • Include exact file paths in descriptions

Phase 1: Setup (数据库变更)

Purpose: 所有用户故事依赖的数据库 schema 变更

  • T001 执行 SQL 为 pos_store 表添加 is_stall 字段: ALTER TABLE pos_store ADD COLUMN is_stall TINYINT DEFAULT 0 COMMENT '是否摊位 0=店铺 1=摊位';
  • T002 执行 SQL 为 info_user 表添加 store_id 字段: ALTER TABLE info_user ADD COLUMN store_id BIGINT DEFAULT NULL COMMENT '关联摊位ID(摊位主使用)';
  • T003 执行 SQL 为 user_wallet 表添加 store_id 字段: ALTER TABLE user_wallet ADD COLUMN store_id BIGINT DEFAULT NULL COMMENT '关联摊位id,非摊位钱包为NULL';

Phase 2: Foundational (数据模型层变更)

Purpose: 所有用户故事依赖的 Domain 和 Mapper 变更,MUST 完成后再开始用户故事实现

  • T004 [P] [US1] PosStore.java 新增 isStall 字段及 getter/setter — ruoyi-system/src/main/java/com/ruoyi/system/domain/PosStore.java
  • T005 [P] [US1] PosStoreMapper.xml 更新: resultMap 添加 is_stall 映射,select/insert/update 添加 isStall 支持 — ruoyi-system/src/main/resources/mapper/chanting/PosStoreMapper.xml
  • T006 [P] [US2] InfoUser.java 新增 storeId 字段及 getter/setter — ruoyi-system/src/main/java/com/ruoyi/system/domain/InfoUser.java
  • T007 [P] [US2] InfoUserMapper.xml 更新: resultMap 添加 store_id 映射,select/insert/update 添加 storeId 支持,新增 selectStallOwnersByStoreId 查询 — ruoyi-system/src/main/resources/mapper/infouser/InfoUserMapper.xml
  • T008 [P] [US3] UserWallet.java 新增 storeId 字段及 getter/setter — ruoyi-system/src/main/java/com/ruoyi/system/domain/UserWallet.java
  • T009 [P] [US3] UserWalletMapper.xml 更新: resultMap 添加 store_id 映射,select/insert/update 添加 storeId 支持 — ruoyi-system/src/main/resources/mapper/system/UserWalletMapper.xml

Checkpoint: 数据模型层就绪,用户故事实现可以开始


Phase 3: User Story 1 — 摊位 CRUD(Priority: P1)🎯 MVP

Goal: 夜市用户可以创建、查看、管理自己的摊位(PosStore where isStall=1)

Independent Test: 夜市用户登录商家端 → 摊位管理 → 能看到摊位列表、能创建新摊位

Implementation for User Story 1

  • T010 [US1] 创建 StallController.java 实现摊位 CRUD 接口: GET /stall/list、POST /stall/add — ruoyi-admin/src/main/java/com/ruoyi/app/stall/StallController.java
  • T011 [P] [US1] 创建前端 API 层 stall.js — foodie-store/src/api/stall.js
  • T012 [US1] 创建 StallManage.vue 摊位管理页面(摊位列表 + 创建摊位弹窗) — foodie-store/src/views/StallManage.vue
  • T013 [US1] router/index.js 添加摊位管理路由 /stall-manage — foodie-store/src/router/index.js
  • T014 [US1] Aside.vue 添加「摊位管理」菜单项(仅 userType=3 可见) — foodie-store/src/components/Aside.vue

Checkpoint: 夜市用户可以登录 → 看到摊位管理菜单 → 创建/查看摊位


Phase 4: User Story 2 — 摊位主管理(Priority: P2)

Goal: 夜市用户可以为每个摊位创建、查看、启用/禁用/删除摊位主账号

Independent Test: 在摊位列表中点击「管理摊位主」→ 能添加/禁用/删除摊位主

Implementation for User Story 2

  • T015 [US2] StallController.java 添加摊位主管理接口: POST /stall/addOwner、GET /stall/owners、PUT /stall/disableOwner、PUT /stall/enableOwner、DELETE /stall/deleteOwner — ruoyi-admin/src/main/java/com/ruoyi/app/stall/StallController.java
  • T016 [US2] InfoUserMapper.java 添加 selectStallOwnersByStoreId 方法 — ruoyi-system/src/main/java/com/ruoyi/system/mapper/InfoUserMapper.java
  • T017 [US2] IInfoUserService.java / InfoUserServiceImpl.java 添加按 storeId 查询摊位主方法 — ruoyi-system/src/main/java/com/ruoyi/system/service/IInfoUserService.java, ruoyi-system/src/main/java/com/ruoyi/system/service/impl/InfoUserServiceImpl.java
  • T018 [US2] stall.js 添加摊位主管理 API 方法: getStallOwners, addStallOwner, disableStallOwner, enableStallOwner, deleteStallOwner — foodie-store/src/api/stall.js
  • T019 [US2] StallManage.vue 添加摊位主管理弹窗: 摊位主列表表格、添加摊位主按钮、禁用/删除操作 — foodie-store/src/views/StallManage.vue

Checkpoint: 夜市用户可以为摊位添加多个摊位主,启用/禁用/删除摊位主


Phase 5: User Story 3 — 摊位钱包(Priority: P3)

Goal: 每个摊位拥有独立钱包,摊位收入进入共同池子,创建摊位时自动创建钱包

Independent Test: 创建摊位后查询 user_wallet 表确认 store_id 关联的钱包已自动创建;查询用户钱包不包含摊位钱包

Implementation for User Story 3

  • T020 [US3] StallController.java addStall 方法中添加创建摊位后自动创建摊位钱包逻辑 — ruoyi-admin/src/main/java/com/ruoyi/app/stall/StallController.java
  • T021 [US3] UserWalletMapper.xml 修改所有通过 user_id 查钱包的 SQL 加上 store_id IS NULL 条件,新增通过 store_id 查摊位钱包的 selectByStoreId 方法 — ruoyi-system/src/main/resources/mapper/system/UserWalletMapper.xml
  • T022 [US3] UserWalletMapper.java 添加 selectByStoreId 方法,IUserWalletService.java / UserWalletServiceImpl.java 添加对应接口和实现 — ruoyi-system/src/main/java/com/ruoyi/system/mapper/UserWalletMapper.java, ruoyi-system/src/main/java/com/ruoyi/system/service/IUserWalletService.java, ruoyi-system/src/main/java/com/ruoyi/system/service/impl/UserWalletServiceImpl.java
  • T023 [US3] 检查所有现有钱包查询入口确保不误查摊位钱包: 订单结算、提现、余额查询等 — 搜索所有调用 UserWalletMapper/Service 的代码

Checkpoint: 创建摊位 → 钱包自动创建;用户钱包查询不包含摊位钱包;摊位钱包可通过 store_id 独立查询


Phase 6: Polish & 收尾

Purpose: 最终验证和提交

  • T024 端到端验证: 夜市用户登录 → 创建摊位 → 确认钱包自动创建 → 添加多个摊位主 → 禁用/启用摊位主 → 确认权限隔离正常
  • T025 更新 spec.md 记录实现中确认的细节
  • T026 提交代码: git commit -m "feat: 夜市摊位管理功能 — 创建摊位、管理摊位主、摊位钱包"

Dependencies & Execution Order

Phase Dependencies

  • Phase 1 (SQL): 无依赖,立即开始
  • Phase 2 (Model): 依赖 Phase 1 完成 — BLOCKS 所有用户故事
  • Phase 3 (US1 摊位CRUD): 依赖 Phase 2 — MVP
  • Phase 4 (US2 摊位主): 依赖 Phase 2 和 Phase 3(StallController 已存在)
  • Phase 5 (US3 钱包): 依赖 Phase 2 和 Phase 3(需在 StallController.addStall 中加逻辑)
  • Phase 6 (收尾): 依赖所有用户故事完成

User Story Dependencies

  • US1 (摊位CRUD): 依赖 Foundational — 无其他故事依赖
  • US2 (摊位主管理): 依赖 US1(需要 StallController 和摊位存在)
  • US3 (摊位钱包): 依赖 US1(需要 StallController.addStall 方法)

Parallel Opportunities

  • Phase 1: T001, T002, T003 可并行执行(不同表的 SQL)
  • Phase 2: T004+T005, T006+T007, T008+T009 可三组并行(不同 Domain/Mapper 文件)
  • Phase 3: T011 可与 T010 并行(不同文件)

Parallel Example: Phase 2

# 并行执行三组 Domain + Mapper 变更:
Task: "PosStore.java isStall + PosStoreMapper.xml"     # US1 相关
Task: "InfoUser.java storeId + InfoUserMapper.xml"     # US2 相关
Task: "UserWallet.java storeId + UserWalletMapper.xml" # US3 相关

Implementation Strategy

MVP First (US1 Only)

  1. Complete Phase 1: SQL 变更
  2. Complete Phase 2: T004+T005 (PosStore 模型层)
  3. Complete Phase 3: US1 摊位 CRUD
  4. STOP and VALIDATE: 夜市用户能创建/查看摊位
  5. 可选择先部署 MVP

Incremental Delivery

  1. Phase 1+2 → 基础就绪
  2. Phase 3 (US1) → 摊位 CRUD 可用(MVP)
  3. Phase 4 (US2) → 摊位主管理可用
  4. Phase 5 (US3) → 摊位钱包可用
  5. Phase 6 → 完整验证和提交

Notes

  • 项目无自动化测试,所有验证通过手动测试
  • PosStore 已有 isNightMarket/nightMarketId 字段可复用
  • StallController 已部分实现(已有 addStall, addStallOwner 等方法)
  • 用户钱包查询加 store_id IS NULL 条件是防止误查摊位钱包的关键
  • 摊位主权限通过 info_user 表判断,不通过钱包关联判断