综合练习
tracks 迷你 Schema + Spring GraphQL 或 Apollo 只读页。
45 分钟
综合练习
动手搭建 tracks 迷你 GraphQL 读 API,与现有 REST /tracks 并存对照。巩固 Schema、Spring GraphQL、可选 Apollo 只读页;不替换 CodeRoadMap 生产主路径。
学习目标
- 完成从
schema.graphqls到@QueryMapping的闭环 - 用 GraphiQL 验证与 REST 数据一致
- (可选)在 Next.js lab 页用 Apollo 展示列表
核心内容
任务 A:Schema(后端 lab profile)
graphql/track.graphqls:
type Track {
slug: String!
title: String!
level: String
lessonCount: Int
}
type Query {
tracks: [Track!]!
track(slug: String!): Track
}
lessonCount 由 @SchemaMapping 或 Service 聚合 cf_lesson 计数——数据源仍 MySQL(spring-boot-essentials JPA)。
任务 B:Controller
@Profile("lab-graphql")
@Controller
public class TrackGraphqlController {
@QueryMapping
public List<Track> tracks() { return trackService.findAll(); }
@QueryMapping
public Track track(@Argument String slug) {
return trackService.findBySlug(slug).orElse(null);
}
}
启动:spring.profiles.active=lab-graphql,访问 GraphiQL。对照:
curl -s http://localhost:8080/tracks | jq length
任务 C:DataLoader(进阶)
为 Track.lessons 增加字段,实现 findByTrackSlugIn 批查,证明无 N+1(gql-nplus1)。
任务 D:前端(可选)
nextjs-essentials 新建 app/lab/graphql-tracks/page.tsx,gql-apollo 只读列表;页脚注明「实验接口,主站用 REST /tracks」。
验收标准
- GraphQL
tracks { slug title }与 RESTGET /tracks条数一致 - 生产 profile 未 暴露
/graphiql - README 一段说明:为何全站仍 REST