C端改造

This commit is contained in:
2025-12-16 10:21:38 +08:00
parent ffb92c87cf
commit 4d094310a1
547 changed files with 2248 additions and 2 deletions

View File

@@ -0,0 +1,568 @@
# 开发者指南 - 自己动手修改代码
本指南说明我帮您创建的所有文件、它们的作用,以及如何自己修改和调试。
---
## 📁 我创建的文件清单
### 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 界面
**作用**:显示启动进度的美观界面
**如何修改样式**
修改 `<style>` 标签内的CSS
```css
/* 修改背景颜色 */
.loading-container {
background: linear-gradient(135deg, #your-color-1 0%, #your-color-2 100%);
}
/* 修改进度条颜色 */
.progress-bar {
background: linear-gradient(90deg, #your-color 0%, #your-color 100%);
}
```
**如何修改文字内容**
修改 `<div>` 标签内的文字:
```html
<div class="logo">您的应用名称</div>
<div class="subtitle">您的公司名称</div>
```
**如何添加更多显示信息**
1. 在HTML中添加元素
```html
<div class="custom-info" id="customInfo"></div>
```
2. 在JavaScript中更新
```javascript
ipcRenderer.on('startup-progress', (event, data) => {
if (data.customData) {
document.getElementById('customInfo').textContent = data.customData;
}
});
```
---
### 4. 配置文件
#### `build/extraResources/java/application.yml.template` - 配置模板
**作用**Spring Boot配置文件模板运行时生成实际配置
**占位符说明**
- `{{APP_DATA_PATH}}` - 会被替换为实际数据目录路径
- `localhost:3306` - 会被替换为实际MySQL端口
- `port: 18092` - 会被替换为实际Java端口
**如何添加新的配置项**
1. 在模板中添加配置:
```yaml
your-config:
value: {{YOUR_VALUE}}
```
2.`config-generator.js` 中添加替换:
```javascript
template = template.replace(/{{YOUR_VALUE}}/g, yourActualValue);
```
---
## 🔧 常见修改场景
### 场景1修改端口检测起始值
**文件**`electron/preload/lifecycle.js`
**修改**
```javascript
// 原代码
this.mysqlPort = await PortChecker.findAvailablePort(3306, 100);
// 改为从3310开始
this.mysqlPort = await PortChecker.findAvailablePort(3310, 100);
```
---
### 场景2修改数据目录位置
**文件**`scripts/config-generator.js`
**修改**
```javascript
getDataPath(baseDir) {
// 原代码:使用盘符根目录
// const driveLetter = path.parse(baseDir).root;
// return path.join(driveLetter, 'NPQS9100_Data');
// 改为:使用应用同级目录
return path.join(baseDir, 'Data');
// 或者:使用固定路径
return 'C:\\MyCustomPath\\Data';
}
```
---
### 场景3修改Loading步骤
**文件**`scripts/startup-manager.js`
**修改**
```javascript
this.steps = [
{ id: 'init', label: '正在初始化应用...', progress: 0 },
{ id: 'check-env', label: '正在检测环境...', progress: 10 }, // 新增
{ id: 'check-mysql-port', label: '正在检测MySQL端口...', progress: 20 },
// ... 调整其他步骤的进度值
];
```
然后在 `lifecycle.js` 中调用:
```javascript
this.startupManager.updateProgress('check-env');
await this.checkEnvironment(); // 你的自定义方法
```
---
### 场景4修改MySQL进程配置绿色包 - 进程模式)
**文件**`scripts/mysql-service-manager.js`
**修改 my.ini 配置**(推荐方式):
```javascript
generateMyIni(port) {
const config = `[mysqld]
basedir=${basedir}
datadir=${datadir}
port=${port}
# 网络配置
bind-address=0.0.0.0
max_connections=1000 # 增加最大连接数
# 性能优化
innodb_buffer_pool_size=256M # 设置缓冲池大小
innodb_log_file_size=128M # 增加日志文件大小
# 日志配置
log-error=mysql_error.log # 错误日志
slow_query_log=1 # 开启慢查询日志
slow_query_log_file=slow.log
long_query_time=2 # 慢查询阈值2秒
`;
// ...
}
```
**注意**:不要直接修改 spawn 参数,而是通过 my.ini 配置文件控制 MySQL 行为
---
### 场景5修改JVM内存
**文件**`scripts/java-runner.js`
**修改**
```javascript
runSpringBoot(jarPath, configPath, options = {}) {
const javaArgs = [
'-Xms1024m', // 最小堆内存 1GB
'-Xmx2048m', // 最大堆内存 2GB
'-XX:+UseG1GC', // 使用G1垃圾回收器
'-jar',
jarPath,
`--spring.config.location=${configPath}`
];
// ... rest of code
}
```
---
## 🐛 调试技巧
### 1. 查看日志
**日志位置**
```
C:\Users\[用户名]\AppData\Roaming\NQPS9100\logs\
├── 9100-YYYYMMDD.log # 应用日志
├── 9100-core-YYYYMMDD.log # 核心日志
└── 9100-error-YYYYMMDD.log # 错误日志
```
**如何添加日志**
```javascript
const { logger } = require('ee-core/log');
logger.info('[YourModule] 信息日志');
logger.warn('[YourModule] 警告日志');
logger.error('[YourModule] 错误日志');
```
---
### 2. 开发环境测试
**启动开发模式**
```bash
npm run dev
```
这样修改代码后可以立即看到效果,无需打包。
---
### 3. 单独测试模块
**创建测试文件** `test-my-module.js`
```javascript
const PortChecker = require('./scripts/port-checker');
async function test() {
console.log('测试端口检测...');
const port = await PortChecker.findAvailablePort(3306);
console.log('可用端口:', port);
}
test();
```
**运行测试**
```bash
node test-my-module.js
```
---
### 4. 调试Loading界面
**单独打开Loading页面**
```bash
# 在浏览器中直接打开
start public/html/loading.html
```
**模拟进度更新**
在浏览器控制台中:
```javascript
// 模拟进度更新
const event = new CustomEvent('startup-progress');
const data = { progress: 50, label: '测试进度...' };
// 需要调整代码来测试
```
---
## 📚 文件依赖关系
```
electron/preload/lifecycle.js (启动入口)
↓ 调用
├── scripts/startup-manager.js (显示Loading)
│ ↓ 使用
│ public/html/loading.html (Loading界面)
├── scripts/port-checker.js (检测端口)
├── scripts/mysql-service-manager.js (MySQL服务管理)
├── scripts/config-generator.js (生成配置)
│ ↓ 读取
│ build/extraResources/java/application.yml.template
└── scripts/java-runner.js (启动Java)
```
---
## 🎯 快速修改检查清单
修改代码后,检查这些点:
- [ ] 语法是否正确(运行 `npm run dev` 检查)
- [ ] 路径是否正确(注意 Windows 反斜杠)
- [ ] 日志是否添加(方便调试)
- [ ] 错误处理是否完善try-catch
- [ ] 注释是否清晰(方便后续维护)
---
## 💡 开发建议
1. **先在开发模式测试**
- 修改代码 → `npm run dev` → 测试
- 确认没问题后再打包
2. **保留备份**
- 修改前备份原文件
- 使用 Git 版本控制
3. **逐步修改**
- 一次只改一个功能
- 改完测试,确认无误再继续
4. **参考现有代码**
- 我写的代码都有详细注释
- 可以参考修改
5. **善用日志**
- 关键位置都加日志
- 出问题时方便定位
---
## 📞 代码位置速查
| 功能 | 文件 | 行数范围 |
|------|------|---------|
| 端口检测 | `scripts/port-checker.js` | 全文 |
| 启动管理 | `scripts/startup-manager.js` | 全文 |
| MySQL服务管理 | `scripts/mysql-service-manager.js` | 核心方法 ensureServiceRunning |
| Java启动 | `scripts/java-runner.js` | 152-198 |
| 配置生成 | `scripts/config-generator.js` | 38-83 |
| 启动流程 | `electron/preload/lifecycle.js` | 27-159 |
| Loading界面 | `public/html/loading.html` | 全文 |
---
南京灿能电气自动化有限公司
2025-10-15

