6个新功能完整实现方案.md 6.4 KB

📋 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

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 添加:

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

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

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

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 已重新生成
  • 可以立即测试