# 开发者指南 - 自己动手修改代码 本指南说明我帮您创建的所有文件、它们的作用,以及如何自己修改和调试。 --- ## 📁 我创建的文件清单 ### 1. 核心脚本(scripts/ 目录) #### `scripts/port-checker.js` - 端口检测工具 **作用**:检测端口是否可用,找到可用端口 **关键方法**: ```javascript PortChecker.checkPort(3306) // 检查单个端口 PortChecker.findAvailablePort(3306) // 从3306开始找可用端口 PortChecker.waitForPort(3306) // 等待端口开始监听 ``` **如何修改**: - 修改端口检测范围:改 `maxAttempts` 参数(默认100) - 修改超时时间:改 `waitForPort` 的 `timeout` 参数(默认30秒) **调试方法**: ```javascript // 单独测试 const PortChecker = require('./port-checker'); PortChecker.checkPort(3306).then(console.log); ``` --- #### `scripts/startup-manager.js` - 启动状态管理器 **作用**:管理Loading窗口,显示启动进度 **关键方法**: ```javascript startupManager.createLoadingWindow() // 创建Loading窗口 startupManager.updateProgress('init') // 更新进度 startupManager.showError('错误信息') // 显示错误 startupManager.closeLoadingWindow() // 关闭Loading窗口 ``` **如何修改启动步骤**: 在构造函数中修改 `this.steps` 数组: ```javascript this.steps = [ { id: 'init', label: '正在初始化应用...', progress: 0 }, { id: 'check-mysql-port', label: '正在检测MySQL端口...', progress: 15 }, // ... 添加或修改步骤 ]; ``` **调试方法**: ```javascript // 在 lifecycle.js 中添加日志 console.log('[StartupManager] Current step:', this.getCurrentStep()); ``` --- #### `scripts/config-generator.js` - 配置文件生成器 **作用**:根据实际路径和端口生成Spring Boot配置文件 **关键方法**: ```javascript configGenerator.generateConfig({ mysqlPort: 3306, javaPort: 18092 }) ``` **如何修改数据目录位置**: 修改 `getDataPath` 方法: ```javascript getDataPath(baseDir) { const driveLetter = path.parse(baseDir).root; // 改成你想要的路径 return path.join(driveLetter, 'YourCustomPath'); } ``` **如何添加更多占位符**: 1. 在 `application.yml.template` 中添加占位符:`{{YOUR_PLACEHOLDER}}` 2. 在 `generateConfig` 方法中添加替换逻辑: ```javascript template = template.replace(/{{YOUR_PLACEHOLDER}}/g, yourValue); ``` **调试方法**: ```javascript // 单独测试 const ConfigGenerator = require('./scripts/config-generator'); const gen = new ConfigGenerator(); gen.generateConfig({ mysqlPort: 3307 }).then(console.log); ``` --- #### `scripts/mysql-service-manager.js` - MySQL 进程管理器(绿色包 - 进程模式) **作用**:以进程模式管理 MySQL,**无需管理员权限**,随应用启动/关闭 **核心方法**: ```javascript // 主要方法: ensureServiceRunning() // 确保 MySQL 运行(主流程) startMySQLProcess(port) // 启动 MySQL 进程 stopMySQLProcess() // 停止 MySQL 进程 checkAndKillOrphanProcess() // 清理残留进程 isMySQLRunning() // 检查进程是否运行 ``` **如何修改 my.ini 配置**: 在 `generateMyIni` 方法中修改配置模板: ```javascript generateMyIni(port) { const config = `[mysqld] basedir=${basedir} datadir=${datadir} port=${port} bind-address=0.0.0.0 character-set-server=utf8mb4 max_connections=500 # 修改最大连接数 innodb_buffer_pool_size=256M # 修改缓冲池大小 `; // ... } ``` **如何修改启动参数**: 在 `startMySQLProcess` 方法中修改 spawn 参数: ```javascript this.mysqlProcess = spawn(mysqldPath, [ `--defaults-file=${this.configFile}`, '--console', '--skip-grant-tables', // 添加跳过权限检查(仅用于调试) ], { cwd: this.binPath, stdio: ['ignore', 'pipe', 'pipe'] }); ``` **调试方法**: ```javascript // 单独测试 const MySQLServiceManager = require('./scripts/mysql-service-manager'); const mysql = new MySQLServiceManager(); mysql.ensureServiceRunning( (startPort, maxAttempts) => startPort, // Mock port checker (port, timeout) => Promise.resolve(true) ).then(port => { console.log('MySQL started on port:', port); }); ``` --- #### `scripts/java-runner.js` - Java 运行器 **作用**:运行Spring Boot JAR文件 **关键修改**: ```javascript // 我添加的: runSpringBoot(jarPath, configPath) // 运行Spring Boot stopSpringBoot() // 停止Spring Boot ``` **如何添加JVM参数**: 在 `runSpringBoot` 方法中修改 `javaArgs`: ```javascript const javaArgs = [ '-Xms512m', // 最小堆内存 '-Xmx1024m', // 最大堆内存 '-Dfile.encoding=UTF-8', // 文件编码 '-jar', jarPath, `--spring.config.location=${configPath}` ]; ``` **调试方法**: ```javascript // 单独测试 const JavaRunner = require('./scripts/java-runner'); const runner = new JavaRunner(); runner.runSpringBoot('path/to/jar', 'path/to/config'); ``` --- ### 2. 生命周期管理 #### `electron/preload/lifecycle.js` - 核心启动流程 **作用**:协调整个启动流程 **关键流程**: ```javascript ready() -> startApplication() -> { 1. 检测MySQL端口 2. 启动MySQL 3. 检测Java端口 4. 生成配置文件 5. 启动Spring Boot } ``` **如何修改启动顺序**: 在 `startApplication` 方法中调整步骤顺序或添加新步骤: ```javascript async startApplication() { // 步骤1: 初始化 this.startupManager.updateProgress('init'); // 添加你的自定义步骤 this.startupManager.updateProgress('custom-step'); await this.yourCustomFunction(); // 继续原有步骤... } ``` **如何修改超时时间**: ```javascript // MySQL等待超时 const mysqlReady = await PortChecker.waitForPort(actualPort, 30000); // 改这里 // Java等待超时 const javaReady = await PortChecker.waitForPort(this.javaPort, 60000); // 改这里 ``` **调试方法**: 在关键位置添加日志: ```javascript logger.info('[lifecycle] 当前步骤:', stepName); console.log('[DEBUG] 端口:', this.mysqlPort, this.javaPort); ``` --- ### 3. UI 界面 #### `public/html/loading.html` - Loading 界面 **作用**:显示启动进度的美观界面 **如何修改样式**: 修改 `