其他分享
首页 > 其他分享> > SDU信息门户(7)——组队系统

SDU信息门户(7)——组队系统

作者:互联网

2021SC@SDUSC

引言

在SDU信息门户的教务系统中的主体包括三个,即教师,课程以及学生。其中学生并不仅仅作为独立的个体存在的,在很多情况下常作为一个学生队伍出现。而组队系统则是针对学生组队这一功能设计的模块。组队系统的主要功能包括根据课程名进行学生组队,获取选某一课程学生列表等。使用的框架是nestjs框架。此外还用到mongoose的Schema模块来进行数据结构的定义和管理。

代码分析

配置constants文件

在组队系统中需要使用课程信息这一数据结构,用于查找课程与学生之间的关系。而我们在教务老师系统中定义了CourseInfoSchema数据结构,因此我们直接导入在教务老师模块中定义的课程信息数据结构模块。这constants文件中,我们定义了MCMODELINFO常量来进行CourseInfoSchema模块与collection文件的绑定。

import { CourseInfoSchema } from '../../admin/schemas/couser-info.schema';

export const MCMODELINFO = {
  name: 'mCourseInfo',
  schema: CourseInfoSchema,
  collection: 'courses',
};

proto文件的配置

proto文件中负责远程函数调用中的配置,包括服务,数据结构,函数的配置。

//组队系统服务
service TeamService{
  // 通过课程号返回选课学生列表
  rpc GetStulistByCid(CID) returns (Stulist);
}

service关键字用于定义服务,这里定义了TeamService服务,在该服务中指定了要远程定义的函数GetStulistByCid(CID),该函数参数是CID课程号,返回值是stulist学生列表。

message CID {
  string cid = 1;
}
message Stulist {
  repeated Stu stuInfos = 1;
}

关键字message用于定义数据结构,这里定义了数据结构CID课程编号与Stulist学生列表,其中Stulist结果中的repeated关键字用于表示重复数据类型,这里用于表示Stu类型数据的列表。

配置team-system.service文件

team-system.service服务类的主要作用是实现该模块功能的具体方法的定义与实现,以便控制器类中的请求处理函数调用来完成具体的功能。

模块导入

import { Injectable } from '@nestjs/common';
import { InjectModel } from '@nestjs/mongoose';
import { GrpcException } from '@sdu-turing/microservices';
import { status } from 'grpc';
import { Model } from 'mongoose';
import { MCMODELINFO } from './constants/db.constants';

在service文件中导入了Injectable和InjectModel装饰器,使用两个装饰器来使用自定义的拦截器。GrpcException装饰器用于抛出远程调用函数的异常。此外文件中还导入了我们前面定义的数据结构常量MCMODELINFO,来进行数据结构的管理。

具体实现

在构造函数中定义并注入了courseModel作为数据成员,用于下面具体函数的调用。

@Injectable()
export class TeamSystemService {
  constructor(@InjectModel(MCMODELINFO.name) private courseModel: Model<any>) {}

  async getStuInfosByCid(cid: string) {
    let query = this.courseModel.find();
    query.setOptions({ lean: true });
    query.where({ cid: cid });
    query.select({ _id: 0, stuInfos: { sid: 1, sname: 1 } });
    const result = await query.findOne().exec();
    if (result == null)
      throw new GrpcException(status.NOT_FOUND, 'CANNOT FIND COURSE');
    else {
      return result;
    }
  }
}

getStuInfosByCid函数的参数是字符串类型的cid,该函数通过查询课程编号(cid)来获取选取该课程的学生队伍(列表)。首先调用数据成员courseModel的find()方法来查询所有的课程以及课程信息。在调用查询结构query的where(...)方法来筛选出课程编号是cid的课程及其课程信息,再调用select(...)方法来选取出课程信息中我们需要的具体属性,这里选取了课程id以及学生信息(列表)。再调用异步方法findOne().exec()来获取查询到的结果。若查询到的结果是空,则抛出“CNNOT FIND COURSE”异常,否则将查询到的学生队伍信息返回。

配置team-system.controller文件

controller处理器类的主要作用是定义请求处理的方法,而具体的方法实现则在Service服务类中实现。

import { Controller } from '@nestjs/common';
import { GrpcMethod } from '@nestjs/microservices';
import { TeamSystemService } from './team-system.service';

@Controller('team')
export class TeamSystemController {
  constructor(private sTeamSystemService: TeamSystemService) {}

  @GrpcMethod('TeamService', 'GetStulistByCid')
  async getStuInfosByCid(CID: { cid: string }) {
    return this.sTeamSystemService.getStuInfosByCid(CID.cid);
  }
}

在构造方法中我们定义并注入了TeamSystemService类的对象变量sTeamSystemService作为数据成员,用于下列方法调用该类对象的具体方法。

在controller文件中导入了Controller装饰器,通过使用@Controller()装饰器来向框架指明TeamSystemController类是控制器类,用于处理请求。

文件中还导入了GrpcMethod装饰器,该装饰器用于处理远程函数调用,在处理器方法getStuInfoByCid上使用了@GrpcMethod,绑定了TeamService类和GetStulistBycid方法,这样我们在调用getStuInfoByCid方法后就可以远程调用GetStulistByCid方法。

此外文件中还导入了TeamSystemService服务类,在我们下面定义的getStuInfosByCid方法中直接调用TeamSystemService对象的方法来完成该方法的具体实现。

配置module文件

module文件主要负责管理不同模块的通信(导入与导出)。

模块导入

import { Module } from '@nestjs/common';
import { TeamSystemController } from './team-system.controller';
import { TeamSystemService } from './team-system.service';
import { MongooseModule } from '@nestjs/mongoose';
import { MCMODELINFO } from './constants/db.constants';

在module文件中导入了在组队系统模块中自定义的TeamSystemController控制器类,TeamSystemService服务类,用于控制器类的绑定与服务类的导出。此外文件还导入了MongooseModule和MCMODELINFO。

具体配置

@Module({
  imports: [MongooseModule.forFeature([MCMODELINFO])],
  controllers: [TeamSystemController],
  providers: [TeamSystemService],
})
export class TeamSystemModule {}

使用装饰器@Module(...)来完成模块的定义。这里导入Mongoosemodule模块,导出了Team SystemService服务类,这样在其他模块中调用TeamSystemModule时即可直接使用该服务类。最后将TeamSystemModule模块导出以便其他模块的使用。

总结

在SDU信息门户教务系统的组队系统负责获取选取某一课程的学生队伍(列表),以便后续其他模块进行操作。这里使用了Grpc来进行查询学生队伍函数的远程调用,而功能具体的实现则通过service服务类中的具体方法来实现。组队系统模块是教务系统中重要的模块,起到了桥梁的作用,将课程以及学生进行了绑定。本模块使用的框架是nestjs框架,编程语言是TypeScript。

标签:SDU,定义,导入,门户,组队,课程,模块,import
来源: https://blog.csdn.net/qq_45811516/article/details/121206963