import { Module, NestModule, MiddlewareConsumer } from '@nestjs/common'; import { APP_GUARD } from '@nestjs/core'; import { ConfigModule, ConfigService } from '@nestjs/config'; import { EventEmitterModule } from '@nestjs/event-emitter'; import { TypeOrmModule } from '@nestjs/typeorm'; import { ThrottlerModule, ThrottlerGuard } from '@nestjs/throttler'; import { Student, Room, Occupancy, RoomExpense, PersonalExpense, Bill, BillItem, User, OperationLog, Deposit, DepositInstallment, Classroom, Tenant, ClassroomRental, Permission, Role, Class, ClassStudent, ClassTeacher, ClassSchedule, AttendanceRecord, DingAttendanceRaw, SyncLog, SyncState, Notification, Department, UserDepartment, StudentProfile, StudentEnrollment, ExamScore, LearningRecord, ResultArchive, ArchiveAttachment, } from './entities'; import { AuthModule } from './auth/auth.module'; import { RbacModule } from './rbac/rbac.module'; import { StudentsModule } from './students/students.module'; import { PermissionGuard } from './auth/guards/permission.guard'; import { JwtAuthGuard } from './auth/guards/jwt-auth.guard'; import { RoomsModule } from './rooms/rooms.module'; import { OccupanciesModule } from './occupancies/occupancies.module'; import { ExpensesModule } from './expenses/expenses.module'; import { BillsModule } from './bills/bills.module'; 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 { AttendanceModule } from './attendance/attendance.module'; import { SchedulesModule } from './schedules/schedules.module'; import { ClassroomRentalsModule } from './classroom-rentals/classroom-rentals.module'; import { SyncModule } from './sync/sync.module'; import { NotificationsModule } from './notifications/notifications.module'; import { DepartmentsModule } from './departments/departments.module'; import { CommonModule } from './common/common.module'; import { ArchiveModule } from './archive/archive.module'; import { CampusScopeMiddleware } from './common/campus-scope.middleware'; @Module({ imports: [ ConfigModule.forRoot({ isGlobal: true }), ThrottlerModule.forRoot([ { ttl: 60000, // 60秒窗口 limit: 100, // 普通接口每分钟100次 }, ]), EventEmitterModule.forRoot(), TypeOrmModule.forRootAsync({ imports: [ConfigModule], inject: [ConfigService], useFactory: (config: ConfigService): any => { const dbType = config.get('DB_TYPE', 'sqlite'); const allEntities = [ Student, Room, Occupancy, RoomExpense, PersonalExpense, Bill, BillItem, User, OperationLog, Deposit, DepositInstallment, Classroom, Tenant, ClassroomRental, Class, ClassStudent, ClassTeacher, Permission, Role, ClassSchedule, AttendanceRecord, DingAttendanceRaw, Notification, Department, UserDepartment, StudentProfile, StudentEnrollment, ExamScore, LearningRecord, ResultArchive, ArchiveAttachment, ]; if (dbType === 'mysql') { return { type: 'mysql' as const, host: config.get('DB_HOST', 'localhost'), port: config.get('DB_PORT', 3306), username: config.get('DB_USERNAME', 'root'), password: config.get('DB_PASSWORD', ''), database: config.get('DB_DATABASE', 'dorm_billing'), entities: allEntities, synchronize: config.get('DB_SYNCHRONIZE', 'true') !== 'false', charset: 'utf8mb4', }; } return { type: 'better-sqlite3' as const, database: config.get('DB_DATABASE', 'dorm_billing.db'), entities: allEntities, synchronize: config.get('DB_SYNCHRONIZE', 'true') !== 'false', }; }, }), AuthModule, RbacModule, StudentsModule, RoomsModule, OccupanciesModule, ExpensesModule, BillsModule, DashboardModule, OperationLogsModule, DepositsModule, ClassroomsModule, AttendanceModule, ClassesModule, TenantsModule, SchedulesModule, ClassroomRentalsModule, SyncModule, NotificationsModule, DepartmentsModule, CommonModule, ArchiveModule, ], providers: [ { provide: APP_GUARD, useClass: ThrottlerGuard }, { provide: APP_GUARD, useClass: JwtAuthGuard }, { provide: APP_GUARD, useClass: PermissionGuard }, ], }) export class AppModule implements NestModule { configure(consumer: MiddlewareConsumer) { consumer.apply(CampusScopeMiddleware).forRoutes('*'); } }