View File

@@ -0,0 +1,239 @@
# NPQS9100 打包前检查清单
## ✅ 文件检查
### JRE 文件
- [ ] `build/extraResources/jre/bin/java.exe` 存在
- [ ] 运行 `java -version` 显示 1.8.0
### MySQL 文件(进程模式 - 绿色包)
- [ ] `mysql/bin/mysqld.exe` 存在
- [ ] `mysql/bin/mysql.exe` 存在(客户端工具)
- [ ] `mysql/bin/mysqladmin.exe` 存在(管理工具)
- [ ] ~~`mysql/data/` 目录已初始化~~(首次启动时自动初始化)
- [ ] MySQL root 密码已配置为 `njcnpqs`(在 config.default.js 中)
### Java 文件
- [ ] `build/extraResources/java/entrance.jar` 存在
- [ ] `build/extraResources/java/application.yml.template` 存在
### 脚本文件
- [ ] `scripts/port-checker.js` 存在
- [ ] `scripts/startup-manager.js` 存在
- [ ] `scripts/config-generator.js` 存在
- [ ] `scripts/mysql-service-manager.js` 存在
- [ ] `scripts/log-window-manager.js` 存在
- [ ] `scripts/java-runner.js` 存在
### HTML 文件
- [ ] `public/html/loading.html` 存在
### 配置文件
- [ ] `cmd/builder.json` 配置正确
- [ ] `electron/config/config.default.js` MySQL密码为 `njcnpqs`
- [ ] `electron/preload/lifecycle.js` 已更新
---
## ✅ 功能检查
### 端口检测
- [ ] 3306 端口检测功能正常
- [ ] 18092 端口检测功能正常
- [ ] 7777 WebSocket 端口检测功能正常
- [ ] 端口递增逻辑正确(被占用时自动+1
### MySQL 进程(绿色包 - 进程模式)
- [ ] MySQL 进程能正常启动(通过 spawn mysqld.exe
- [ ] ~~MySQL 服务配置为开机自启~~(已废弃,使用进程模式)
- [ ] MySQL 数据库首次启动时自动初始化
- [ ] MySQL 连接密码正确njcnpqs
- [ ] MySQL 进程随应用退出而自动关闭
- [ ] **无需管理员权限即可启动**
### Spring Boot 启动
- [ ] JAR 包能正常运行
- [ ] 配置文件能正确生成
- [ ] 能连接到 MySQL
### Loading 界面
- [ ] Loading 窗口能正常显示
- [ ] 进度条动画流畅
- [ ] 状态文字正确显示
- [ ] 端口和路径信息正确
---
## ✅ 打包步骤
### 1. 构建前端
```bash
cd frontend
npm install # 如果需要
npm run build
cd ..
```
**验证**: `frontend/dist/` 目录存在且有文件
### 2. 检查依赖
```bash
npm install # 确保所有依赖都安装
```
### 3. 执行打包
```bash
npm run build-w # 打包 Windows 便携版
```
### 4. 等待完成
- 打包时间:约 5-15 分钟
- 产物位置:`out/NPQS9100-win-x.x.x-x64.exe`
- 预期大小650-800 MB
---
## ✅ 打包后测试
### 基础测试(绿色包 - 进程模式)
- [ ] **无需管理员权限**,普通用户双击 exe 能正常启动 ✅
- [ ] Loading 界面正常显示,显示启动步骤
- [ ] ~~MySQL 服务自动安装并启动~~(已废弃)
- [ ] **MySQL 进程自动启动**(任务管理器可见 mysqld.exe
- [ ] ~~MySQL 服务配置为开机自启~~(已废弃,进程模式随应用启动)
- [ ] Spring Boot 自动启动(任务管理器可见 java.exe
- [ ] 主界面正常显示
- [ ] 应用退出后MySQL 和 Java 进程自动关闭 ✅
### 端口测试
- [ ] 手动占用 3306应用使用 3307
- [ ] 手动占用 18092应用使用 18093
- [ ] 端口信息在 Loading 界面正确显示
### 数据目录测试
- [ ] 数据目录自动创建在正确盘符
- [ ] 所有子目录都创建成功
- [ ] 配置文件路径正确
### 功能测试
- [ ] 前端功能正常
- [ ] 能连接到后端 API
- [ ] 数据库操作正常
### 关闭测试(绿色包 - 进程模式)
- [ ] 关闭应用正常
- [ ] Spring Boot 进程已停止(检查任务管理器)
- [ ] **MySQL 进程已停止**(检查任务管理器,不应残留 mysqld.exe
- [ ] ~~MySQL 服务继续运行~~(已废弃,新版本会自动清理进程)
### 移植测试
- [ ] 移动到其他目录能运行
- [ ] 在其他电脑上能运行
- [ ] 在不同盘符上能运行
---
## ✅ 日志检查
打包后运行一次,检查日志:
### 日志位置
```
C:\Users\[用户名]\AppData\Roaming\NQPS9100\logs\
├── 9100-YYYYMMDD.log # 应用日志
├── 9100-core-YYYYMMDD.log # 核心日志
└── 9100-error-YYYYMMDD.log # 错误日志
```
### 检查内容
- [ ] 端口检测日志正确
- [ ] MySQL 服务安装/启动日志正常
- [ ] 日志中显示"服务已配置为开机自启"
- [ ] Spring Boot 启动日志正常
- [ ] 无严重错误
---
## ✅ 性能检查
- [ ] 启动时间 < 30
- [ ] Loading 界面流畅
- [ ] 内存占用合理< 1GB
- [ ] CPU 占用正常
---
## ✅ 用户体验
- [ ] Loading 提示信息清晰
- [ ] 错误提示友好
- [ ] 无明显卡顿
- [ ] 界面美观
---
## 🐛 常见问题
### 打包失败
- 检查 Node.js 版本建议 16+
- 检查 npm 依赖是否完整
- 检查磁盘空间至少 5GB
### MySQL 进程失败(绿色包 - 进程模式)
- ~~检查是否以管理员身份运行~~不再需要)✅
- 检查 `mysql/bin/mysqld.exe` 是否存在
- 检查端口是否被占用应自动切换到其他端口
- 查看应用日志`%APPDATA%/NQPS9100/logs/9100.log`
- 查看 MySQL 错误日志`mysql/data/*.err`
- ~~使用 sc query mysql9100 检查服务状态~~已废弃不再使用服务
- 检查是否有残留的 mysqld.exe 进程任务管理器
### Spring Boot 启动失败
- 检查 JAR 包是否完整
- 检查 JRE 是否正确
- 检查 MySQL 是否已启动
---
## 📦 最终产物
```
out/
└── NPQS9100-win-x.x.x-x64.exe
运行后结构:
├── NPQS9100.exe
├── mysql/
├── jre/
├── java/
└── resources/
```
---
## 📝 分发清单
打包完成后准备
1. **安装包**
- `NPQS9100-win-x.x.x-x64.exe`
2. **用户文档**
- 使用说明
- 系统要求
- 常见问题
3. **技术文档**
- 部署说明
- 配置说明
- 故障排除
---
所有检查通过后即可分发
---
南京灿能电气自动化有限公司
2025-10-15