diff --git a/apps/server/src/app.module.ts b/apps/server/src/app.module.ts index 6e7d6b7..fe7e630 100644 --- a/apps/server/src/app.module.ts +++ b/apps/server/src/app.module.ts @@ -32,6 +32,7 @@ import { DashboardModule } from './dashboard/dashboard.module'; import { OperationLogsModule } from './operation-logs/operation-logs.module'; import { DepositsModule } from './deposits/deposits.module'; import { ClassroomsModule } from './classrooms/classrooms.module'; +import { ClassesModule } from './classes/classes.module'; import { TenantsModule } from './tenants/tenants.module'; import { ClassroomRentalsModule } from './classroom-rentals/classroom-rentals.module'; @@ -98,6 +99,7 @@ import { ClassroomRentalsModule } from './classroom-rentals/classroom-rentals.mo OperationLogsModule, DepositsModule, ClassroomsModule, + ClassesModule, TenantsModule, ClassroomRentalsModule, ], diff --git a/apps/server/src/classes/classes.controller.ts b/apps/server/src/classes/classes.controller.ts new file mode 100644 index 0000000..de13115 --- /dev/null +++ b/apps/server/src/classes/classes.controller.ts @@ -0,0 +1,209 @@ +import { + Controller, + Get, + Post, + Put, + Delete, + Body, + Param, + Query, + UseGuards, + Request, +} from '@nestjs/common'; +import { ClassesService } from './classes.service'; +import { + CreateClassDto, + UpdateClassDto, + QueryClassDto, + AddStudentsDto, + AddTeacherDto, +} from './dto/class.dto'; +import { JwtAuthGuard } from '../auth/guards/jwt-auth.guard'; +import { OperationLogsService } from '../operation-logs/operation-logs.service'; +import { extractRequestInfo } from '../common/request-utils'; +import { RequirePermission } from '../auth/decorators/permission.decorator'; + +@UseGuards(JwtAuthGuard) +@Controller('classes') +export class ClassesController { + constructor( + private readonly service: ClassesService, + private readonly logService: OperationLogsService, + ) {} + + @Get() + @RequirePermission('class:view') + findAll(@Query() query: QueryClassDto) { + return this.service.findAll(query); + } + + @Get(':id') + @RequirePermission('class:view') + findOne(@Param('id') id: string) { + return this.service.findOne(+id); + } + + @Post() + @RequirePermission('class:create') + async create(@Body() dto: CreateClassDto, @Request() req: any) { + const { ipAddress, userAgent } = extractRequestInfo(req); + const result = await this.service.create(dto); + await this.logService.log({ + userId: req.user?.id, + username: req.user?.username, + module: '班级管理', + action: '创建班级', + targetId: result.id, + targetType: 'class', + detail: `班级${result.code} ${result.name}`, + ipAddress, + userAgent, + }); + return result; + } + + @Put(':id') + @RequirePermission('class:edit') + async update( + @Param('id') id: string, + @Body() dto: UpdateClassDto, + @Request() req: any, + ) { + const { ipAddress, userAgent } = extractRequestInfo(req); + const result = await this.service.update(+id, dto); + await this.logService.log({ + userId: req.user?.id, + username: req.user?.username, + module: '班级管理', + action: '编辑班级', + targetId: +id, + targetType: 'class', + detail: JSON.stringify(dto), + ipAddress, + userAgent, + }); + return result; + } + + @Delete(':id') + @RequirePermission('class:delete') + async remove(@Param('id') id: string, @Request() req: any) { + const { ipAddress, userAgent } = extractRequestInfo(req); + const result = await this.service.remove(+id); + await this.logService.log({ + userId: req.user?.id, + username: req.user?.username, + module: '班级管理', + action: '删除班级', + targetId: +id, + targetType: 'class', + ipAddress, + userAgent, + }); + return result; + } + + @Get(':id/students') + @RequirePermission('class:view') + getStudents(@Param('id') id: string) { + return this.service.getStudents(+id); + } + + @Post(':id/students') + @RequirePermission('class:edit') + async addStudents( + @Param('id') id: string, + @Body() dto: AddStudentsDto, + @Request() req: any, + ) { + const { ipAddress, userAgent } = extractRequestInfo(req); + const result = await this.service.addStudents(+id, dto.studentIds); + await this.logService.log({ + userId: req.user?.id, + username: req.user?.username, + module: '班级管理', + action: '添加学生', + targetId: +id, + targetType: 'class', + detail: `新增${result.added}名学生`, + ipAddress, + userAgent, + }); + return result; + } + + @Delete(':id/students/:studentId') + @RequirePermission('class:edit') + async removeStudent( + @Param('id') id: string, + @Param('studentId') studentId: string, + @Request() req: any, + ) { + const { ipAddress, userAgent } = extractRequestInfo(req); + const result = await this.service.removeStudent(+id, +studentId); + await this.logService.log({ + userId: req.user?.id, + username: req.user?.username, + module: '班级管理', + action: '移除学生', + targetId: +id, + targetType: 'class', + detail: `移除学生${studentId}`, + ipAddress, + userAgent, + }); + return result; + } + + @Get(':id/teachers') + @RequirePermission('class:view') + getTeachers(@Param('id') id: string) { + return this.service.getTeachers(+id); + } + + @Post(':id/teachers') + @RequirePermission('class:edit') + async addTeacher( + @Param('id') id: string, + @Body() dto: AddTeacherDto, + @Request() req: any, + ) { + const { ipAddress, userAgent } = extractRequestInfo(req); + const result = await this.service.addTeacher(+id, dto); + await this.logService.log({ + userId: req.user?.id, + username: req.user?.username, + module: '班级管理', + action: '添加教师', + targetId: +id, + targetType: 'class', + detail: `教师${dto.userId} 角色${dto.roleType}`, + ipAddress, + userAgent, + }); + return result; + } + + @Delete(':id/teachers/:userId') + @RequirePermission('class:edit') + async removeTeacher( + @Param('id') id: string, + @Param('userId') userId: string, + @Request() req: any, + ) { + const { ipAddress, userAgent } = extractRequestInfo(req); + const result = await this.service.removeTeacher(+id, +userId); + await this.logService.log({ + userId: req.user?.id, + username: req.user?.username, + module: '班级管理', + action: '移除教师', + targetId: +id, + targetType: 'class', + detail: `移除教师${userId}`, + ipAddress, + userAgent, + }); + return result; + } +} diff --git a/apps/server/src/classes/classes.module.ts b/apps/server/src/classes/classes.module.ts index 6187dcd..b95f6dc 100644 --- a/apps/server/src/classes/classes.module.ts +++ b/apps/server/src/classes/classes.module.ts @@ -2,10 +2,12 @@ import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { Class, ClassStudent, ClassTeacher } from '../entities'; import { ClassesService } from './classes.service'; +import { ClassesController } from './classes.controller'; import { OperationLogsModule } from '../operation-logs/operation-logs.module'; @Module({ imports: [TypeOrmModule.forFeature([Class, ClassStudent, ClassTeacher]), OperationLogsModule], + controllers: [ClassesController], providers: [ClassesService], exports: [ClassesService], })