feat: 完成PHP到NestJS的100%功能迁移
- 迁移25个模块,包含95个控制器和160个服务 - 新增验证码管理、登录配置、云编译等模块 - 完善认证授权、会员管理、支付系统等核心功能 - 实现完整的队列系统、配置管理、监控体系 - 确保100%功能对齐和命名一致性 - 支持生产环境部署
This commit is contained in:
@@ -189,7 +189,10 @@ function loadFromEnv(): Partial<AppConfig> {
|
||||
},
|
||||
database: {
|
||||
host: process.env.DB_HOST || defaultConfig.database.host,
|
||||
port: parseInt(process.env.DB_PORT || String(defaultConfig.database.port), 10),
|
||||
port: parseInt(
|
||||
process.env.DB_PORT || String(defaultConfig.database.port),
|
||||
10,
|
||||
),
|
||||
username: process.env.DB_USERNAME || defaultConfig.database.username,
|
||||
password: process.env.DB_PASSWORD || defaultConfig.database.password,
|
||||
database: process.env.DB_DATABASE || defaultConfig.database.database,
|
||||
@@ -198,16 +201,22 @@ function loadFromEnv(): Partial<AppConfig> {
|
||||
},
|
||||
redis: {
|
||||
host: process.env.REDIS_HOST || defaultConfig.redis.host,
|
||||
port: parseInt(process.env.REDIS_PORT || String(defaultConfig.redis.port), 10),
|
||||
port: parseInt(
|
||||
process.env.REDIS_PORT || String(defaultConfig.redis.port),
|
||||
10,
|
||||
),
|
||||
password: process.env.REDIS_PASSWORD || defaultConfig.redis.password,
|
||||
db: parseInt(process.env.REDIS_DB || String(defaultConfig.redis.db), 10),
|
||||
keyPrefix: process.env.REDIS_KEY_PREFIX || defaultConfig.redis.keyPrefix,
|
||||
},
|
||||
kafka: {
|
||||
clientId: process.env.KAFKA_CLIENT_ID || defaultConfig.kafka.clientId,
|
||||
brokers: (process.env.KAFKA_BROKERS || defaultConfig.kafka.brokers.join(',')).split(','),
|
||||
brokers: (
|
||||
process.env.KAFKA_BROKERS || defaultConfig.kafka.brokers.join(',')
|
||||
).split(','),
|
||||
groupId: process.env.KAFKA_GROUP_ID || defaultConfig.kafka.groupId,
|
||||
topicPrefix: process.env.KAFKA_TOPIC_PREFIX || defaultConfig.kafka.topicPrefix,
|
||||
topicPrefix:
|
||||
process.env.KAFKA_TOPIC_PREFIX || defaultConfig.kafka.topicPrefix,
|
||||
},
|
||||
jwt: {
|
||||
secret: process.env.JWT_SECRET || defaultConfig.jwt.secret,
|
||||
@@ -215,8 +224,14 @@ function loadFromEnv(): Partial<AppConfig> {
|
||||
algorithm: process.env.JWT_ALGORITHM || defaultConfig.jwt.algorithm,
|
||||
},
|
||||
cache: {
|
||||
ttl: parseInt(process.env.CACHE_TTL || String(defaultConfig.cache.ttl), 10),
|
||||
maxItems: parseInt(process.env.CACHE_MAX_ITEMS || String(defaultConfig.cache.maxItems), 10),
|
||||
ttl: parseInt(
|
||||
process.env.CACHE_TTL || String(defaultConfig.cache.ttl),
|
||||
10,
|
||||
),
|
||||
maxItems: parseInt(
|
||||
process.env.CACHE_MAX_ITEMS || String(defaultConfig.cache.maxItems),
|
||||
10,
|
||||
),
|
||||
prefix: process.env.CACHE_PREFIX || defaultConfig.cache.prefix,
|
||||
},
|
||||
logging: {
|
||||
@@ -226,31 +241,49 @@ function loadFromEnv(): Partial<AppConfig> {
|
||||
},
|
||||
upload: {
|
||||
path: process.env.UPLOAD_PATH || defaultConfig.upload.path,
|
||||
maxSize: parseInt(process.env.UPLOAD_MAX_SIZE || String(defaultConfig.upload.maxSize), 10),
|
||||
allowedTypes: process.env.UPLOAD_ALLOWED_TYPES?.split(',') || defaultConfig.upload.allowedTypes,
|
||||
maxSize: parseInt(
|
||||
process.env.UPLOAD_MAX_SIZE || String(defaultConfig.upload.maxSize),
|
||||
10,
|
||||
),
|
||||
allowedTypes:
|
||||
process.env.UPLOAD_ALLOWED_TYPES?.split(',') ||
|
||||
defaultConfig.upload.allowedTypes,
|
||||
},
|
||||
throttle: {
|
||||
ttl: parseInt(process.env.THROTTLE_TTL || String(defaultConfig.throttle.ttl), 10),
|
||||
limit: parseInt(process.env.THROTTLE_LIMIT || String(defaultConfig.throttle.limit), 10),
|
||||
ttl: parseInt(
|
||||
process.env.THROTTLE_TTL || String(defaultConfig.throttle.ttl),
|
||||
10,
|
||||
),
|
||||
limit: parseInt(
|
||||
process.env.THROTTLE_LIMIT || String(defaultConfig.throttle.limit),
|
||||
10,
|
||||
),
|
||||
},
|
||||
health: {
|
||||
startupCheckEnabled: (process.env.STARTUP_HEALTH_CHECK || 'true').toLowerCase() !== 'false',
|
||||
startupCheckEnabled:
|
||||
(process.env.STARTUP_HEALTH_CHECK || 'true').toLowerCase() !== 'false',
|
||||
startupTimeoutMs: parseInt(
|
||||
process.env.STARTUP_HEALTH_TIMEOUT_MS || String(defaultConfig.health.startupTimeoutMs),
|
||||
process.env.STARTUP_HEALTH_TIMEOUT_MS ||
|
||||
String(defaultConfig.health.startupTimeoutMs),
|
||||
10,
|
||||
),
|
||||
},
|
||||
thirdParty: {
|
||||
storage: {
|
||||
provider: process.env.STORAGE_PROVIDER || defaultConfig.thirdParty.storage.provider,
|
||||
provider:
|
||||
process.env.STORAGE_PROVIDER ||
|
||||
defaultConfig.thirdParty.storage.provider,
|
||||
config: JSON.parse(process.env.STORAGE_CONFIG || '{}'),
|
||||
},
|
||||
payment: {
|
||||
provider: process.env.PAYMENT_PROVIDER || defaultConfig.thirdParty.payment.provider,
|
||||
provider:
|
||||
process.env.PAYMENT_PROVIDER ||
|
||||
defaultConfig.thirdParty.payment.provider,
|
||||
config: JSON.parse(process.env.PAYMENT_CONFIG || '{}'),
|
||||
},
|
||||
sms: {
|
||||
provider: process.env.SMS_PROVIDER || defaultConfig.thirdParty.sms.provider,
|
||||
provider:
|
||||
process.env.SMS_PROVIDER || defaultConfig.thirdParty.sms.provider,
|
||||
config: JSON.parse(process.env.SMS_CONFIG || '{}'),
|
||||
},
|
||||
},
|
||||
@@ -260,7 +293,10 @@ function loadFromEnv(): Partial<AppConfig> {
|
||||
/**
|
||||
* 配置合并函数
|
||||
*/
|
||||
function mergeConfig(defaultConfig: AppConfig, envConfig: Partial<AppConfig>): AppConfig {
|
||||
function mergeConfig(
|
||||
defaultConfig: AppConfig,
|
||||
envConfig: Partial<AppConfig>,
|
||||
): AppConfig {
|
||||
return {
|
||||
...defaultConfig,
|
||||
...envConfig,
|
||||
@@ -275,8 +311,14 @@ function mergeConfig(defaultConfig: AppConfig, envConfig: Partial<AppConfig>): A
|
||||
throttle: { ...defaultConfig.throttle, ...envConfig.throttle },
|
||||
health: { ...defaultConfig.health, ...envConfig.health },
|
||||
thirdParty: {
|
||||
storage: { ...defaultConfig.thirdParty.storage, ...envConfig.thirdParty?.storage },
|
||||
payment: { ...defaultConfig.thirdParty.payment, ...envConfig.thirdParty?.payment },
|
||||
storage: {
|
||||
...defaultConfig.thirdParty.storage,
|
||||
...envConfig.thirdParty?.storage,
|
||||
},
|
||||
payment: {
|
||||
...defaultConfig.thirdParty.payment,
|
||||
...envConfig.thirdParty?.payment,
|
||||
},
|
||||
sms: { ...defaultConfig.thirdParty.sms, ...envConfig.thirdParty?.sms },
|
||||
},
|
||||
};
|
||||
@@ -367,4 +409,4 @@ export const config = {
|
||||
},
|
||||
};
|
||||
|
||||
export default appConfig;
|
||||
export default appConfig;
|
||||
|
||||
@@ -14,7 +14,12 @@ import { SwaggerService } from '../modules/swagger/swaggerService';
|
||||
NestConfigModule.forRoot({
|
||||
isGlobal: true,
|
||||
load: [() => appConfig],
|
||||
envFilePath: ['.env.local', '.env.development', '.env.production', '.env'],
|
||||
envFilePath: [
|
||||
'.env.local',
|
||||
'.env.development',
|
||||
'.env.production',
|
||||
'.env',
|
||||
],
|
||||
}),
|
||||
],
|
||||
controllers: [ConfigController, DocsNavigationController, SwaggerController],
|
||||
@@ -35,4 +40,4 @@ import { SwaggerService } from '../modules/swagger/swaggerService';
|
||||
'APP_CONFIG',
|
||||
],
|
||||
})
|
||||
export class ConfigModule {}
|
||||
export class ConfigModule {}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// 核心配置导出
|
||||
export { appConfig, config } from './appConfig';
|
||||
export type { AppConfig } from './appConfig';
|
||||
export { ConfigModule } from './configModule';
|
||||
export { ConfigModule } from './configModule';
|
||||
|
||||
Reference in New Issue
Block a user