C端改造
This commit is contained in:
568
doc/开发者指南_自己动手修改.md
Normal file
568
doc/开发者指南_自己动手修改.md
Normal 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
|
||||
|
||||
239
doc/打包前检查清单.md
Normal file
239
doc/打包前检查清单.md
Normal 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
|
||||
|
||||
Reference in New Issue
Block a user