feat: P1 学习技能包 — 可组合技能模块系统

后端:
- SkillsModule (service + controller),8 个预置技能
- GET /skills (支持 category/difficulty/search 过滤)
- GET /skills/:id /categories /difficulties

前端:
- /skills 技能市场 — 分类/难度/搜索过滤
- /skills/[id] 技能详情 — system prompt、练习任务、starter
- header 导航新增「技能」入口
- sandbox page 改为从 API 加载技能(替代硬编码 SCENES)
- 支持 ?skill=xxx 直接加载指定技能
- useSearchParams Suspense 包装

全栈: 70 pages / 92 tests 全部通过
This commit is contained in:
yuzhiran-dev
2026-05-18 11:15:00 +08:00
parent cba785e6bd
commit fb092cb5d9
14 changed files with 553 additions and 26 deletions
@@ -0,0 +1,31 @@
import { Controller, Get, Param, Query } from '@nestjs/common';
import { ApiTags } from '@nestjs/swagger';
import { SkillsService, Skill } from './skills.service';
@ApiTags('技能')
@Controller('skills')
export class SkillsController {
constructor(private skillsService: SkillsService) {}
@Get()
findAll(@Query() query: { category?: string; difficulty?: string; search?: string; tag?: string }) {
return this.skillsService.findAll(query);
}
@Get('categories')
getCategories() {
return this.skillsService.getCategories();
}
@Get('difficulties')
getDifficulties() {
return this.skillsService.getDifficulties();
}
@Get(':id')
findById(@Param('id') id: string) {
const skill = this.skillsService.findById(id);
if (!skill) return { error: '技能不存在' };
return skill;
}
}