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:
@@ -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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user