import { Module } from '@nestjs/common'; import { APP_GUARD } from '@nestjs/core'; import { ConfigModule, ConfigService } from '@nestjs/config'; import { TypeOrmModule } from '@nestjs/typeorm'; import { ThrottlerModule, ThrottlerGuard } from '@nestjs/throttler'; import { Student, Room, Occupancy, RoomExpense, PersonalExpense, Bill, BillItem, User, OperationLog, Deposit, Classroom, Tenant, ClassroomRental, Permission, Role, } 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 { 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 { TenantsModule } from './tenants/tenants.module'; import { ClassroomRentalsModule } from './classroom-rentals/classroom-rentals.module'; @Module({ imports: [ ConfigModule.forRoot({ isGlobal: true }), ThrottlerModule.forRoot([{ ttl: 60000, // 60秒窗口 limit: 100, // 普通接口每分钟100次 }]), 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, Classroom, Tenant, ClassroomRental, Permission, Role, ]; 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: true, charset: 'utf8mb4', }; } return { type: 'better-sqlite3' as const, database: config.get('DB_DATABASE', 'dorm_billing.db'), entities: allEntities, synchronize: true, }; }, }), AuthModule, RbacModule, StudentsModule, RoomsModule, OccupanciesModule, ExpensesModule, BillsModule, DashboardModule, OperationLogsModule, DepositsModule, ClassroomsModule, TenantsModule, ClassroomRentalsModule, ], providers: [ { provide: APP_GUARD, useClass: ThrottlerGuard }, { provide: APP_GUARD, useClass: PermissionGuard }, ], }) export class AppModule {}