chore: 服务端模块装配与入口更新

This commit is contained in:
2026-08-05 17:11:43 +08:00
parent 0c94ca54df
commit 80e6fccf05
3 changed files with 78 additions and 108 deletions

View File

@@ -1,64 +1,12 @@
import { Module } from '@nestjs/common'; import { Module } from '@nestjs/common';
import { APP_GUARD } from '@nestjs/core'; import { APP_GUARD } from '@nestjs/core';
import { LoggerModule } from 'nestjs-pino';
import { ConfigModule, ConfigService } from '@nestjs/config'; import { ConfigModule, ConfigService } from '@nestjs/config';
import { EventEmitterModule } from '@nestjs/event-emitter'; import { EventEmitterModule } from '@nestjs/event-emitter';
import { TypeOrmModule, type TypeOrmModuleOptions } from '@nestjs/typeorm'; import { TypeOrmModule, type TypeOrmModuleOptions } from '@nestjs/typeorm';
import { ThrottlerModule, ThrottlerGuard } from '@nestjs/throttler'; import { ThrottlerModule, ThrottlerGuard } from '@nestjs/throttler';
import { ScheduleModule } from '@nestjs/schedule'; import { ScheduleModule } from '@nestjs/schedule';
import { import * as Entities from './entities';
Student,
Room,
Occupancy,
Bed,
Locker,
RoomExpense,
PersonalExpense,
Bill,
BillItem,
User,
OperationLog,
RoomInspection,
RoomInspectionDetail,
Deposit,
DepositInstallment,
Classroom,
Organization,
ClassroomRental,
Permission,
Role,
Class,
ClassStudent,
ClassTeacher,
ClassSchedule,
AttendanceRecord,
AttendanceSession,
AttendanceDevice,
AttendancePeriodConfig,
DingAttendanceRaw,
SyncLog,
SyncState,
Notification,
StudentProfile,
StudentEnrollment,
ExamScore,
Exam,
LearningRecord,
ExpenseType,
ResultArchive,
ArchiveAttachment,
StudentDingMapping,
JinshujuMatchRule,
AiConfig,
StudentWallet,
WalletTransaction,
FinancialOperation,
AiConversation,
AiMessage,
AiToolRun,
AiAttachment,
AiForm,
AiReview,
} from './entities';
import { AuthModule } from './auth/auth.module'; import { AuthModule } from './auth/auth.module';
import { InitialSchema1784520727860 } from './migrations/1784520727860-InitialSchema'; import { InitialSchema1784520727860 } from './migrations/1784520727860-InitialSchema';
import { AddExamManagement1784600000000 } from './migrations/1784600000000-AddExamManagement'; import { AddExamManagement1784600000000 } from './migrations/1784600000000-AddExamManagement';
@@ -68,6 +16,8 @@ import { AddAiChat1784780000000 } from './migrations/1784780000000-AddAiChat';
import { EnhanceAiChatForAntDesignX1784860000000 } from './migrations/1784860000000-EnhanceAiChatForAntDesignX'; import { EnhanceAiChatForAntDesignX1784860000000 } from './migrations/1784860000000-EnhanceAiChatForAntDesignX';
import { AddA2UiForms1784870000000 } from './migrations/1784870000000-AddA2UiForms'; import { AddA2UiForms1784870000000 } from './migrations/1784870000000-AddA2UiForms';
import { AddA2UiReviews1784880000000 } from './migrations/1784880000000-AddA2UiReviews'; import { AddA2UiReviews1784880000000 } from './migrations/1784880000000-AddA2UiReviews';
import { AddImportRuns1784910000000 } from './migrations/1784910000000-AddImportRuns';
import { DropAiMessageFeedback1784920000000 } from './migrations/1784920000000-DropAiMessageFeedback';
const allMigrations = [ const allMigrations = [
InitialSchema1784520727860, InitialSchema1784520727860,
AddExamManagement1784600000000, AddExamManagement1784600000000,
@@ -77,6 +27,8 @@ const allMigrations = [
EnhanceAiChatForAntDesignX1784860000000, EnhanceAiChatForAntDesignX1784860000000,
AddA2UiForms1784870000000, AddA2UiForms1784870000000,
AddA2UiReviews1784880000000, AddA2UiReviews1784880000000,
AddImportRuns1784910000000,
DropAiMessageFeedback1784920000000,
]; ];
import { AuthorizationModule } from './authorization'; import { AuthorizationModule } from './authorization';
import { RbacModule } from './rbac/rbac.module'; import { RbacModule } from './rbac/rbac.module';
@@ -109,6 +61,7 @@ import { WalletsModule } from './wallets/wallets.module';
import { FinancialOperationsModule } from './financial-operations/financial-operations.module'; import { FinancialOperationsModule } from './financial-operations/financial-operations.module';
import { ExamsModule } from './exams/exams.module'; import { ExamsModule } from './exams/exams.module';
import { AiChatModule } from './ai-chat'; import { AiChatModule } from './ai-chat';
import { ImportsModule } from './imports/imports.module';
import { import {
IntegrationConfig, IntegrationConfig,
@@ -118,6 +71,12 @@ import { IntegrationConfigModule } from './integration/config/config.module';
@Module({ @Module({
imports: [ imports: [
LoggerModule.forRoot({
pinoHttp: {
level: process.env.LOG_LEVEL ?? 'info',
autoLogging: process.env.NODE_ENV === 'production',
},
}),
AuthorizationModule, AuthorizationModule,
ConfigModule.forRoot({ isGlobal: true }), ConfigModule.forRoot({ isGlobal: true }),
ThrottlerModule.forRoot([ ThrottlerModule.forRoot([
@@ -134,61 +93,63 @@ import { IntegrationConfigModule } from './integration/config/config.module';
useFactory: (config: ConfigService): TypeOrmModuleOptions => { useFactory: (config: ConfigService): TypeOrmModuleOptions => {
const dbType = config.get('DB_TYPE', 'sqlite'); const dbType = config.get('DB_TYPE', 'sqlite');
const allEntities = [ const allEntities = [
Student, Entities.Student,
Room, Entities.Room,
Occupancy, Entities.Occupancy,
Bed, Entities.Bed,
Locker, Entities.Locker,
RoomExpense, Entities.RoomExpense,
PersonalExpense, Entities.PersonalExpense,
Bill, Entities.Bill,
BillItem, Entities.BillItem,
User, Entities.User,
OperationLog, Entities.OperationLog,
RoomInspection, Entities.RoomInspection,
RoomInspectionDetail, Entities.RoomInspectionDetail,
Deposit, Entities.Deposit,
DepositInstallment, Entities.DepositInstallment,
Classroom, Entities.Classroom,
Organization, Entities.Organization,
ClassroomRental, Entities.ClassroomRental,
Class, Entities.Class,
ClassStudent, Entities.ClassStudent,
ClassTeacher, Entities.ClassTeacher,
Permission, Entities.Permission,
Role, Entities.Role,
ClassSchedule, Entities.ClassSchedule,
AttendanceRecord, Entities.AttendanceRecord,
AttendanceSession, Entities.AttendanceSession,
AttendanceDevice, Entities.AttendanceDevice,
AttendancePeriodConfig, Entities.AttendancePeriodConfig,
DingAttendanceRaw, Entities.DingAttendanceRaw,
Notification, Entities.Notification,
StudentProfile, Entities.StudentProfile,
StudentEnrollment, Entities.StudentEnrollment,
ExamScore, Entities.ExamScore,
Exam, Entities.Exam,
LearningRecord, Entities.LearningRecord,
StudentDingMapping, Entities.StudentDingMapping,
JinshujuMatchRule, Entities.JinshujuMatchRule,
ExpenseType, Entities.ExpenseType,
ArchiveAttachment, Entities.ArchiveAttachment,
ResultArchive, Entities.ResultArchive,
SyncLog, Entities.SyncLog,
SyncState, Entities.SyncState,
StudentDingMapping,
IntegrationConfig, IntegrationConfig,
IntegrationConfigDetail, IntegrationConfigDetail,
AiConfig, Entities.AiConfig,
StudentWallet, Entities.StudentWallet,
WalletTransaction, Entities.WalletTransaction,
FinancialOperation, Entities.FinancialOperation,
AiConversation, Entities.AiConversation,
AiMessage, Entities.AiMessage,
AiToolRun, Entities.AiToolRun,
AiAttachment, Entities.AiAttachment,
AiForm, Entities.AiForm,
AiReview, Entities.AiReview,
Entities.ImportRun,
Entities.ImportStep,
Entities.ImportRow,
]; ];
if (dbType === 'mysql') { if (dbType === 'mysql') {
return { return {
@@ -242,6 +203,7 @@ import { IntegrationConfigModule } from './integration/config/config.module';
ExpenseTypesModule, ExpenseTypesModule,
AiConfigModule, AiConfigModule,
AiChatModule, AiChatModule,
ImportsModule,
], ],
providers: [ providers: [
{ provide: APP_GUARD, useClass: ThrottlerGuard }, { provide: APP_GUARD, useClass: ThrottlerGuard },

View File

@@ -1,4 +1,6 @@
import { NestFactory } from '@nestjs/core'; import { NestFactory } from '@nestjs/core';
import helmet from 'helmet';
import compression from 'compression';
import { AppModule } from './app.module'; import { AppModule } from './app.module';
import { runMigrationsOnStartup } from './migration-runner'; import { runMigrationsOnStartup } from './migration-runner';
@@ -8,7 +10,9 @@ async function bootstrap() {
const app = await NestFactory.create(AppModule); const app = await NestFactory.create(AppModule);
app.setGlobalPrefix('api'); app.setGlobalPrefix('api');
app.enableCors(); app.enableCors();
app.use(helmet());
app.use(compression());
await app.listen(process.env.PORT ?? 3000); await app.listen(process.env.PORT ?? 3000);
console.log(`Server running on http://localhost:${process.env.PORT ?? 3000}`);
} }
bootstrap(); bootstrap();

View File

@@ -8,6 +8,8 @@ import { EnhanceAiChatForAntDesignX1784860000000 } from './migrations/1784860000
import { AddA2UiForms1784870000000 } from './migrations/1784870000000-AddA2UiForms'; import { AddA2UiForms1784870000000 } from './migrations/1784870000000-AddA2UiForms';
import { AddA2UiReviews1784880000000 } from './migrations/1784880000000-AddA2UiReviews'; import { AddA2UiReviews1784880000000 } from './migrations/1784880000000-AddA2UiReviews';
import { EnlargeAiReviewSections1784900000000 } from './migrations/1784900000000-EnlargeAiReviewSections'; import { EnlargeAiReviewSections1784900000000 } from './migrations/1784900000000-EnlargeAiReviewSections';
import { AddImportRuns1784910000000 } from './migrations/1784910000000-AddImportRuns';
import { DropAiMessageFeedback1784920000000 } from './migrations/1784920000000-DropAiMessageFeedback';
import { config } from 'dotenv'; import { config } from 'dotenv';
config(); config();
@@ -36,6 +38,8 @@ export async function runMigrationsOnStartup(): Promise<void> {
AddA2UiForms1784870000000, AddA2UiForms1784870000000,
AddA2UiReviews1784880000000, AddA2UiReviews1784880000000,
EnlargeAiReviewSections1784900000000, EnlargeAiReviewSections1784900000000,
AddImportRuns1784910000000,
DropAiMessageFeedback1784920000000,
], ],
}); });