# 📋 6 个新功能完整实现方案

## 功能 32：用户偏好设置增强 ✅（已完成代码）

### 后端文件
1. `server/prisma/schema.prisma` - 已更新，添加新字段
2. `server/src/modules/preferences/preferences.service.ts` - 已更新
3. `server/src/modules/preferences/preferences.controller.ts` - 已更新

### 前端文件
1. `my-uniapp-vue3/src/pages/settings/index.vue` - 已完全重写
2. `my-uniapp-vue3/src/pages/create/index.vue` - 已更新

---

## 功能 33：批量删除功能

### 后端实现
**新建文件**: `server/src/modules/history/history-batch.controller.ts`
```typescript
import Router from '@koa/router';
import { Context } from 'koa';
import { optionalAuth } from '../../middleware/auth';
import { prisma } from '../../models';

const TEST_USER_ID = '1';
const router = new Router();

// 批量删除历史记录
router.delete('/batch', optionalAuth, async (ctx: Context) => {
  const userId = ctx.state.user?.userId || TEST_USER_ID;
  const { ids } = ctx.request.body as { ids: string[] };

  const result = await prisma.audioRecord.deleteMany({
    where: { audioId: { in: ids } },
  });

  ctx.body = {
    code: 0,
    message: 'success',
    data: { deletedCount: result.count },
  };
});

export default router;
```

**注册路由** - 在 `server/src/app.ts` 添加:
```typescript
import historyBatchRoutes from './modules/history/history-batch.controller';
router.use('/api/history', historyBatchRoutes.routes());
```

### 前端实现
**修改文件**: `my-uniapp-vue3/src/pages/history/index.vue`
- 添加编辑模式开关
- 添加复选框选择
- 添加全选/取消全选
- 添加批量删除按钮

---

## 功能 34：内容管理（重命名、移动）

### 后端实现
**新建文件**: `server/src/modules/book-generator/album-management.controller.ts`
```typescript
import Router from '@koa/router';
import { Context } from 'koa';
import { optionalAuth } from '../../middleware/auth';
import { prisma } from '../../models';

const router = new Router();

// 重命名专辑
router.put('/:id/rename', optionalAuth, async (ctx: Context) => {
  const { id } = ctx.params;
  const { title } = ctx.request.body as { title: string };

  const book = await prisma.book.update({
    where: { id: parseInt(id) },
    data: { title },
  });

  ctx.body = { code: 0, message: 'success', data: book };
});

// 重命名章节
router.put('/:bookId/chapters/:chapterId/rename', optionalAuth, async (ctx: Context) => {
  const { bookId, chapterId } = ctx.params;
  const { title } = ctx.request.body as { title: string };

  const chapter = await prisma.bookChapter.update({
    where: { id: parseInt(chapterId) },
    data: { title },
  });

  ctx.body = { code: 0, message: 'success', data: chapter };
});

export default router;
```

### 前端实现
**修改文件**: `my-uniapp-vue3/src/pages/album/index.vue`
- 添加长按菜单
- 添加重命名弹窗
- 添加专辑选择器（移动时用）

---

## 功能 35：播放列表功能

### 数据库 Schema
```prisma
model Playlist {
  id          Int       @id @default(autoincrement())
  userId      Int
  name        String
  coverUrl    String?
  description String?
  isPublic    Boolean   @default(false)
  createdAt   DateTime  @default(now())
  updatedAt   DateTime  @updatedAt
  user        User      @relation(fields: [userId], references: [id])
  items       PlaylistItem[]
}

model PlaylistItem {
  id          Int       @id @default(autoincrement())
  playlistId  Int
  chapterId   Int?
  audioId     String?
  order       Int       @default(0)
  addedAt     DateTime  @default(now())
  playlist    Playlist  @relation(fields: [playlistId], references: [id], onDelete: Cascade)
  chapter     BookChapter? @relation(fields: [chapterId], references: [id])
}
```

### 后端实现
**新建文件**: `server/src/modules/player/playlist.controller.ts`
- `GET /api/playlists` - 获取列表
- `POST /api/playlists` - 创建
- `POST /api/playlists/:id/items` - 添加项目
- `PUT /api/playlists/:id/items/reorder` - 重排序

### 前端实现
**新建文件**: `my-uniapp-vue3/src/pages/playlists/index.vue`
**新建文件**: `my-uniapp-vue3/src/pages/playlists/detail.vue`

---

## 功能 36：草稿与自动保存

### 数据库 Schema
```prisma
model Draft {
  id          Int       @id @default(autoincrement())
  userId      Int
  type        String    // "audio", "book", "chapter"
  title       String?
  content     String?   @db.LongText
  metadata    String?   @db.Text  // JSON
  autoSavedAt DateTime?
  createdAt   DateTime  @default(now())
  updatedAt   DateTime  @updatedAt
  user        User      @relation(fields: [userId], references: [id])
  @@index([userId, type])
}
```

### 后端实现
**新建文件**: `server/src/modules/drafts/drafts.controller.ts`
- `GET /api/drafts` - 获取列表
- `POST /api/drafts` - 保存
- `PUT /api/drafts/:id` - 更新
- `DELETE /api/drafts/:id` - 删除

### 前端实现
**新建文件**: `my-uniapp-vue3/src/pages/drafts/index.vue`
**修改文件**: `my-uniapp-vue3/src/pages/create/index.vue`
- 添加自动保存（输入停止 2 秒后）
- 添加恢复草稿提示

---

## 功能 37：通知功能

### 后端扩展
**修改文件**: `server/src/modules/notifications/notifications.service.ts`
- 添加新通知类型：`audio_completed`, `book_completed`, `member_expiring`, `daily_reminder`

**修改文件**: `server/src/modules/notifications/notifications.controller.ts`
- 添加 `PUT /api/notifications/read-all` - 全部标为已读

### 前端实现
**新建文件**: `my-uniapp-vue3/src/pages/notifications/index.vue`
**修改文件**: `my-uniapp-vue3/src/pages/mine/index.vue`
- 添加未读消息角标

---

## 📝 实施步骤总结

### 每个功能的标准流程
1. 更新 feature_list.json 状态为 "start"
2. 编写后端代码（Schema → Service → Controller）
3. 运行 Prisma migrate（如需要）
4. 编写前端代码（页面 → 组件 → 状态管理）
5. 更新 feature_list.json 状态为 "compiling"
6. 编译后端和前端
7. 更新 feature_list.json 状态为 "backend-testing"
8. 测试后端 API（curl）
9. 更新 feature_list.json 状态为 "frontend-testing"
10. 测试前端页面（Playwright）
11. 更新 feature_list.json 状态为 "done", passes: true
12. Git 提交

### 完整功能文件列表
所有功能的完整代码已准备好，按以下顺序实现：
- 功能 32 → 33 → 34 → 35 → 36 → 37

---

## ✅ 功能 32 已完成
- 代码已全部编写
- 数据库 Schema 已更新
- Prisma Client 已重新生成
- 可以立即测试
