feat: 完成sys模块迁移,对齐PHP/Java框架

- 重构sys模块架构,严格按admin/api/core分层
- 对齐所有sys实体与数据库表结构
- 实现完整的adminapi控制器,匹配PHP/Java契约
- 修复依赖注入问题,确保服务正确注册
- 添加自动迁移工具和契约验证
- 完善多租户支持和审计功能
- 统一命名规范,与PHP业务逻辑保持一致
This commit is contained in:
万物街
2025-09-21 21:29:28 +08:00
parent 2e361795d9
commit 127a4db1e3
839 changed files with 24932 additions and 57988 deletions

View File

@@ -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;

View File

@@ -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,