# graphql **Repository Path**: unsafe-rust/graphql ## Basic Information - **Project Name**: graphql - **Description**: 学习使用 `gqlgen` 自动生成 `graphql` 服务 - **Primary Language**: Go - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-11-19 - **Last Updated**: 2021-12-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 1、初始化项目 (只有当前项目根目录下有了 `go.mod` 才能执行以下命令) ````shell cd $GOPATH/src/ && mkdir graphql && go mod init graphql ```` # 2、下载 `gqlgen` (执行完这个命令后: 当前项目 `go.mod` 下就有了 `go.sum`) ````shell go get github.com/99designs/gqlgen ```` # 3、使用 `gqlgen` 生成 `graphql服务` ````shell gqlgen init ```` # 4、生成的目录结构如下 ```` ├── README.md ├── go.mod ├── go.sum ├── gqlgen.yml - gql配置文件,用以自动生成代码 ├── graph │   ├── generated - 自动生成的运行代码 │   │   └── generated.go │   ├── model - 自动生成的结构体 │   │   └── models_gen.go │   ├── resolver.go - 解析类,里面其实就是一个结构体 │   ├── schema.graphqls - 请求参数、响应数据、请求方法等都在 .*graphqls 这种 schema 文件中定义 │   └── schema.resolvers.go - 解析类文件,也是主要的开发地方 └── server.go ```` # 5、编写 `schema.graphqls` 文件,定义接口 ````graphql type Todo { id: ID! text: String! done: Boolean! user: User! } type User { id: ID! name: String! } input NewTodo { text: String! userId: String! } # ========================================== 新增如下数据 ========================================== type TeacherInfo { id: Int! name: String! avatar:String! info: String! score: Float! role: Int! teacherScore: [TeacherScore] #定义一个 TeacherScore 类型的切片 } type TeacherScore { id: Int! t_id: Int! comment:String! u_id: Int! score: Float! } # 定义输入参数 (即: 接口请求参数) input updateInfo { id: Int! name: String! avatar: String! info: String! } input insertInfo { name: String! avatar: String! info: String! } # 定义查询操作中的接口 type Query { todos: [Todo!]! # 接口名称 todos,接口请求参数 Todo teacherInfo: [TeacherInfo!]! teacherScore(id:Int!):TeacherInfo! # 接口名称 teacherScore,请求参数 int 类型的id ,返回值 TeacherInfo } # 定义变动操作中的接口 type Mutation { createTodo(input: NewTodo!): Todo! # 接口名称 createTodo,接口请求参数 input 类型是 :NewTodo updateTeacherInfo(req:updateInfo!):TeacherInfo! insertTeacherInfo(req:insertInfo!): [TeacherInfo!] # 返回值是 TeacherInfo 类型的数组 } ```` # 6、在当前项目根目录下执行 `gqlgen` 命令,`graph/generated/generated.go`,`graph/model/models_gen.go`,`graph/schema.resolvers.go` 将自动更新代码,开发者只需要在 `schema.resolvers.go` 中填充业务逻辑即可。 ````shell gqlgen ```` # 7、在 schema.resolvers.go 中填充业务逻辑 如下 ````go ```` # 8、开放流程: 1- 初始化项目,生成项目基本骨架 =========》2- 编写 schema 接口文件,定义接口 =========》3- 执行 gqlgen 命令,自动化生成代码 =========》4- 在 schema.resolvers.go 中填充业务逻辑 # 9、`dao` 层应该放在 `graph` 目录之外,因为 `graph` 目录只能约束 `graphql` 服务,这样也更便于区分 (既: `graph` 目录下的子目录及文件都是为 `graphql` 服务的) # 10、`graph/model/models_gen.go` 文件中只能定义数据结构,不能定义数据操作,数据操作只能定义在 `dao`层 # 11、将 `gqlgen.yml` 中的 `resolver配置`的 `dir` 配置项置为空,则重新使用 `gqlgen`命令生成的代码不会覆盖原来的`*resolver.go`文件