#!/usr/bin/env node /** * PHP文件发现工具 * 自动发现所有PHP控制器和服务文件,建立正确的映射关系 */ const fs = require('fs'); const path = require('path'); class PHPFileDiscovery { constructor() { this.phpBasePath = '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud'; this.javaBasePath = '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core'; this.discoveredFiles = { // PHP层级 controllers: {}, services: {}, models: {}, validates: {}, middlewares: {}, routes: {}, jobs: {}, listeners: {}, commands: {}, dicts: {}, traits: {}, // Java层级(用于对比) javaControllers: {}, javaEntities: {}, javaServices: {}, javaMappers: {}, javaEnums: {}, javaEvents: {}, javaListeners: {}, javaJobs: {} }; } /** * 发现所有PHP控制器文件 */ discoverControllers() { console.log('🔍 发现PHP控制器文件...'); const controllerPaths = [ // adminapi控制器路径 'app/adminapi/controller/sys', 'app/adminapi/controller/member', 'app/adminapi/controller/pay', 'app/adminapi/controller/upload', 'app/adminapi/controller/login', 'app/adminapi/controller/agreement', 'app/adminapi/controller/wechat', 'app/adminapi/controller/weapp', 'app/adminapi/controller/diy', 'app/adminapi/controller/poster', 'app/adminapi/controller/addon', 'app/adminapi/controller/aliapp', 'app/adminapi/controller/auth', 'app/adminapi/controller/generator', // 新增缺失的adminapi控制器路径 'app/adminapi/controller/applet', 'app/adminapi/controller/channel', 'app/adminapi/controller/dict', 'app/adminapi/controller/home', 'app/adminapi/controller/index', 'app/adminapi/controller/niucloud', 'app/adminapi/controller/notice', 'app/adminapi/controller/site', 'app/adminapi/controller/stat', 'app/adminapi/controller/user', 'app/adminapi/controller/verify', 'app/adminapi/controller/wxoplatform', // api控制器路径 'app/api/controller/member', 'app/api/controller/pay', 'app/api/controller/upload', 'app/api/controller/login', 'app/api/controller/agreement', 'app/api/controller/wechat', 'app/api/controller/weapp', 'app/api/controller/diy', 'app/api/controller/poster', 'app/api/controller/addon', 'app/api/controller/aliapp', 'app/api/controller/auth', 'app/api/controller/generator' ]; for (const controllerPath of controllerPaths) { const fullPath = path.join(this.phpBasePath, controllerPath); if (fs.existsSync(fullPath)) { const files = fs.readdirSync(fullPath).filter(file => file.endsWith('.php')); for (const file of files) { const className = file.replace('.php', ''); const moduleName = this.extractModuleName(controllerPath); const layer = this.extractLayer(controllerPath); if (!this.discoveredFiles.controllers[moduleName]) { this.discoveredFiles.controllers[moduleName] = {}; } this.discoveredFiles.controllers[moduleName][className] = { filePath: path.join(fullPath, file), className: className, layer: layer, moduleName: moduleName }; console.log(` ✅ 发现控制器: ${moduleName}/${className} (${layer})`); } } } } /** * 发现所有PHP服务文件 */ discoverServices() { console.log('🔍 发现PHP服务文件...'); const servicePaths = [ // admin服务路径 'app/service/admin/sys', 'app/service/admin/member', 'app/service/admin/pay', 'app/service/admin/upload', 'app/service/admin/login', 'app/service/admin/agreement', 'app/service/admin/wechat', 'app/service/admin/weapp', 'app/service/admin/diy', 'app/service/admin/poster', 'app/service/admin/addon', 'app/service/admin/aliapp', 'app/service/admin/auth', 'app/service/admin/generator', // 新增缺失的admin服务路径 'app/service/admin/applet', 'app/service/admin/channel', 'app/service/admin/dict', 'app/service/admin/home', 'app/service/admin/index', 'app/service/admin/niucloud', 'app/service/admin/notice', 'app/service/admin/site', 'app/service/admin/stat', 'app/service/admin/user', 'app/service/admin/verify', 'app/service/admin/wxoplatform', // api服务路径 'app/service/api/member', 'app/service/api/pay', 'app/service/api/upload', 'app/service/api/login', 'app/service/api/agreement', 'app/service/api/wechat', 'app/service/api/weapp', 'app/service/api/diy', 'app/service/api/poster', 'app/service/api/addon', 'app/service/api/aliapp', 'app/service/api/auth', 'app/service/api/generator', // core服务路径 'app/service/core/sys', 'app/service/core/member', 'app/service/core/pay', 'app/service/core/upload', 'app/service/core/login', 'app/service/core/agreement', 'app/service/core/wechat', 'app/service/core/weapp', 'app/service/core/diy', 'app/service/core/poster', 'app/service/core/addon', 'app/service/core/aliapp', 'app/service/core/auth', 'app/service/core/generator', // 新增缺失的core服务路径 'app/service/core/applet', 'app/service/core/channel', 'app/service/core/dict', 'app/service/core/home', 'app/service/core/index', 'app/service/core/niucloud', 'app/service/core/notice', 'app/service/core/site', 'app/service/core/stat', 'app/service/core/user', 'app/service/core/verify', 'app/service/core/wxoplatform' ]; for (const servicePath of servicePaths) { const fullPath = path.join(this.phpBasePath, servicePath); if (fs.existsSync(fullPath)) { const files = fs.readdirSync(fullPath).filter(file => file.endsWith('.php')); for (const file of files) { const className = file.replace('.php', ''); const moduleName = this.extractModuleName(servicePath); const layer = this.extractLayer(servicePath); if (!this.discoveredFiles.services[moduleName]) { this.discoveredFiles.services[moduleName] = {}; } this.discoveredFiles.services[moduleName][className] = { filePath: path.join(fullPath, file), className: className, layer: layer, moduleName: moduleName }; console.log(` ✅ 发现服务: ${moduleName}/${className} (${layer})`); } } } } /** * 从路径中提取模块名 */ extractModuleName(filePath) { const parts = filePath.split('/'); const moduleIndex = parts.findIndex(part => part === 'controller' || part === 'service'); if (moduleIndex > 0) { return parts[moduleIndex + 1]; } return 'unknown'; } /** * 从路径中提取层级 */ extractLayer(filePath) { if (filePath.includes('/adminapi/')) { return 'adminapi'; } else if (filePath.includes('/api/')) { return 'api'; } else if (filePath.includes('/core/')) { return 'core'; } return 'unknown'; } /** * 分析PHP文件内容 */ analyzePHPFile(filePath) { try { const content = fs.readFileSync(filePath, 'utf-8'); const methods = this.extractMethods(content); return { filePath: filePath, methods: methods, content: content }; } catch (error) { console.warn(` ⚠️ 无法读取PHP文件 ${filePath}: ${error.message}`); return null; } } /** * 提取PHP方法 */ extractMethods(content) { const methods = []; const methodRegex = /public function (\w+)\([^)]*\)\s*\{([^}]+(?:\{[^}]*\}[^}]*)*)\}/g; let match; while ((match = methodRegex.exec(content)) !== null) { methods.push({ name: match[1], content: match[2], parameters: this.extractParameters(match[0]) }); } return methods; } /** * 提取方法参数 */ extractParameters(methodSignature) { const params = []; const paramRegex = /\$(\w+)/g; let match; while ((match = paramRegex.exec(methodSignature)) !== null) { params.push({ name: match[1], type: 'any' }); } return params; } /** * 生成文件映射报告 */ generateMappingReport() { console.log('\n📊 PHP+Java文件映射报告:'); console.log('='.repeat(60)); // 统计PHP总数 let totalPHPControllers = 0; let totalPHPServices = 0; let totalPHPModels = 0; let totalPHPValidates = 0; let totalPHPMiddlewares = 0; let totalPHPRoutes = 0; let totalPHPJobs = 0; let totalPHPListeners = 0; let totalPHPCommands = 0; let totalPHPDicts = 0; // 统计Java总数 let totalJavaControllers = 0; let totalJavaEntities = 0; let totalJavaServices = 0; let totalJavaMappers = 0; let totalJavaEnums = 0; let totalJavaEvents = 0; let totalJavaListeners = 0; let totalJavaJobs = 0; // 计算PHP总数 for (const controllers of Object.values(this.discoveredFiles.controllers)) { totalPHPControllers += Object.keys(controllers).length; } for (const services of Object.values(this.discoveredFiles.services)) { totalPHPServices += Object.keys(services).length; } for (const models of Object.values(this.discoveredFiles.models)) { totalPHPModels += Object.keys(models).length; } for (const validates of Object.values(this.discoveredFiles.validates)) { totalPHPValidates += Object.keys(validates).length; } for (const middlewares of Object.values(this.discoveredFiles.middlewares)) { totalPHPMiddlewares += Object.keys(middlewares).length; } for (const routes of Object.values(this.discoveredFiles.routes)) { totalPHPRoutes += Object.keys(routes).length; } for (const jobs of Object.values(this.discoveredFiles.jobs)) { totalPHPJobs += Object.keys(jobs).length; } for (const listeners of Object.values(this.discoveredFiles.listeners)) { totalPHPListeners += Object.keys(listeners).length; } for (const commands of Object.values(this.discoveredFiles.commands)) { totalPHPCommands += Object.keys(commands).length; } for (const dicts of Object.values(this.discoveredFiles.dicts)) { totalPHPDicts += Object.keys(dicts).length; } // 计算Java总数 for (const controllers of Object.values(this.discoveredFiles.javaControllers)) { totalJavaControllers += Object.keys(controllers).length; } for (const entities of Object.values(this.discoveredFiles.javaEntities)) { totalJavaEntities += Object.keys(entities).length; } for (const services of Object.values(this.discoveredFiles.javaServices)) { totalJavaServices += Object.keys(services).length; } for (const mappers of Object.values(this.discoveredFiles.javaMappers)) { totalJavaMappers += Object.keys(mappers).length; } for (const enums of Object.values(this.discoveredFiles.javaEnums)) { totalJavaEnums += Object.keys(enums).length; } for (const events of Object.values(this.discoveredFiles.javaEvents)) { totalJavaEvents += Object.keys(events).length; } for (const listeners of Object.values(this.discoveredFiles.javaListeners)) { totalJavaListeners += Object.keys(listeners).length; } for (const jobs of Object.values(this.discoveredFiles.javaJobs)) { totalJavaJobs += Object.keys(jobs).length; } const totalPHPFiles = totalPHPControllers + totalPHPServices + totalPHPModels + totalPHPValidates + totalPHPMiddlewares + totalPHPRoutes + totalPHPJobs + totalPHPListeners + totalPHPCommands + totalPHPDicts; const totalJavaFiles = totalJavaControllers + totalJavaEntities + totalJavaServices + totalJavaMappers + totalJavaEnums + totalJavaEvents + totalJavaListeners + totalJavaJobs; console.log(`\n📈 PHP项目统计:`); console.log(` 控制器: ${totalPHPControllers} 个`); console.log(` 服务: ${totalPHPServices} 个`); console.log(` 模型: ${totalPHPModels} 个`); console.log(` 验证器: ${totalPHPValidates} 个`); console.log(` 中间件: ${totalPHPMiddlewares} 个`); console.log(` 路由: ${totalPHPRoutes} 个`); console.log(` 任务: ${totalPHPJobs} 个`); console.log(` 监听器: ${totalPHPListeners} 个`); console.log(` 命令: ${totalPHPCommands} 个`); console.log(` 字典: ${totalPHPDicts} 个`); console.log(` PHP总计: ${totalPHPFiles} 个文件`); console.log(`\n📈 Java项目统计:`); console.log(` 控制器: ${totalJavaControllers} 个`); console.log(` 实体: ${totalJavaEntities} 个`); console.log(` 服务: ${totalJavaServices} 个`); console.log(` 映射器: ${totalJavaMappers} 个`); console.log(` 枚举: ${totalJavaEnums} 个`); console.log(` 事件: ${totalJavaEvents} 个`); console.log(` 监听器: ${totalJavaListeners} 个`); console.log(` 任务: ${totalJavaJobs} 个`); console.log(` Java总计: ${totalJavaFiles} 个文件`); console.log(`\n📈 项目对比:`); console.log(` PHP总文件数: ${totalPHPFiles}`); console.log(` Java总文件数: ${totalJavaFiles}`); console.log(` 差异: ${Math.abs(totalPHPFiles - totalJavaFiles)} 个文件`); // 按模块显示详细信息 const allModules = new Set(); Object.keys(this.discoveredFiles.controllers).forEach(m => allModules.add(m)); Object.keys(this.discoveredFiles.services).forEach(m => allModules.add(m)); Object.keys(this.discoveredFiles.models).forEach(m => allModules.add(m)); Object.keys(this.discoveredFiles.validates).forEach(m => allModules.add(m)); Object.keys(this.discoveredFiles.jobs).forEach(m => allModules.add(m)); Object.keys(this.discoveredFiles.listeners).forEach(m => allModules.add(m)); Object.keys(this.discoveredFiles.commands).forEach(m => allModules.add(m)); Object.keys(this.discoveredFiles.dicts).forEach(m => allModules.add(m)); for (const moduleName of allModules) { console.log(`\n📁 模块: ${moduleName}`); if (this.discoveredFiles.controllers[moduleName]) { console.log(' 控制器:'); for (const [controllerName, info] of Object.entries(this.discoveredFiles.controllers[moduleName])) { console.log(` - ${controllerName} (${info.layer})`); } } if (this.discoveredFiles.services[moduleName]) { console.log(' 服务:'); for (const [serviceName, info] of Object.entries(this.discoveredFiles.services[moduleName])) { console.log(` - ${serviceName} (${info.layer})`); } } if (this.discoveredFiles.models[moduleName]) { console.log(' 模型:'); for (const [modelName, info] of Object.entries(this.discoveredFiles.models[moduleName])) { console.log(` - ${modelName}`); } } if (this.discoveredFiles.validates[moduleName]) { console.log(' 验证器:'); for (const [validateName, info] of Object.entries(this.discoveredFiles.validates[moduleName])) { console.log(` - ${validateName}`); } } if (this.discoveredFiles.jobs[moduleName]) { console.log(' 任务:'); for (const [jobName, info] of Object.entries(this.discoveredFiles.jobs[moduleName])) { console.log(` - ${jobName}`); } } if (this.discoveredFiles.listeners[moduleName]) { console.log(' 监听器:'); for (const [listenerName, info] of Object.entries(this.discoveredFiles.listeners[moduleName])) { console.log(` - ${listenerName}`); } } if (this.discoveredFiles.commands[moduleName]) { console.log(' 命令:'); for (const [commandName, info] of Object.entries(this.discoveredFiles.commands[moduleName])) { console.log(` - ${commandName}`); } } if (this.discoveredFiles.dicts[moduleName]) { console.log(' 字典:'); for (const [dictName, info] of Object.entries(this.discoveredFiles.dicts[moduleName])) { console.log(` - ${dictName}`); } } } // 显示中间件和路由 if (Object.keys(this.discoveredFiles.middlewares).length > 0) { console.log(`\n📁 中间件:`); for (const [layer, middlewares] of Object.entries(this.discoveredFiles.middlewares)) { console.log(` ${layer}:`); for (const [middlewareName, info] of Object.entries(middlewares)) { console.log(` - ${middlewareName}`); } } } if (Object.keys(this.discoveredFiles.routes).length > 0) { console.log(`\n📁 路由:`); for (const [layer, routes] of Object.entries(this.discoveredFiles.routes)) { console.log(` ${layer}:`); for (const [routeName, info] of Object.entries(routes)) { console.log(` - ${routeName}`); } } } } /** * 保存发现结果到文件 */ saveDiscoveryResult() { const resultPath = path.join(__dirname, 'php-discovery-result.json'); fs.writeFileSync(resultPath, JSON.stringify(this.discoveredFiles, null, 2)); console.log(`\n💾 发现结果已保存到: ${resultPath}`); } /** * 发现所有PHP模型文件 */ discoverModels() { console.log('🔍 发现PHP模型文件...'); const modelPath = path.join(this.phpBasePath, 'app/model'); if (fs.existsSync(modelPath)) { const modules = fs.readdirSync(modelPath); for (const module of modules) { const modulePath = path.join(modelPath, module); if (fs.statSync(modulePath).isDirectory()) { const files = fs.readdirSync(modulePath).filter(file => file.endsWith('.php')); if (!this.discoveredFiles.models[module]) { this.discoveredFiles.models[module] = {}; } for (const file of files) { const className = file.replace('.php', ''); this.discoveredFiles.models[module][className] = { filePath: path.join(modulePath, file), className: className, moduleName: module }; console.log(` ✅ 发现模型: ${module}/${className}`); } } } } } /** * 发现所有PHP验证器文件 */ discoverValidates() { console.log('🔍 发现PHP验证器文件...'); // 发现 app/validate 目录下的验证器文件 const validatePath = path.join(this.phpBasePath, 'app/validate'); if (fs.existsSync(validatePath)) { const modules = fs.readdirSync(validatePath); for (const module of modules) { const modulePath = path.join(validatePath, module); if (fs.statSync(modulePath).isDirectory()) { const files = fs.readdirSync(modulePath).filter(file => file.endsWith('.php')); if (!this.discoveredFiles.validates[module]) { this.discoveredFiles.validates[module] = {}; } for (const file of files) { const className = file.replace('.php', ''); this.discoveredFiles.validates[module][className] = { filePath: path.join(modulePath, file), className: className, moduleName: module }; console.log(` ✅ 发现验证器: ${module}/${className}`); } } } } // 发现 app/lang 目录下的验证器文件 const langPath = path.join(this.phpBasePath, 'app/lang'); if (fs.existsSync(langPath)) { const languages = fs.readdirSync(langPath); for (const lang of languages) { const langPath = path.join(this.phpBasePath, 'app/lang', lang); if (fs.statSync(langPath).isDirectory()) { const validateFile = path.join(langPath, 'validate.php'); if (fs.existsSync(validateFile)) { if (!this.discoveredFiles.validates['lang']) { this.discoveredFiles.validates['lang'] = {}; } this.discoveredFiles.validates['lang'][`${lang}Validate`] = { filePath: validateFile, className: `${lang}Validate`, moduleName: 'lang' }; console.log(` ✅ 发现语言验证器: lang/${lang}Validate`); } } } } } /** * 发现所有PHP中间件文件 */ discoverMiddlewares() { console.log('🔍 发现PHP中间件文件...'); const middlewarePaths = [ 'app/adminapi/middleware', 'app/api/middleware' ]; for (const middlewarePath of middlewarePaths) { const fullPath = path.join(this.phpBasePath, middlewarePath); if (fs.existsSync(fullPath)) { const files = fs.readdirSync(fullPath).filter(file => file.endsWith('.php')); const layer = middlewarePath.includes('adminapi') ? 'adminapi' : 'api'; if (!this.discoveredFiles.middlewares[layer]) { this.discoveredFiles.middlewares[layer] = {}; } for (const file of files) { const className = file.replace('.php', ''); this.discoveredFiles.middlewares[layer][className] = { filePath: path.join(fullPath, file), className: className, layer: layer }; console.log(` ✅ 发现中间件: ${layer}/${className}`); } } } } /** * 发现所有PHP路由文件 */ discoverRoutes() { console.log('🔍 发现PHP路由文件...'); const routePaths = [ 'app/adminapi/route', 'app/api/route' ]; for (const routePath of routePaths) { const fullPath = path.join(this.phpBasePath, routePath); if (fs.existsSync(fullPath)) { const files = fs.readdirSync(fullPath).filter(file => file.endsWith('.php')); const layer = routePath.includes('adminapi') ? 'adminapi' : 'api'; if (!this.discoveredFiles.routes[layer]) { this.discoveredFiles.routes[layer] = {}; } for (const file of files) { const className = file.replace('.php', ''); this.discoveredFiles.routes[layer][className] = { filePath: path.join(fullPath, file), className: className, layer: layer }; console.log(` ✅ 发现路由: ${layer}/${className}`); } } } } /** * 发现所有PHP任务文件 */ discoverJobs() { console.log('🔍 发现PHP任务文件...'); const jobPath = path.join(this.phpBasePath, 'app/job'); if (fs.existsSync(jobPath)) { const modules = fs.readdirSync(jobPath); for (const module of modules) { const modulePath = path.join(jobPath, module); if (fs.statSync(modulePath).isDirectory()) { const files = fs.readdirSync(modulePath).filter(file => file.endsWith('.php')); if (!this.discoveredFiles.jobs[module]) { this.discoveredFiles.jobs[module] = {}; } for (const file of files) { const className = file.replace('.php', ''); this.discoveredFiles.jobs[module][className] = { filePath: path.join(modulePath, file), className: className, moduleName: module }; console.log(` ✅ 发现任务: ${module}/${className}`); } } } } } /** * 发现所有PHP监听器文件 */ discoverListeners() { console.log('🔍 发现PHP监听器文件...'); const listenerPath = path.join(this.phpBasePath, 'app/listener'); if (fs.existsSync(listenerPath)) { const modules = fs.readdirSync(listenerPath); for (const module of modules) { const modulePath = path.join(listenerPath, module); if (fs.statSync(modulePath).isDirectory()) { const files = fs.readdirSync(modulePath).filter(file => file.endsWith('.php')); if (!this.discoveredFiles.listeners[module]) { this.discoveredFiles.listeners[module] = {}; } for (const file of files) { const className = file.replace('.php', ''); this.discoveredFiles.listeners[module][className] = { filePath: path.join(modulePath, file), className: className, moduleName: module }; console.log(` ✅ 发现监听器: ${module}/${className}`); } } } } } /** * 发现所有PHP命令文件 */ discoverCommands() { console.log('🔍 发现PHP命令文件...'); const commandPath = path.join(this.phpBasePath, 'app/command'); if (fs.existsSync(commandPath)) { const modules = fs.readdirSync(commandPath); for (const module of modules) { const modulePath = path.join(commandPath, module); if (fs.statSync(modulePath).isDirectory()) { const files = fs.readdirSync(modulePath).filter(file => file.endsWith('.php')); if (!this.discoveredFiles.commands[module]) { this.discoveredFiles.commands[module] = {}; } for (const file of files) { const className = file.replace('.php', ''); this.discoveredFiles.commands[module][className] = { filePath: path.join(modulePath, file), className: className, moduleName: module }; console.log(` ✅ 发现命令: ${module}/${className}`); } } } } } /** * 发现所有PHP字典文件 */ discoverDicts() { console.log('🔍 发现PHP字典文件...'); // 发现 app/dict 目录下的字典文件 const dictPath = path.join(this.phpBasePath, 'app/dict'); if (fs.existsSync(dictPath)) { const modules = fs.readdirSync(dictPath); for (const module of modules) { const modulePath = path.join(dictPath, module); if (fs.statSync(modulePath).isDirectory()) { const files = fs.readdirSync(modulePath).filter(file => file.endsWith('.php')); if (!this.discoveredFiles.dicts[module]) { this.discoveredFiles.dicts[module] = {}; } for (const file of files) { const className = file.replace('.php', ''); this.discoveredFiles.dicts[module][className] = { filePath: path.join(modulePath, file), className: className, moduleName: module }; console.log(` ✅ 发现字典: ${module}/${className}`); } } } } // 发现其他位置的字典文件 const otherDictPaths = [ 'app/adminapi/controller/dict', 'app/model/dict', 'app/service/admin/dict' ]; for (const dictPath of otherDictPaths) { const fullPath = path.join(this.phpBasePath, dictPath); if (fs.existsSync(fullPath)) { const files = fs.readdirSync(fullPath).filter(file => file.endsWith('.php')); for (const file of files) { const className = file.replace('.php', ''); const moduleName = 'dict'; // 统一归类到dict模块 if (!this.discoveredFiles.dicts[moduleName]) { this.discoveredFiles.dicts[moduleName] = {}; } this.discoveredFiles.dicts[moduleName][className] = { filePath: path.join(fullPath, file), className: className, moduleName: moduleName }; console.log(` ✅ 发现其他字典: ${moduleName}/${className}`); } } } // 发现 app/lang 目录下的字典文件 const langPath = path.join(this.phpBasePath, 'app/lang'); if (fs.existsSync(langPath)) { const languages = fs.readdirSync(langPath); for (const lang of languages) { const langPath = path.join(this.phpBasePath, 'app/lang', lang); if (fs.statSync(langPath).isDirectory()) { const dictFile = path.join(langPath, 'dict.php'); if (fs.existsSync(dictFile)) { if (!this.discoveredFiles.dicts['lang']) { this.discoveredFiles.dicts['lang'] = {}; } this.discoveredFiles.dicts['lang'][`${lang}Dict`] = { filePath: dictFile, className: `${lang}Dict`, moduleName: 'lang' }; console.log(` ✅ 发现语言字典: lang/${lang}Dict`); } } } } } /** * 发现所有PHP Trait文件 */ discoverTraits() { console.log('🔍 发现PHP Trait文件...'); // 搜索所有PHP文件中的trait定义 const searchPaths = [ 'app/service', 'app/model', 'app/controller' ]; for (const searchPath of searchPaths) { const fullPath = path.join(this.phpBasePath, searchPath); if (fs.existsSync(fullPath)) { this.searchTraitsInDirectory(fullPath, searchPath); } } } /** * 在目录中搜索Trait文件 */ searchTraitsInDirectory(dirPath, relativePath) { const files = fs.readdirSync(dirPath); for (const file of files) { const filePath = path.join(dirPath, file); const stat = fs.statSync(filePath); if (stat.isDirectory()) { this.searchTraitsInDirectory(filePath, path.join(relativePath, file)); } else if (file.endsWith('.php')) { this.extractTraitsFromFile(filePath, relativePath); } } } /** * 从PHP文件中提取Trait定义 */ extractTraitsFromFile(filePath, relativePath) { try { const content = fs.readFileSync(filePath, 'utf-8'); // 匹配trait定义 const traitRegex = /trait\s+(\w+)\s*\{/g; let match; while ((match = traitRegex.exec(content)) !== null) { const traitName = match[1]; const moduleName = this.extractModuleNameFromPath(relativePath); if (!this.discoveredFiles.traits[moduleName]) { this.discoveredFiles.traits[moduleName] = {}; } this.discoveredFiles.traits[moduleName][traitName] = { filePath: filePath, className: traitName, moduleName: moduleName }; console.log(` ✅ 发现Trait: ${moduleName}/${traitName}`); } } catch (error) { console.log(` ⚠️ 读取文件失败: ${filePath}`); } } /** * 从路径中提取模块名 */ extractModuleNameFromPath(relativePath) { const parts = relativePath.split(path.sep); // 跳过 'app' 和 'service'/'model'/'controller' 部分 if (parts.length > 2) { return parts[2]; } return 'common'; } /** * 发现Java控制器文件 */ discoverJavaControllers() { console.log('🔍 发现Java控制器文件...'); const controllerPaths = [ 'controller/adminapi', 'controller/api', 'controller/core' ]; for (const controllerPath of controllerPaths) { const fullPath = path.join(this.javaBasePath, controllerPath); if (fs.existsSync(fullPath)) { const modules = fs.readdirSync(fullPath); const layer = controllerPath.includes('adminapi') ? 'adminapi' : controllerPath.includes('api') ? 'api' : 'core'; for (const module of modules) { const modulePath = path.join(fullPath, module); if (fs.statSync(modulePath).isDirectory()) { const files = fs.readdirSync(modulePath).filter(file => file.endsWith('.java')); if (!this.discoveredFiles.javaControllers[module]) { this.discoveredFiles.javaControllers[module] = {}; } for (const file of files) { const className = file.replace('.java', ''); this.discoveredFiles.javaControllers[module][className] = { filePath: path.join(modulePath, file), className: className, layer: layer, moduleName: module }; console.log(` ✅ 发现Java控制器: ${module}/${className} (${layer})`); } } } } } } /** * 发现Java实体文件 */ discoverJavaEntities() { console.log('🔍 发现Java实体文件...'); const entityPath = path.join(this.javaBasePath, 'entity'); if (fs.existsSync(entityPath)) { const modules = fs.readdirSync(entityPath); for (const module of modules) { const modulePath = path.join(entityPath, module); if (fs.statSync(modulePath).isDirectory()) { const files = fs.readdirSync(modulePath).filter(file => file.endsWith('.java')); if (!this.discoveredFiles.javaEntities[module]) { this.discoveredFiles.javaEntities[module] = {}; } for (const file of files) { const className = file.replace('.java', ''); this.discoveredFiles.javaEntities[module][className] = { filePath: path.join(modulePath, file), className: className, moduleName: module }; console.log(` ✅ 发现Java实体: ${module}/${className}`); } } } } } /** * 发现Java服务文件 */ discoverJavaServices() { console.log('🔍 发现Java服务文件...'); const servicePaths = [ 'service/admin', 'service/api', 'service/core' ]; for (const servicePath of servicePaths) { const fullPath = path.join(this.javaBasePath, servicePath); if (fs.existsSync(fullPath)) { const modules = fs.readdirSync(fullPath); const layer = servicePath.includes('admin') ? 'admin' : servicePath.includes('api') ? 'api' : 'core'; for (const module of modules) { const modulePath = path.join(fullPath, module); if (fs.statSync(modulePath).isDirectory()) { const files = fs.readdirSync(modulePath).filter(file => file.endsWith('.java')); if (!this.discoveredFiles.javaServices[module]) { this.discoveredFiles.javaServices[module] = {}; } for (const file of files) { const className = file.replace('.java', ''); this.discoveredFiles.javaServices[module][className] = { filePath: path.join(modulePath, file), className: className, layer: layer, moduleName: module }; console.log(` ✅ 发现Java服务: ${module}/${className} (${layer})`); } } } } } } /** * 发现Java映射器文件 */ discoverJavaMappers() { console.log('🔍 发现Java映射器文件...'); const mapperPath = path.join(this.javaBasePath, 'mapper'); if (fs.existsSync(mapperPath)) { const modules = fs.readdirSync(mapperPath); for (const module of modules) { const modulePath = path.join(mapperPath, module); if (fs.statSync(modulePath).isDirectory()) { const files = fs.readdirSync(modulePath).filter(file => file.endsWith('.java')); if (!this.discoveredFiles.javaMappers[module]) { this.discoveredFiles.javaMappers[module] = {}; } for (const file of files) { const className = file.replace('.java', ''); this.discoveredFiles.javaMappers[module][className] = { filePath: path.join(modulePath, file), className: className, moduleName: module }; console.log(` ✅ 发现Java映射器: ${module}/${className}`); } } } } } /** * 发现Java枚举文件 */ discoverJavaEnums() { console.log('🔍 发现Java枚举文件...'); const enumPath = path.join(this.javaBasePath, 'enums'); if (fs.existsSync(enumPath)) { const modules = fs.readdirSync(enumPath); for (const module of modules) { const modulePath = path.join(enumPath, module); if (fs.statSync(modulePath).isDirectory()) { const files = fs.readdirSync(modulePath).filter(file => file.endsWith('.java')); if (!this.discoveredFiles.javaEnums[module]) { this.discoveredFiles.javaEnums[module] = {}; } for (const file of files) { const className = file.replace('.java', ''); this.discoveredFiles.javaEnums[module][className] = { filePath: path.join(modulePath, file), className: className, moduleName: module }; console.log(` ✅ 发现Java枚举: ${module}/${className}`); } } } } } /** * 发现Java事件文件 */ discoverJavaEvents() { console.log('🔍 发现Java事件文件...'); const eventPath = path.join(this.javaBasePath, 'event'); if (fs.existsSync(eventPath)) { const modules = fs.readdirSync(eventPath); for (const module of modules) { const modulePath = path.join(eventPath, module); if (fs.statSync(modulePath).isDirectory()) { const files = fs.readdirSync(modulePath).filter(file => file.endsWith('.java')); if (!this.discoveredFiles.javaEvents[module]) { this.discoveredFiles.javaEvents[module] = {}; } for (const file of files) { const className = file.replace('.java', ''); this.discoveredFiles.javaEvents[module][className] = { filePath: path.join(modulePath, file), className: className, moduleName: module }; console.log(` ✅ 发现Java事件: ${module}/${className}`); } } } } } /** * 发现Java监听器文件 */ discoverJavaListeners() { console.log('🔍 发现Java监听器文件...'); const listenerPath = path.join(this.javaBasePath, 'listener'); if (fs.existsSync(listenerPath)) { const modules = fs.readdirSync(listenerPath); for (const module of modules) { const modulePath = path.join(listenerPath, module); if (fs.statSync(modulePath).isDirectory()) { const files = fs.readdirSync(modulePath).filter(file => file.endsWith('.java')); if (!this.discoveredFiles.javaListeners[module]) { this.discoveredFiles.javaListeners[module] = {}; } for (const file of files) { const className = file.replace('.java', ''); this.discoveredFiles.javaListeners[module][className] = { filePath: path.join(modulePath, file), className: className, moduleName: module }; console.log(` ✅ 发现Java监听器: ${module}/${className}`); } } } } } /** * 发现Java任务文件 */ discoverJavaJobs() { console.log('🔍 发现Java任务文件...'); const jobPath = path.join(this.javaBasePath, 'job'); if (fs.existsSync(jobPath)) { const modules = fs.readdirSync(jobPath); for (const module of modules) { const modulePath = path.join(jobPath, module); if (fs.statSync(modulePath).isDirectory()) { const files = fs.readdirSync(modulePath).filter(file => file.endsWith('.java')); if (!this.discoveredFiles.javaJobs[module]) { this.discoveredFiles.javaJobs[module] = {}; } for (const file of files) { const className = file.replace('.java', ''); this.discoveredFiles.javaJobs[module][className] = { filePath: path.join(modulePath, file), className: className, moduleName: module }; console.log(` ✅ 发现Java任务: ${module}/${className}`); } } } } } /** * 运行发现过程 */ async run() { console.log('🚀 启动PHP+Java文件发现工具...'); // 发现PHP文件 console.log('\n📁 发现PHP文件...'); this.discoverControllers(); this.discoverServices(); this.discoverModels(); this.discoverValidates(); this.discoverMiddlewares(); this.discoverRoutes(); this.discoverJobs(); this.discoverListeners(); this.discoverCommands(); this.discoverDicts(); this.discoverTraits(); // 发现Java文件 console.log('\n📁 发现Java文件...'); this.discoverJavaControllers(); this.discoverJavaEntities(); this.discoverJavaServices(); this.discoverJavaMappers(); this.discoverJavaEnums(); this.discoverJavaEvents(); this.discoverJavaListeners(); this.discoverJavaJobs(); this.generateMappingReport(); this.saveDiscoveryResult(); console.log('\n✅ PHP+Java文件发现完成!'); return this.discoveredFiles; } } // 如果直接运行此脚本 if (require.main === module) { const discovery = new PHPFileDiscovery(); discovery.run().catch(console.error); } module.exports = PHPFileDiscovery;