zoukankan      html  css  js  c++  java
  • graphql 数据增删改查分页及关联操作(三)

    说明:

    • 接第二篇文章,代码也是在第二篇文章之上
    • 本文只是针对mondodb来操作

    一、添加相关的包

    • yarn add Mongoose

    二、初始化Mongodb

    • 修改server.ts
    • 导入 import * as Mongoose from 'mongoose';
    • 添加了方法 mongodbInit()
    • 全部代码如下 :
    •  1 import * as express from 'express';
       2 const { graphqlExpress, graphiqlExpress } = require('apollo-server-express')
       3 const expressPlayground = require('graphql-playground-middleware-express').default;
       4 import * as Mongoose from 'mongoose';
       5 var bodyParser = require('body-parser');
       6 
       7 import schema from './schema';
       8 
       9 class Server {
      10     public app: express.Application;
      11     constructor() {
      12         this.app = express();
      13         this.routes();
      14         this.mongodbInit();
      15     }
      16 
      17     private routes(): void {
      18         this.app.use('/graphql',bodyParser.json(), graphqlExpress({ schema }));
      19         this.app.get('/playground', expressPlayground({ endpoint: '/graphql' }));
      20     }
      21     
      22     private mongodbInit() {
      23         const MONGO_URI = "mongodb://localhost/gqlServer";
      24         Mongoose.connect(MONGO_URI || process.env.MONGO_URI);
      25         this.app.use(bodyParser.urlencoded({ extended: false }));
      26         this.app.use(bodyParser.json());
      27     } 
      28 }
      29 
      30 export default new Server().app;

    三、修改user文件

    • 添加user.ts代码如下:
    •  1 import { model, Schema, Document } from 'mongoose';
       2 
       3 export interface IUserModel extends Document {
       4     id:string,
       5     name: String,
       6     password: String,
       7 }
       8 
       9 let UserSchema: Schema = new Schema({
      10     name: String,
      11     password: String, 
      12     createAt: {
      13         type: Date,
      14         default: new Date(),
      15         required: true 
      16     },
      17     updateAt: {
      18         type: Date,
      19         default: new Date(),
      20         required: true
      21     },
      22 })
      23 
      24 export default model<IUserModel>('User', UserSchema);
    • 修改resolver.ts代码如下:
    • import UserSchema, { IUserModel } from './user';
      
      export class User {
          constructor() {
      
          }
      
          static Query: any = {
              getUsers(parent, { }, context) {
                  return UserSchema.find();
              }
          }
      
          static Mutation: any = {
              saveUser(parent, { user }, context) {
                  return UserSchema.create(user)
              }
          }
      
      }

    四、运行项目 yarn start 打开地址http://localhost:8080/playground应该可以添加用户和查找用户了效果如下:

    、增删改查相关的方法可以自己去扩展

    六、关联

    • 添加角色文件夹role/role.gql,role/resolve,role/resolver.ts
    • 代码基本可以复制user里面的代码改相关的名字
    • 项目结构
    • role.gql代码
    •  1 type Role{
       2     id:String
       3     roleName:String
       4 }
       5 
       6 
       7 extend type Query {
       8     # 查找所有角色
       9     getRoles: [Role]
      10 }
      11 
      12 extend type Mutation {
      13     # 创建角色| 修改角色
      14     saveRole(role:inputRole):Role
      15 }
      16 
      17 input inputRole{
      18     id:String
      19     roleName:String
      20 }
    • role.ts代码
    •  1 import { model, Schema, Document } from 'mongoose';
       2 
       3 export interface IRoleModel extends Document {
       4     id:string,
       5     roleMame: String,
       6 }
       7 
       8 let RoleSchema: Schema = new Schema({
       9     roleMame: String,
      10     createAt: {
      11         type: Date,
      12         default: new Date(),
      13         required: true 
      14     },
      15     updateAt: {
      16         type: Date,
      17         default: new Date(),
      18         required: true
      19     },
      20 })
      21 
      22 export default model<IRoleModel>('Role', RoleSchema);
    • resolver.ts 代码
    •  1 import RoleSchema, { IRoleModel } from './role';
       2 
       3 export class Role {
       4     constructor() {
       5 
       6     }
       7 
       8     static Query: any = {
       9         getRoles(parent, { }, context) {
      10             return RoleSchema.find();
      11         }
      12     }
      13 
      14     static Mutation: any = {
      15         saveRole(parent, { role }, context) {
      16             return RoleSchema.create(role)
      17         }
      18     }
      19 
      20 }
    • 导入resolver到resolvers.ts代码如下:
    •  1 import { User } from "./user/resolver";
       2 import { Role } from "./role/resolver";
       3 
       4 export default {
       5     Query: {
       6         ...User.Query,
       7         ...Role.Query
       8     },
       9     Mutation: {
      10         ...User.Mutation,
      11         ...Role.Mutation
      12     },
      13 };
    • 导入role.gql 到src/schema.ts 代码如下:
    •  1 import { makeExecutableSchema } from 'graphql-tools';
       2 import resolver from "./resolvers";
       3 var requireText = require('require-text');
       4 var Base = requireText('./base.gql', require);
       5 var User = requireText('./user/user.gql', require);
       6 var Role = requireText('./role/role.gql', require); //添加了角色 
       7 
       8 
       9 //基础信息
      10 var typeDefs = [Base];
      11 typeDefs = typeDefs.concat(User);
      12 typeDefs = typeDefs.concat(Role);
      13 
      14 const schema = makeExecutableSchema({
      15   typeDefs: typeDefs,
      16   resolvers: resolver
      17 })
      18 
      19 
      20 export default schema; 
    • 运行可以看到相关表,尝试添加一个角色,和查找一下

    七、关联用户与角色,基本关系,每一个用户有一个角色1对1

    • 修改文件user.gql代码如下:
    •  1 type User{
       2     id:String
       3     name:String
       4     passwrod:String
       5     # 添加了role字段
       6     Role:Role 
       7 }
       8 
       9 
      10 extend type Query {
      11     # 查找所有用户
      12     getUsers: [User]
      13 }
      14 
      15 extend type Mutation {
      16     # 创建用户|修改用户
      17     saveUser(user:inputUser):User
      18 }
      19 
      20 input inputUser{
      21     id:String
      22     name:String
      23     passwrod:String
      24     # 添加了roleid
      25     roleId:String
      26 }
    • 修改user.ts文件代码如下:
    •  1 import { model, Schema, Document } from 'mongoose';
       2 
       3 export interface IUserModel extends Document {
       4     id:string,
       5     name: String,
       6     passwrod: String,
       7     roleId: String,//只是添加了这里
       8 }
       9 
      10 let UserSchema: Schema = new Schema({
      11     name: String,
      12     passwrod: String, 
      13     roleId: String, //只是添加了这里
      14     createAt: {
      15         type: Date,
      16         default: new Date(),
      17         required: true 
      18     },
      19     updateAt: {
      20         type: Date,
      21         default: new Date(),
      22         required: true
      23     },
      24 })
      25 
      26 export default model<IUserModel>('User', UserSchema);
    • 修改user/resolver.ts文件代码如下:
    •  1 import UserSchema, { IUserModel } from './user';
       2 import RoleSchema from '../role/role';
       3 
       4 export class User {
       5     constructor() {
       6 
       7     }
       8 
       9     //只是添加用户的角色
      10     static User: any = {
      11         Role(model) {
      12             return RoleSchema.findById(model.roleId);
      13         },
      14     }
      15 
      16     static Query: any = {
      17         getUsers(parent, { }, context) {
      18             return UserSchema.find();
      19         }
      20     }
      21 
      22     static Mutation: any = {
      23         saveUser(parent, { user }, context) {
      24             return UserSchema.create(user)
      25         }
      26     }
      27 
      28 }
    • 导入用户角色到resolver.ts代码如下:
    •  1 import { User } from "./user/resolver";
       2 import { Role } from "./role/resolver";
       3 
       4 export default {
       5     Query: {
       6         ...User.Query,
       7         ...Role.Query
       8     },
       9     Mutation: {
      10         ...User.Mutation,
      11         ...Role.Mutation
      12     },
      13     User:User.User //只是添加了这一行
      14 };
    • 运行,添加一个角色,根据角色id添加用户,页面查询应该可以看到以下结果:

    八,相关的增加修改删除分页代码参考下面代码:

    • user.gql
    •  1 # 系统用户表
       2 type User {
       3     id: ID!
       4     # 用户登录名
       5     username: String
       6     # 姓名
       7     name: String
       8     # 邮件
       9     email:String
      10     # 密码
      11     password:String
      12     # 创建时间
      13     createAt:Date
      14     # 修改时间
      15     updateAt:Date
      16     #用户角色
      17     Role:Role
      18     #是否有效
      19     isValid:Boolean
      20     #用户资料
      21     Profile:Profile
      22 }
      23 
      24 extend type Query {
      25     # 查找所有用户
      26     getUsers: [User]
      27     # 根据ID查找用户
      28     getUserById(id:String):User
      29     # 分页查找
      30     getUserPage(pageIndex: Int, pageSize: Int,user:searchUser): [User]
      31     # 查找分页总数
      32     getUserCount(user:searchUser):Int
      33     # 根据条件查找
      34     getUserWhere(user:searchUser): [User]
      35     # 用户登录
      36     login (username:String!,password:String!): User
      37     # 用户退出
      38     logOut:Boolean,
      39     #当前登录用户
      40     currentUser:User
      41    
      42 }
      43 
      44 extend type Mutation {
      45     # 创建用户|修改用户
      46     saveUser(user:inputUser):User
      47      # 删除用户
      48     deleteUser(id:String):Boolean
      49 }
      50 
      51 input inputUser{
      52     id:String
      53     username: String
      54     name: String
      55     email:String
      56     password:String
      57     roleId:String
      58     profileId:String
      59     isValid:Boolean
      60 }
      61 
      62 input searchUser{
      63     username:Json
      64     roleId:Json
      65     email:Json
      66     name:Json
      67 }
      View Code
    • resolver.ts
        1 import UserSchema, { IUserModel } from './user';
        2 import RoleSchema from '../role/role';
        3 import ProfileSchema from '../profile/profile';
        4 
        5 
        6 import { DocumentQuery, MongoosePromise } from 'mongoose';
        7 
        8 export class User {
        9 
       10 
       11     constructor() {
       12     }
       13 
       14     static User: any = {
       15         Role(model) {
       16             return RoleSchema.findById(model.roleId);
       17         },
       18         Profile(model) {
       19             return ProfileSchema.findOne({ userId: model.id });
       20         }
       21     }
       22 
       23     static Query: any = {
       24         getUsers(parent, __, context): Promise<Array<IUserModel>> {
       25             //if (!context.user) return null;
       26             let promise = new Promise<Array<IUserModel>>((resolve, reject) => {
       27                 UserSchema.find().then(res => {
       28                     resolve(res);
       29                 }).catch(err => resolve(null));
       30             });
       31             return promise;
       32         },
       33 
       34         getUserById(parent, { id }, context): Promise<IUserModel> {
       35             //if (!context.user) return null;
       36 
       37             let promise = new Promise<IUserModel>((resolve, reject) => {
       38                 UserSchema.findById(id).then(res => {
       39                     resolve(res);
       40                 }).catch(err => resolve(null));
       41             });
       42             return promise;
       43         },
       44 
       45         getUserPage(parent, { pageIndex = 1, pageSize = 10, user }, context) {
       46             //if (!context.user) return null;
       47             var skip = (pageIndex - 1) * pageSize
       48             var userInfo = UserSchema.find(user).skip(skip).limit(pageSize)
       49             return userInfo;
       50         },
       51 
       52         getUserWhere(parent, { user }, context) {
       53             //if (!context.user) return null;
       54             console.log(user);
       55             var users = UserSchema.find(user);
       56             return users;
       57         },
       58 
       59         getUserCount(parent, { user }, context) {
       60             //if (!context.user) return 0;
       61             var count = UserSchema.count(user);
       62             return count;
       63         }, 
       64 
       65         login(parent, { username, password }, context) {
       66             return new Promise<any>((resolve, reject) => {
       67                 UserSchema.find({ username, password }).then(data => {
       68                     if (data.length > 0) {
       69                         var user=data[0];
       70                         context.session.user = user;
       71                         resolve(user);
       72                     } else {
       73                         context.session.user = null;
       74                         resolve(null);
       75                     }
       76                 })
       77             })
       78         },
       79         logOut(parent, { }, context) {
       80             context.user = null;
       81             context.session.user = null;
       82             return true;
       83         },
       84         currentUser(parent, { }, context) {
       85             //if (!context.user) return null;
       86             let promise = new Promise<IUserModel>((resolve, reject) => {
       87                 let user = context.user;
       88                 if (user) {
       89                     UserSchema.findById(user._id).then(res => {
       90                         resolve(res);
       91                     }).catch(err => resolve(null));
       92                 } else {
       93                     resolve(null);
       94                 }
       95             });
       96             return promise;
       97 
       98         },
       99     }
      100 
      101     static Mutation: any = {
      102         saveUser(parent, { user }, context) {
      103             //正式运行时请取消注释
      104             // if (!context.user) return null;
      105             if (user.id && user.id != "0") {
      106                 return new Promise<IUserModel>((resolve, reject) => {
      107                     UserSchema.findByIdAndUpdate(user.id, user, (err, res) => {
      108                         Object.assign(res, user);
      109                         resolve(res);
      110                     })
      111                 });
      112             }
      113             return UserSchema.create(user)
      114         },
      115 
      116         deleteUser(parent, { id }, context): Promise<Boolean> {
      117             //if (!context.user) return null;
      118             let promise = new Promise<Boolean>((resolve, reject) => {
      119                 UserSchema.findByIdAndRemove(id, (err, res) => {
      120                     resolve(res != null)
      121                 }).catch(err => reject(err));
      122             }); 
      123             return promise;
      124         }
      125     }
      126 }
      View Code
  • 相关阅读:
    寒假学习进度报告(一)
    【web】公文流转系统制作进度(一)(2019/12/9)
    【规律】A Rational Sequence
    【记忆化搜索】Happy Happy Prime Prime
    【背包问题】PACKING
    【动态规划】正则表达式匹配
    【数据结构】P1310 表达式的值
    【数据结构】P1449 后缀表达式
    【数据结构】P1054 等价表达式
    【数据结构】表达式求值
  • 原文地址:https://www.cnblogs.com/lslgg/p/8178700.html
Copyright © 2011-2022 走看看