fb092cb5d9
后端: - 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 全部通过
32 lines
829 B
TypeScript
32 lines
829 B
TypeScript
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;
|
|
}
|
|
}
|