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