ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-11-08 16:04:40  阅读:240  来源: 互联网

标签:SDU 定义 导入 门户 组队 课程 模块 import


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有