feat: 完成sys模块迁移,对齐PHP/Java框架
- 重构sys模块架构,严格按admin/api/core分层 - 对齐所有sys实体与数据库表结构 - 实现完整的adminapi控制器,匹配PHP/Java契约 - 修复依赖注入问题,确保服务正确注册 - 添加自动迁移工具和契约验证 - 完善多租户支持和审计功能 - 统一命名规范,与PHP业务逻辑保持一致
This commit is contained in:
@@ -11,6 +11,7 @@ export interface AppConfig {
|
||||
port: number;
|
||||
environment: string;
|
||||
timezone: string;
|
||||
appKey: string; // 对齐 PHP: Env::get('app.app_key')
|
||||
};
|
||||
|
||||
// 数据库配置
|
||||
@@ -22,6 +23,12 @@ export interface AppConfig {
|
||||
database: string;
|
||||
synchronize: boolean;
|
||||
logging: boolean;
|
||||
connectionLimit: number;
|
||||
acquireTimeoutMs: number;
|
||||
queryTimeoutMs: number;
|
||||
cacheDurationMs: number;
|
||||
timezone: string;
|
||||
charset: string;
|
||||
};
|
||||
|
||||
// Redis 配置
|
||||
@@ -96,6 +103,18 @@ export interface AppConfig {
|
||||
config: Record<string, any>;
|
||||
};
|
||||
};
|
||||
|
||||
// 对齐 PHP [SYSTEM] 配置区
|
||||
system: {
|
||||
adminTokenName: string; // ADMIN_TOKEN_NAME
|
||||
apiTokenName: string; // API_TOKEN_NAME
|
||||
adminSiteIdName: string; // ADMIN_SITE_ID_NAME
|
||||
apiSiteIdName: string; // API_SITE_ID_NAME
|
||||
adminTokenExpireTime: number; // ADMIN_TOKEN_EXPIRE_TIME(秒)
|
||||
apiTokenExpireTime: number; // API_TOKEN_EXPIRE_TIME(秒)
|
||||
langName: string; // LANG_NAME
|
||||
channelName: string; // CHANNEL_NAME
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -108,6 +127,7 @@ const defaultConfig: AppConfig = {
|
||||
port: 3001,
|
||||
environment: 'development',
|
||||
timezone: 'Asia/Shanghai',
|
||||
appKey: 'niucloud456$%^', // 对齐 PHP TokenAuth 默认值
|
||||
},
|
||||
database: {
|
||||
host: 'localhost',
|
||||
@@ -117,6 +137,12 @@ const defaultConfig: AppConfig = {
|
||||
database: 'wwjcloud',
|
||||
synchronize: false,
|
||||
logging: true,
|
||||
connectionLimit: 20,
|
||||
acquireTimeoutMs: 60000,
|
||||
queryTimeoutMs: 60000,
|
||||
cacheDurationMs: 30000,
|
||||
timezone: '+08:00',
|
||||
charset: 'utf8mb4',
|
||||
},
|
||||
redis: {
|
||||
host: 'localhost',
|
||||
@@ -173,6 +199,16 @@ const defaultConfig: AppConfig = {
|
||||
config: {},
|
||||
},
|
||||
},
|
||||
system: {
|
||||
adminTokenName: 'token',
|
||||
apiTokenName: 'token',
|
||||
adminSiteIdName: 'site-id',
|
||||
apiSiteIdName: 'site-id',
|
||||
adminTokenExpireTime: 604800, // 7 天,对齐 .env
|
||||
apiTokenExpireTime: 86400, // 1 天,对齐 .env(如需覆盖以环境为准)
|
||||
langName: 'lang',
|
||||
channelName: 'channel',
|
||||
},
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -186,6 +222,11 @@ function loadFromEnv(): Partial<AppConfig> {
|
||||
port: parseInt(process.env.PORT || String(defaultConfig.app.port), 10),
|
||||
environment: process.env.NODE_ENV || defaultConfig.app.environment,
|
||||
timezone: process.env.TZ || defaultConfig.app.timezone,
|
||||
appKey:
|
||||
process.env.APP_APP_KEY ||
|
||||
process.env.APP_KEY ||
|
||||
process.env.AUTH_KEY ||
|
||||
defaultConfig.app.appKey,
|
||||
},
|
||||
database: {
|
||||
host: process.env.DB_HOST || defaultConfig.database.host,
|
||||
@@ -198,6 +239,28 @@ function loadFromEnv(): Partial<AppConfig> {
|
||||
database: process.env.DB_DATABASE || defaultConfig.database.database,
|
||||
synchronize: process.env.DB_SYNC === 'true',
|
||||
logging: process.env.DB_LOGGING === 'true',
|
||||
connectionLimit: parseInt(
|
||||
process.env.DB_CONN_LIMIT ||
|
||||
String(defaultConfig.database.connectionLimit),
|
||||
10,
|
||||
),
|
||||
acquireTimeoutMs: parseInt(
|
||||
process.env.DB_ACQUIRE_TIMEOUT_MS ||
|
||||
String(defaultConfig.database.acquireTimeoutMs),
|
||||
10,
|
||||
),
|
||||
queryTimeoutMs: parseInt(
|
||||
process.env.DB_QUERY_TIMEOUT_MS ||
|
||||
String(defaultConfig.database.queryTimeoutMs),
|
||||
10,
|
||||
),
|
||||
cacheDurationMs: parseInt(
|
||||
process.env.DB_CACHE_DURATION_MS ||
|
||||
String(defaultConfig.database.cacheDurationMs),
|
||||
10,
|
||||
),
|
||||
timezone: process.env.DB_TIMEZONE || defaultConfig.database.timezone,
|
||||
charset: process.env.DB_CHARSET || defaultConfig.database.charset,
|
||||
},
|
||||
redis: {
|
||||
host: process.env.REDIS_HOST || defaultConfig.redis.host,
|
||||
@@ -407,6 +470,9 @@ export const config = {
|
||||
isTest(): boolean {
|
||||
return appConfig.app.environment === 'test';
|
||||
},
|
||||
getSystem() {
|
||||
return appConfig.system;
|
||||
},
|
||||
};
|
||||
|
||||
export default appConfig;
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import { Module } from '@nestjs/common';
|
||||
import { ConfigModule as NestConfigModule } from '@nestjs/config';
|
||||
import { ConfigController } from '../controllers/configController';
|
||||
import { ConfigCenterService } from '../services/configCenterService';
|
||||
import { ConfigValidationService } from '../services/configValidationService';
|
||||
import { DynamicConfigService } from '../services/dynamicConfigService';
|
||||
@@ -8,6 +7,7 @@ import { DocsNavigationController } from '../controllers/docsNavigationControlle
|
||||
import { appConfig } from './appConfig';
|
||||
import { SwaggerController } from '../modules/swagger/swaggerController';
|
||||
import { SwaggerService } from '../modules/swagger/swaggerService';
|
||||
import { validateAppConfig } from '../schemas/appSchema';
|
||||
|
||||
@Module({
|
||||
imports: [
|
||||
@@ -20,9 +20,11 @@ import { SwaggerService } from '../modules/swagger/swaggerService';
|
||||
'.env.production',
|
||||
'.env',
|
||||
],
|
||||
// 使用 Joi 校验环境变量,防止缺失或不合法
|
||||
validate: (config: Record<string, any>) => validateAppConfig(config),
|
||||
}),
|
||||
],
|
||||
controllers: [ConfigController, DocsNavigationController, SwaggerController],
|
||||
controllers: [DocsNavigationController, SwaggerController],
|
||||
providers: [
|
||||
ConfigCenterService,
|
||||
ConfigValidationService,
|
||||
|
||||
Reference in New Issue
Block a user