feat: 重构多语言模块,符合NestJS规范

- 重构LanguageUtils为LanguageService,实现ILanguageService接口
- 移除自定义验证管道和装饰器,使用标准NestJS验证
- 集成框架ValidatorService进行业务验证
- 简化目录结构,移除不必要的子目录
- 支持模块化语言包加载(common、user、order等)
- 统一API响应格式(code、msg、data、timestamp)
- 添加ValidationExceptionFilter处理多语言验证错误
- 完善多语言示例和文档
This commit is contained in:
wanwu
2025-10-06 10:56:59 +08:00
parent 8da4047110
commit b1e16be25d
284 changed files with 13098 additions and 32731 deletions

View File

@@ -136,6 +136,7 @@ class PHPFileDiscovery {
'app/service/admin/addon',
'app/service/admin/aliapp',
'app/service/admin/auth',
'app/service/admin/captcha',
'app/service/admin/generator',
// 新增缺失的admin服务路径
'app/service/admin/applet',
@@ -149,6 +150,7 @@ class PHPFileDiscovery {
'app/service/admin/stat',
'app/service/admin/user',
'app/service/admin/verify',
'app/service/admin/upgrade',
'app/service/admin/wxoplatform',
// api服务路径
'app/service/api/member',
@@ -163,6 +165,7 @@ class PHPFileDiscovery {
'app/service/api/addon',
'app/service/api/aliapp',
'app/service/api/auth',
'app/service/api/captcha',
'app/service/api/generator',
// core服务路径
'app/service/core/sys',
@@ -178,6 +181,7 @@ class PHPFileDiscovery {
'app/service/core/addon',
'app/service/core/aliapp',
'app/service/core/auth',
'app/service/core/captcha',
'app/service/core/generator',
// 新增缺失的core服务路径
'app/service/core/applet',
@@ -208,7 +212,9 @@ class PHPFileDiscovery {
this.discoveredFiles.services[moduleName] = {};
}
this.discoveredFiles.services[moduleName][className] = {
// 使用 className + layer 作为唯一键,避免不同层级服务被覆盖
const serviceKey = `${className}_${layer}`;
this.discoveredFiles.services[moduleName][serviceKey] = {
filePath: path.join(fullPath, file),
className: className,
layer: layer,
@@ -226,10 +232,21 @@ class PHPFileDiscovery {
*/
extractModuleName(filePath) {
const parts = filePath.split('/');
const moduleIndex = parts.findIndex(part => part === 'controller' || part === 'service');
if (moduleIndex > 0) {
return parts[moduleIndex + 1];
// 对于控制器路径: app/adminapi/controller/member/Member.php
// 模块名是 controller 后面的部分
const controllerIndex = parts.findIndex(part => part === 'controller');
if (controllerIndex > 0 && controllerIndex < parts.length - 1) {
return parts[controllerIndex + 1];
}
// 对于服务路径: app/service/admin/member/MemberService.php
// 模块名是 service 后面第二层跳过层级admin/api/core
const serviceIndex = parts.findIndex(part => part === 'service');
if (serviceIndex > 0 && serviceIndex < parts.length - 2) {
return parts[serviceIndex + 2];
}
return 'unknown';
}
@@ -243,6 +260,8 @@ class PHPFileDiscovery {
return 'api';
} else if (filePath.includes('/core/')) {
return 'core';
} else if (filePath.includes('/admin/')) {
return 'admin';
}
return 'unknown';
}