diff --git a/CLAUDE.md b/CLAUDE.md index ac3001d..b3e1bae 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -66,4 +66,23 @@ pnpm deploy:server # 部署后端到生产环境 ### 数据库 - Prisma schema 位于 `packages/server/prisma/schema.prisma` -- 核心数据模型:User(用户)、Studio(场馆)、TimeSlot(时段)、Booking(预约)、Membership(会员卡)、CardType(卡种)、Order(订单) \ No newline at end of file +- 核心数据模型:User、Studio、TimeSlot、Booking、Membership、CardType、Order +- 注意:查询会员列表时,booking 统计通过 `groupBy` 批量获取,避免 N+1 查询 + +### 卡类型枚举 +- `CardTypeCategory` (TIMES/DURATION/TRIAL) 定义在 `packages/shared/src/enums.ts` +- 会员管理筛选使用特殊值 `NONE` 表示无卡/无有效会员(不在枚举中) +- 前端选项硬编码在 `src/pages/admin/members.vue` 的 `cardTypeOptions`,需与枚举保持同步 + +### 管理后台 API 模式 +- `/admin/members` 支持 `page`, `limit`, `search`, `cardType` 参数 +- `cardType=NONE` → 无有效会员的用户;其他值对应 `CardTypeCategory` +- 预约统计(total/completed/cancelled)通过 `groupBy` 批量查询 + +### 筛选组件模式 +- picker 筛选使用 300ms debounce 再触发加载,避免频繁请求 +- 列表分页使用 `onReachBottom` + `hasMore` 标志位实现无限滚动 + +### Admin Store (`src/stores/admin.ts`) +- 聚合所有管理端 API 调用:weekTemplates、cardTypes、studioConfig、members、bookings、orders、stats 等 +- 遵循不可变更新原则:`data` 赋值使用展开运算符 `[...newData]` \ No newline at end of file diff --git a/packages/app/src/pages/admin/members.vue b/packages/app/src/pages/admin/members.vue index b11d1ac..b5eb70e 100644 --- a/packages/app/src/pages/admin/members.vue +++ b/packages/app/src/pages/admin/members.vue @@ -15,6 +15,19 @@ × + + + {{ cardTypeOptions[cardTypeIndex].label }} + + + 搜索 @@ -115,7 +128,7 @@