初始化
This commit is contained in:
106
doc/CN_Tool品牌与隔离残留清单.md
Normal file
106
doc/CN_Tool品牌与隔离残留清单.md
Normal file
@@ -0,0 +1,106 @@
|
||||
# CN_Tool 品牌与隔离残留清单
|
||||
|
||||
## 目标
|
||||
- 对外名称统一为:`CN_Tool 灿能运维工具`
|
||||
- 打包产物、运行目录、快捷方式、窗口标题等内部标识统一为:`CN_Tool`
|
||||
- 当前 C 端的启动、关闭、打包、升级、回滚,不影响已运行的 `NPQS-9100` 客户端
|
||||
|
||||
## 当前判断
|
||||
- `frontend/` 源码内已基本没有 `NPQS-9100`、`自动检测平台` 等字样
|
||||
- 残留主要集中在 Electron 壳层、打包配置、启动页、运行时目录、日志文案、批处理脚本和文档
|
||||
- 目前存在“命名混用”和“进程误伤”两类问题,后者优先级更高
|
||||
|
||||
## 当前进度
|
||||
- 已完成:打包产物名、快捷方式名、输出目录切换到 `CN_Tool`
|
||||
- 已完成:主窗口标题和实例识别逻辑切换到 `CN_Tool 灿能运维工具`
|
||||
- 已完成:运行目录与数据目录切换到 `CN_Tool_Runtime`、`CN_Tool_Data`
|
||||
- 已完成:MySQL 与 JAR 进程标记和定向清理,仅处理当前应用自己的进程
|
||||
- 已完成:启动页、日志窗口、启动日志文案切换到 `CN_Tool 灿能运维工具`
|
||||
- 已完成:`data/system.json` 历史标题切换到 `CN_Tool 灿能运维工具`
|
||||
- 已完成:`build/` 下主要批处理脚本切换到 `CN_Tool`
|
||||
- 已完成:历史文档中的旧品牌命名、目录名和可执行文件说明切换到 `CN_Tool`
|
||||
- 已处理:旧文件名 `NPQS-9100绿色包完整指南.md` 目前保留为兼容跳转说明
|
||||
|
||||
## 一、品牌命名残留
|
||||
|
||||
### 1. 打包与快捷方式
|
||||
- `package.json`
|
||||
- 已修改为将输出目录重命名为 `out/CN_Tool`
|
||||
- `cmd/builder.json`
|
||||
- 已修改为 `productName: CN_Tool`
|
||||
- 已修改为 `shortcutName: CN_Tool`
|
||||
- 已修改为独立的 `appId`
|
||||
|
||||
### 2. 桌面壳层显示名称
|
||||
- `electron/config/config.default.js`
|
||||
- 主窗口标题已修改为 `CN_Tool 灿能运维工具`
|
||||
- `electron/main.js`
|
||||
- 已切换到当前应用自己的主窗口定位函数,不再依赖 `NPQS`、`检测平台` 识别实例
|
||||
- 托盘提示已改为 `CN_Tool 灿能运维工具`
|
||||
- `public/html/loading.html`
|
||||
- 启动页标题与页面主文案已改为 `CN_Tool 灿能运维工具`
|
||||
- `data/system.json`
|
||||
- 菜单与系统标题已改为 `CN_Tool 灿能运维工具`
|
||||
|
||||
### 3. 日志与运行时文案
|
||||
- `electron/preload/lifecycle.js`
|
||||
- 启动成功、启动中、应用启动日志已改为 `CN_Tool 灿能运维工具`
|
||||
- `scripts/log-window-manager.js`
|
||||
- 日志窗口标题、HTML 标题、启动日志已改为 `CN_Tool 灿能运维工具`
|
||||
|
||||
### 4. 运行目录与数据目录
|
||||
- `scripts/path-utils.js`
|
||||
- 已修改为 `CN_Tool_Runtime`
|
||||
- `scripts/config-generator.js`
|
||||
- 已修改为 `CN_Tool_Data`
|
||||
|
||||
## 二、隔离风险残留
|
||||
|
||||
### 1. 可能误识别为旧客户端
|
||||
- `electron/config/config.default.js`
|
||||
- `singleLock: true` 保持开启,但已配合新窗口标题使用
|
||||
- `electron/main.js`
|
||||
- `second-instance` 已改为只定位当前应用自己的主窗口
|
||||
- 当前剩余风险主要在旧命名文案与外部脚本,不在窗口聚焦逻辑
|
||||
|
||||
### 2. 批处理脚本会直接影响旧客户端
|
||||
- `build/clean-and-build.bat`
|
||||
- 已改为仅结束 `CN_Tool.exe`
|
||||
- `build/upgrade.bat`
|
||||
- 已改为仅结束 `CN_Tool.exe`
|
||||
- `build/rollback.bat`
|
||||
- 已改为仅结束 `CN_Tool.exe`
|
||||
- `build/diagnose-startup.bat`
|
||||
- 已改为检查 `CN_Tool.exe`
|
||||
- 已同步更新默认日志目录与当前启动端口
|
||||
|
||||
### 3. MySQL 清理逻辑过于粗暴
|
||||
- `scripts/mysql-process-manager.js`
|
||||
- 已改为基于运行标记、PID 与配置路径校验,仅清理当前应用自己的 MySQL
|
||||
- `scripts/java-runner.js`
|
||||
- 已补充 JAR 进程标记,关闭时优先按已记录 PID 清理,仅处理当前应用自己的 Java/JAR 进程
|
||||
- 风险说明
|
||||
- 当前不再按全局 `mysqld.exe` 或模糊 Java 进程做粗暴清理
|
||||
- 关闭时仅针对当前应用自己启动并校验通过的 MySQL/JAR 进程执行清理
|
||||
|
||||
## 三、建议修改顺序
|
||||
|
||||
### 第一批:先做隔离,避免误伤
|
||||
- 已完成:修改 `cmd/builder.json`、`package.json`,把产物名、快捷方式、输出目录切到 `CN_Tool`
|
||||
- 已完成:修改 `electron/main.js` 与 `electron/config/config.default.js`,移除对 `NPQS`、`检测平台` 的实例识别依赖
|
||||
- 已完成:修改 `scripts/path-utils.js` 与 `scripts/config-generator.js`,把运行目录和数据目录切到 `CN_Tool_Runtime`、`CN_Tool_Data`
|
||||
- 已完成:重构 `scripts/mysql-process-manager.js` 与 `scripts/java-runner.js`,通过进程标记仅清理当前应用自己的 MySQL/JAR 进程
|
||||
|
||||
### 第二批:统一品牌展示
|
||||
- 已完成:修改窗口标题、托盘提示、启动页文案、日志窗口标题
|
||||
- 已完成:修改 `data/system.json` 中的历史菜单标题
|
||||
|
||||
### 第三批:收尾清理
|
||||
- 已完成:修改 `build/` 下批处理脚本中的旧命名
|
||||
- 已完成:修改 `doc/` 中仍保留的 `NPQS-9100` 历史说明
|
||||
|
||||
## 四、执行原则
|
||||
- 每次只改一类问题,避免混改
|
||||
- 优先改“会影响旧客户端运行”的逻辑,再改展示文案
|
||||
- 关键业务节点补充 UTF-8 中文注释,说明为什么这样改
|
||||
- 每次修改后,至少检查受影响文件的调用链和配置一致性
|
||||
894
doc/CN_Tool绿色包完整指南.md
Normal file
894
doc/CN_Tool绿色包完整指南.md
Normal file
@@ -0,0 +1,894 @@
|
||||
# CN_Tool 绿色包完整指南
|
||||
|
||||
本指南包含绿色包的打包、使用、升级和维护的完整说明。
|
||||
|
||||
---
|
||||
|
||||
## 📋 目录
|
||||
|
||||
- [一、产品说明](#一产品说明)
|
||||
- [七、用户关心的文件](#七用户关心的文件重要)⭐
|
||||
- [二、打包指南](#二打包指南)
|
||||
- [三、启动流程](#三启动流程)
|
||||
- [四、升级指南](#四升级指南)
|
||||
- [五、测试清单](#五测试清单)
|
||||
- [六、常见问题](#六常见问题)
|
||||
|
||||
---
|
||||
|
||||
## 一、产品说明
|
||||
|
||||
### 📦 产品特性
|
||||
|
||||
绿色包是一个**免安装便携版**,包含:
|
||||
- ✅ 应用本体(Electron + Vue 3)
|
||||
- ✅ MySQL 数据库(免安装版,支持动态端口)
|
||||
- ✅ Java 运行环境(JRE 8)
|
||||
- ✅ Spring Boot 后端服务(entrance.jar)
|
||||
- ✅ 智能启动流程(端口检测、Loading界面)
|
||||
- ✅ **一键升级回滚机制** ⭐
|
||||
|
||||
**用户体验**:解压即用,双击启动,无需任何配置
|
||||
|
||||
---
|
||||
|
||||
### 🎯 核心功能
|
||||
|
||||
#### **1. 智能端口检测**
|
||||
- MySQL 端口:从 3306 开始自动检测(最多 100 个)
|
||||
- Java 端口:从 18092 开始自动检测(最多 100 个)
|
||||
- 自动更新配置文件
|
||||
|
||||
#### **2. 盘符自动识别**
|
||||
- 程序目录为纯英文/ASCII路径时:数据目录位于应用目录内的 `CN_Tool_Data\`
|
||||
- 程序目录包含中文或其他非 ASCII 字符时:自动切换到当前盘符根目录下的 `CN_Tool_Runtime\`
|
||||
- 自动创建所有必要的子目录
|
||||
|
||||
#### **3. Loading 界面**
|
||||
- 紫色渐变背景
|
||||
- 流畅的进度条动画(0% → 100%)
|
||||
- 实时状态文字更新
|
||||
- 显示检测到的端口号和数据目录路径
|
||||
|
||||
#### **4. 热更新机制** ⭐
|
||||
- 前端可独立升级
|
||||
- 后端可独立升级
|
||||
- 自动备份,支持一键回滚
|
||||
- 数据库数据完全保留
|
||||
|
||||
#### **5. 简化配置管理**
|
||||
- 基于环境变量的配置方案
|
||||
- 需要修改配置时重新打包前端(upgrade.bat 升级)
|
||||
- 保证稳定性和可靠性
|
||||
|
||||
---
|
||||
|
||||
### 📁 目录结构
|
||||
|
||||
交付口径说明:
|
||||
- `electron-builder` 原始输出目录:`out/win-unpacked`
|
||||
- `npm run build-w` 脚本最终交付目录:`out/CN_Tool`
|
||||
|
||||
```
|
||||
CN_Tool/ # 绿色版目录(约 650-800 MB)
|
||||
├── CN_Tool.exe # 主程序(双击运行)⭐
|
||||
├── upgrade.bat # 升级工具 ⭐
|
||||
├── rollback.bat # 回滚工具 ⭐
|
||||
├── 使用说明.txt # 使用手册
|
||||
├── README-升级回滚.txt # 升级说明
|
||||
├── upgrade/ # 升级包目录(首次使用自动创建)
|
||||
├── backup/ # 自动备份目录
|
||||
│ ├── app.asar # 前端主包备份
|
||||
│ ├── app.asar.unpacked/ # 前端展开目录备份
|
||||
│ ├── entrance.jar # 后端备份
|
||||
│ └── version.txt # 版本记录
|
||||
├── resources/
|
||||
│ ├── app.asar # Electron 主代码(加密)
|
||||
│ ├── app.asar.unpacked/
|
||||
│ │ └── public/
|
||||
│ │ └── dist/ # 前端代码 ⭐ 可替换
|
||||
│ └── extraResources/
|
||||
│ ├── dll/
|
||||
│ └── java/
|
||||
│ ├── entrance.jar # 后端 JAR ⭐ 可替换
|
||||
│ ├── application.yml.template
|
||||
│ └── application.yml # 运行时生成
|
||||
├── scripts/ # 启动管理脚本(⚠️ 不要修改)
|
||||
│ ├── config-generator.js
|
||||
│ ├── java-runner.js
|
||||
│ ├── mysql-process-manager.js
|
||||
│ ├── port-checker.js
|
||||
│ └── startup-manager.js
|
||||
├── mysql/ # MySQL 数据库
|
||||
│ ├── bin/
|
||||
│ ├── data/ # 数据库数据 ⚠️ 不要动
|
||||
│ ├── my.ini # 运行时生成
|
||||
│ └── README.txt
|
||||
├── jre/ # Java 运行环境(⚠️ 不要修改)
|
||||
│ ├── bin/
|
||||
│ └── lib/
|
||||
└── logs/ # 应用日志
|
||||
├── startup-YYYYMMDD.log
|
||||
└── upgrade.log
|
||||
|
||||
用户数据目录(首次运行自动创建):
|
||||
- 程序目录为纯英文/ASCII路径时:
|
||||
`应用目录\CN_Tool_Data\`
|
||||
- 程序目录包含中文或其他非 ASCII 字符时:
|
||||
`X:\CN_Tool_Runtime\data\` (X 是应用所在盘符)
|
||||
|
||||
用户数据目录内包含:
|
||||
├── logs/ # Spring Boot 日志
|
||||
├── template/ # 报告模板
|
||||
├── report/ # 生成的报告
|
||||
└── data/ # 应用数据
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 七、用户关心的文件(重要!)⭐
|
||||
|
||||
### 📌 可以使用的工具
|
||||
|
||||
| 文件 | 功能 | 使用场景 |
|
||||
|------|------|---------|
|
||||
| **CN_Tool.exe** | 主程序 | 日常启动 |
|
||||
| **upgrade.bat** | 升级工具 | 收到升级包时使用 |
|
||||
| **rollback.bat** | 回滚工具 | 升级后出问题时使用 |
|
||||
| **使用说明.txt** | 使用手册 | 遇到问题时参考 |
|
||||
| **README-升级回滚.txt** | 升级说明 | 升级前阅读 |
|
||||
|
||||
---
|
||||
|
||||
### ⚠️ 不要修改的文件/目录
|
||||
|
||||
| 路径 | 说明 | 误修改后果 |
|
||||
|------|------|----------|
|
||||
| **resources/** | 应用核心代码 | 应用无法启动 |
|
||||
| **scripts/** | 启动管理脚本 | 启动流程失败 |
|
||||
| **jre/** | Java 运行环境 | Java 服务无法启动 |
|
||||
| **mysql/bin/** | MySQL 可执行文件 | 数据库无法启动 |
|
||||
| **mysql/my.ini** | MySQL 配置 | 运行时自动生成,手动修改会被覆盖 |
|
||||
|
||||
---
|
||||
|
||||
### 📂 需要保护的数据
|
||||
|
||||
| 路径 | 说明 | 备份建议 |
|
||||
|------|------|---------|
|
||||
| **应用目录\\mysql\\data/** 或 **X:\\CN_Tool_Runtime\\mysql\\data/** | 数据库数据 | ⚠️ 定期备份! |
|
||||
| **backup/** | 升级备份 | 自动管理,无需手动操作 |
|
||||
| **应用目录\\CN_Tool_Data/** 或 **X:\\CN_Tool_Runtime\\data/** | 用户数据目录 | 包含日志、模板、报告 |
|
||||
|
||||
---
|
||||
|
||||
## 二、打包指南
|
||||
|
||||
### 🏗️ 打包步骤
|
||||
|
||||
#### **步骤 1:清理并打包**
|
||||
|
||||
```bash
|
||||
cd build
|
||||
clean-and-build.bat
|
||||
```
|
||||
|
||||
**打包过程**:
|
||||
1. 停止 CN_Tool 进程
|
||||
2. 删除 out 目录
|
||||
3. 构建前端代码(Vue 3)
|
||||
4. 编译 Electron 主进程代码
|
||||
5. 复制 MySQL、JRE、Java 资源
|
||||
6. 先生成 `out/win-unpacked`,再自动重命名为最终交付目录 `out/CN_Tool`
|
||||
|
||||
**等待时间**:约 5-15 分钟
|
||||
|
||||
---
|
||||
|
||||
#### **步骤 2:测试运行**
|
||||
|
||||
```bash
|
||||
cd out\CN_Tool
|
||||
CN_Tool.exe
|
||||
```
|
||||
|
||||
**观察**:
|
||||
- ✅ Loading 界面正常显示(不在任务栏显示)
|
||||
- ✅ 启动进度正常更新(9个步骤)
|
||||
- ✅ MySQL 自动启动
|
||||
- ✅ Spring Boot 连接成功
|
||||
- ✅ 顺利进入主界面
|
||||
|
||||
---
|
||||
|
||||
#### **步骤 3:压缩发布包**
|
||||
|
||||
```powershell
|
||||
cd out
|
||||
Compress-Archive -Path CN_Tool -DestinationPath "CN_Tool-v1.0.0-绿色版.zip" -Force
|
||||
```
|
||||
|
||||
**压缩后大小**:约 350-450 MB
|
||||
|
||||
---
|
||||
|
||||
## 三、启动流程
|
||||
|
||||
### 🔄 完整启动流程
|
||||
|
||||
```
|
||||
用户解压 zip 并双击 CN_Tool.exe
|
||||
↓
|
||||
显示 Loading 界面(不在任务栏显示)
|
||||
↓
|
||||
[0%] 正在初始化应用...
|
||||
↓
|
||||
[15%] 检测 MySQL 端口 (3306 → 3307 → ...)
|
||||
├─ 找到可用端口(如 3307)
|
||||
↓
|
||||
[30%] 启动 MySQL 数据库(端口 3307)
|
||||
├─ 首次运行:自动初始化数据库
|
||||
├─ 自动设置 root 密码:njcnpqs
|
||||
├─ 自动授权 127.0.0.1 访问
|
||||
↓
|
||||
[45%] 等待 MySQL 就绪
|
||||
├─ 监听端口是否打开
|
||||
├─ 超时时间:30 秒
|
||||
↓
|
||||
[60%] 检测 Java 端口 (18092 → 18093 → ...)
|
||||
├─ 找到可用端口(如 18093)
|
||||
↓
|
||||
[70%] 检测应用所在盘符并生成配置文件
|
||||
├─ MySQL 连接:localhost:3307
|
||||
├─ MySQL 密码:njcnpqs ⭐ 自动写入
|
||||
├─ Java 端口:18093
|
||||
├─ 数据路径:纯英文路径时为 `应用目录\CN_Tool_Data\`
|
||||
├─ 数据路径:中文路径时为 `X:\CN_Tool_Runtime\data\`
|
||||
├─ 创建所有必要目录(logs、template、report、data)
|
||||
↓
|
||||
[80%] 启动 Spring Boot 后端
|
||||
├─ 使用内置 JRE 8
|
||||
├─ 加载生成的配置文件
|
||||
├─ 连接 MySQL 数据库
|
||||
↓
|
||||
[90%] 等待 Spring Boot 就绪
|
||||
├─ 监听 18093 端口
|
||||
├─ 超时时间:60 秒
|
||||
↓
|
||||
[100%] 启动完成!
|
||||
├─ 等待 1.5 秒显示完成状态
|
||||
↓
|
||||
销毁 Loading 窗口(使用 destroy() 确保完全释放)
|
||||
↓
|
||||
显示主应用界面(任务栏只显示1个图标)
|
||||
```
|
||||
|
||||
**预计启动时间**:
|
||||
- 首次运行:30-45 秒(需初始化 MySQL)
|
||||
- 后续启动:15-25 秒
|
||||
|
||||
---
|
||||
|
||||
### 🚪 关闭流程
|
||||
|
||||
```
|
||||
用户关闭应用(点击X或托盘退出)
|
||||
↓
|
||||
显示退出确认对话框
|
||||
↓
|
||||
用户确认退出
|
||||
↓
|
||||
停止 Spring Boot 进程(通过PID和端口精确清理)
|
||||
↓
|
||||
停止 MySQL 进程(随应用启动的 mysqld.exe)
|
||||
↓
|
||||
清理资源
|
||||
↓
|
||||
应用退出
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 四、升级指南
|
||||
|
||||
### 🎯 升级流程概览
|
||||
|
||||
#### **升级流程**
|
||||
```
|
||||
1. 先手动导出数据库 SQL 备份
|
||||
2. 双击 upgrade.bat(首次自动创建 upgrade/ 目录)
|
||||
3. 将升级包放入 upgrade/ 目录
|
||||
4. 再次运行 upgrade.bat(自动备份前后端程序文件 + 升级)
|
||||
5. 重启应用测试
|
||||
```
|
||||
|
||||
#### **回滚流程**
|
||||
```
|
||||
1. 双击 rollback.bat
|
||||
2. 自动从 backup/ 恢复前后端程序文件
|
||||
3. 如需恢复数据库,手动执行之前导出的 SQL
|
||||
4. 重启应用
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 🔧 升级操作步骤
|
||||
|
||||
#### **方法 1:使用升级脚本(推荐)⭐**
|
||||
|
||||
**第 1 步:准备升级包**
|
||||
|
||||
1. 先使用 Navicat 或其他工具手动导出数据库 SQL 备份
|
||||
2. 双击 `upgrade.bat`
|
||||
3. 脚本自动创建 `upgrade/` 文件夹并提示
|
||||
4. 将升级文件放入 `upgrade/` 目录:
|
||||
- `app.asar` + `app.asar.unpacked/` - 前端升级包(可选,必须成套)
|
||||
- `entrance.jar` - 后端升级包(可选)
|
||||
5. 再次双击 `upgrade.bat` 开始升级
|
||||
|
||||
**第 2 步:自动升级**
|
||||
|
||||
脚本会自动:
|
||||
- ✅ 停止 CN_Tool 进程
|
||||
- ✅ **自动备份当前前后端程序文件到 `backup/` 目录**
|
||||
- ✅ 替换前端文件(如果有)
|
||||
- ✅ 替换后端 JAR(如果有)
|
||||
- ✅ 记录升级日志到 `logs/upgrade.log`
|
||||
|
||||
数据库说明:
|
||||
- ⚠️ 数据库不再由 `upgrade.bat` 自动备份
|
||||
- ⚠️ 升级前请务必手动导出 SQL 备份
|
||||
|
||||
**第 3 步:重启应用**
|
||||
|
||||
升级完成后,双击 `CN_Tool.exe` 启动应用。
|
||||
|
||||
---
|
||||
|
||||
#### **方法 2:手动升级**
|
||||
|
||||
如果升级脚本失败,可以手动操作:
|
||||
|
||||
**升级前端**:
|
||||
```batch
|
||||
taskkill /F /IM CN_Tool.exe
|
||||
copy /Y upgrade\app.asar resources\app.asar
|
||||
rmdir /s /q resources\app.asar.unpacked
|
||||
xcopy upgrade\app.asar.unpacked resources\app.asar.unpacked\ /E /I /Y
|
||||
```
|
||||
|
||||
**升级后端**:
|
||||
```batch
|
||||
taskkill /F /IM CN_Tool.exe
|
||||
copy /Y upgrade\entrance.jar resources\extraResources\java\entrance.jar
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 🔄 回滚操作
|
||||
|
||||
#### **方法 1:使用回滚脚本(推荐)⭐**
|
||||
|
||||
如果升级后出现问题,直接双击 `rollback.bat`:
|
||||
|
||||
脚本会自动:
|
||||
- ✅ 停止 CN_Tool
|
||||
- ✅ 恢复前端(从 `backup/app.asar` 和 `backup/app.asar.unpacked/`)
|
||||
- ✅ 恢复后端(从 `backup/entrance.jar`)
|
||||
- ✅ 数据库由人工恢复,不再由脚本自动处理
|
||||
|
||||
#### **方法 2:手动回滚**
|
||||
|
||||
```batch
|
||||
# 恢复前端
|
||||
copy /Y backup\app.asar resources\app.asar
|
||||
rmdir /s /q resources\app.asar.unpacked
|
||||
xcopy backup\app.asar.unpacked resources\app.asar.unpacked\ /E /I /Y
|
||||
|
||||
# 恢复后端
|
||||
copy /Y backup\entrance.jar resources\extraResources\java\entrance.jar
|
||||
|
||||
# 恢复数据库
|
||||
# 使用 Navicat 或其他工具执行升级前导出的 SQL 备份
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 📋 升级清单
|
||||
|
||||
| 升级类型 | 升级包来源 | 客户放置位置 | 最终替换位置 |
|
||||
|---------|-----------|-------------|-------------|
|
||||
| **前端** | `out/CN_Tool/resources/app.asar` + `app.asar.unpacked/` | `upgrade/app.asar` + `upgrade/app.asar.unpacked/` | `resources/app.asar` + `resources/app.asar.unpacked/` |
|
||||
| **后端** | `out/CN_Tool/resources/extraResources/java/entrance.jar` | `upgrade/entrance.jar` | `resources/extraResources/java/entrance.jar` |
|
||||
| **数据库** | 手动导出的 SQL 备份 | 不放入升级包 | 需要时人工导入 |
|
||||
|
||||
---
|
||||
|
||||
### 🛠️ 开发者升级流程(完整版)
|
||||
|
||||
#### **前端升级完整流程**
|
||||
|
||||
```bash
|
||||
# ============================================
|
||||
# 开发侧操作
|
||||
# ============================================
|
||||
|
||||
# 1️⃣ 修改前端代码
|
||||
# 编辑 frontend/src/ 下的任何文件
|
||||
|
||||
# 2️⃣ 如需修改配置(可选)
|
||||
# 编辑 frontend/.env
|
||||
VITE_API_URL=http://192.168.1.100:18092 # 修改 API 地址
|
||||
|
||||
# 3️⃣ 构建前端
|
||||
npm run build-frontend
|
||||
|
||||
# 4️⃣ 打包应用
|
||||
npm run build-w
|
||||
# 最终交付目录: out/CN_Tool/
|
||||
# 原始输出目录: out/win-unpacked/(脚本会自动重命名)
|
||||
|
||||
# 5️⃣ 准备升级包
|
||||
# 从 out/CN_Tool/resources/ 复制以下文件:
|
||||
# - app.asar (文件)
|
||||
# - app.asar.unpacked/ (整个文件夹)
|
||||
#
|
||||
# 压缩成: CN_Tool-前端-v1.0.1.zip
|
||||
|
||||
# 6️⃣ 发给客户
|
||||
|
||||
|
||||
# ============================================
|
||||
# 客户侧操作
|
||||
# ============================================
|
||||
|
||||
# 1️⃣ 解压升级包
|
||||
# 解压 CN_Tool-前端-v1.0.1.zip
|
||||
# 得到:
|
||||
# - app.asar
|
||||
# - app.asar.unpacked/
|
||||
|
||||
# 2️⃣ 复制到升级目录
|
||||
# 将两个文件都放到:CN_Tool/upgrade/
|
||||
# - upgrade/app.asar
|
||||
# - upgrade/app.asar.unpacked/
|
||||
|
||||
# 3️⃣ 运行升级脚本
|
||||
# 双击: upgrade.bat
|
||||
|
||||
# 4️⃣ 重启应用
|
||||
# 双击: CN_Tool.exe
|
||||
```
|
||||
|
||||
#### **后端升级完整流程**
|
||||
|
||||
```bash
|
||||
# ============================================
|
||||
# 开发侧操作
|
||||
# ============================================
|
||||
|
||||
# 1️⃣ 获取新的 JAR 文件
|
||||
# 从后端开发人员获取新版本的 entrance.jar
|
||||
|
||||
# 2️⃣ 替换 JAR 文件
|
||||
# 将新的 entrance.jar 复制到:
|
||||
# build/extraResources/java/entrance.jar
|
||||
|
||||
# 3️⃣ 打包升级包
|
||||
# 直接压缩 entrance.jar 文件
|
||||
# 重命名为: CN_Tool-后端-v1.0.1.zip
|
||||
|
||||
# 4️⃣ 发给客户
|
||||
# 发送 CN_Tool-后端-v1.0.1.zip
|
||||
|
||||
|
||||
# ============================================
|
||||
# 客户侧操作
|
||||
# ============================================
|
||||
|
||||
# 1️⃣ 解压升级包
|
||||
# 解压 CN_Tool-后端-v1.0.1.zip
|
||||
# 得到 entrance.jar 文件
|
||||
|
||||
# 2️⃣ 复制到升级目录
|
||||
# 将 entrance.jar 复制到:
|
||||
# CN_Tool/upgrade/entrance.jar
|
||||
|
||||
# 3️⃣ 运行升级脚本
|
||||
# 双击: upgrade.bat
|
||||
|
||||
# 4️⃣ 重启应用
|
||||
# 双击: CN_Tool.exe
|
||||
```
|
||||
|
||||
#### **前后端同时升级**
|
||||
|
||||
```bash
|
||||
# 开发侧:准备升级包
|
||||
CN_Tool-升级-v1.1.0.zip
|
||||
├── app.asar # 前端升级包(文件)
|
||||
├── app.asar.unpacked/ # 前端升级包(文件夹)
|
||||
└── entrance.jar # 后端升级包
|
||||
|
||||
# 客户侧:复制到
|
||||
CN_Tool/upgrade/
|
||||
├── app.asar
|
||||
├── app.asar.unpacked/
|
||||
└── entrance.jar
|
||||
|
||||
# 运行 upgrade.bat 即可一次性升级前后端
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 五、测试清单
|
||||
|
||||
### ✅ 打包验证
|
||||
|
||||
- [ ] `out/CN_Tool` 目录存在
|
||||
- [ ] 目录大小约 650-800 MB
|
||||
- [ ] CN_Tool.exe 存在
|
||||
- [ ] upgrade.bat 存在
|
||||
- [ ] rollback.bat 存在
|
||||
- [ ] 使用说明.txt 存在
|
||||
- [ ] README-升级回滚.txt 存在
|
||||
- [ ] mysql/ 目录完整
|
||||
- [ ] jre/ 目录完整
|
||||
|
||||
---
|
||||
|
||||
### ✅ 基础功能测试
|
||||
|
||||
- [ ] 双击 CN_Tool.exe 能正常启动
|
||||
- [ ] Loading 界面正常显示
|
||||
- [ ] **Loading 窗口不在任务栏显示** ⭐
|
||||
- [ ] 进度条流畅更新(0% → 100%)
|
||||
- [ ] 状态文字正确显示
|
||||
- [ ] 主界面正常显示
|
||||
- [ ] **任务栏只有1个窗口预览** ⭐
|
||||
|
||||
---
|
||||
|
||||
### ✅ 端口检测测试
|
||||
|
||||
- [ ] 手动占用 3306,应用自动使用 3307
|
||||
- [ ] 手动占用 18092,应用自动使用 18093
|
||||
- [ ] Loading 界面显示检测到的端口号
|
||||
- [ ] 日志中显示正确的端口信息
|
||||
|
||||
---
|
||||
|
||||
### ✅ MySQL 测试
|
||||
|
||||
- [ ] MySQL 自动启动成功
|
||||
- [ ] **首次运行自动初始化数据库** ⭐
|
||||
- [ ] 可以用 Navicat 连接(密码:njcnpqs)
|
||||
- [ ] 可以从 127.0.0.1 连接(不报 1130 错误)⭐
|
||||
- [ ] 数据库操作正常
|
||||
- [ ] 关闭应用后 MySQL 自动停止
|
||||
|
||||
---
|
||||
|
||||
### ✅ Spring Boot 测试
|
||||
|
||||
- [ ] 后端服务自动启动
|
||||
- [ ] **能连接到 MySQL(不报密码错误)** ⭐
|
||||
- [ ] 日志无错误:"HikariPool-1 - Start completed"
|
||||
- [ ] API 接口正常响应
|
||||
- [ ] 关闭应用后 Java 进程停止
|
||||
|
||||
---
|
||||
|
||||
### ✅ 配置生成测试
|
||||
|
||||
- [ ] application.yml 自动生成
|
||||
- [ ] **MySQL 密码正确写入(njcnpqs)** ⭐
|
||||
- [ ] MySQL 端口正确
|
||||
- [ ] Java 端口正确
|
||||
- [ ] 数据路径正确(对应盘符)
|
||||
|
||||
---
|
||||
|
||||
### ✅ 数据目录测试
|
||||
|
||||
- [ ] 数据目录在正确的盘符下创建
|
||||
- [ ] 所有子目录都自动创建
|
||||
- [ ] 配置文件路径正确
|
||||
- [ ] 日志文件正常写入
|
||||
|
||||
---
|
||||
|
||||
### ✅ 便携性测试
|
||||
|
||||
- [ ] 可以解压到任意目录运行
|
||||
- [ ] 可以移动到其他目录运行
|
||||
- [ ] 可以在不同电脑上运行
|
||||
- [ ] 可以在不同盘符上运行(C/D/E...)
|
||||
- [ ] 删除目录即可完全卸载
|
||||
- [ ] **压缩成 zip 后用户可正常解压使用** ⭐
|
||||
|
||||
---
|
||||
|
||||
### ✅ 升级回滚测试
|
||||
|
||||
- [ ] upgrade.bat 首次运行自动创建 upgrade/ 目录
|
||||
- [ ] upgrade.bat 检测到升级文件后正常升级
|
||||
- [ ] 升级前自动备份到 backup/ 目录
|
||||
- [ ] 升级前已手动导出数据库 SQL
|
||||
- [ ] 升级后应用正常运行
|
||||
- [ ] 升级后数据库数据保留
|
||||
- [ ] rollback.bat 能正确回滚前端
|
||||
- [ ] rollback.bat 能正确回滚后端
|
||||
- [ ] 如需恢复数据库,能手动导入 SQL
|
||||
- [ ] 回滚后应用恢复正常
|
||||
|
||||
---
|
||||
|
||||
### ✅ 性能测试
|
||||
|
||||
- [ ] 首次启动 < 45 秒
|
||||
- [ ] 后续启动 < 30 秒
|
||||
- [ ] Loading 界面流畅无卡顿
|
||||
- [ ] 内存占用合理(< 1GB)
|
||||
- [ ] CPU 占用正常
|
||||
|
||||
---
|
||||
|
||||
### ✅ 错误处理测试
|
||||
|
||||
- [ ] 端口全部占用时显示友好错误
|
||||
- [ ] MySQL 启动失败时显示错误信息
|
||||
- [ ] Spring Boot 启动失败时不崩溃
|
||||
- [ ] 升级失败时自动回滚
|
||||
- [ ] 托盘图标显示正常
|
||||
- [ ] 退出确认对话框正常工作
|
||||
|
||||
---
|
||||
|
||||
## 六、常见问题
|
||||
|
||||
### Q1: Loading 界面一直卡在某个步骤?
|
||||
|
||||
**A**: 查看日志定位问题:
|
||||
```
|
||||
C:\Users\[用户名]\AppData\Roaming\CN_Tool\logs\
|
||||
├── 9100-YYYYMMDD.log # 应用日志
|
||||
├── 9100-core-YYYYMMDD.log # 核心日志
|
||||
└── 9100-error-YYYYMMDD.log # 错误日志
|
||||
```
|
||||
|
||||
常见原因:
|
||||
- MySQL 启动失败 → 检查端口是否可用
|
||||
- Java 启动失败 → 检查 JRE 是否完整
|
||||
- 配置生成失败 → 检查磁盘权限
|
||||
|
||||
---
|
||||
|
||||
### Q2: 显示"无法找到可用端口"错误?
|
||||
|
||||
**A**:
|
||||
- 检查是否有大量端口被占用
|
||||
- 尝试关闭其他占用端口的程序
|
||||
- 或修改起始端口(见开发者指南)
|
||||
|
||||
---
|
||||
|
||||
### Q3: MySQL 连接失败或提示 1130 错误?
|
||||
|
||||
**A**:
|
||||
- 确认 MySQL 已启动(任务管理器查看 mysqld.exe)
|
||||
- 确认端口正确(看 Loading 界面显示的端口)
|
||||
- 确认密码正确(njcnpqs,已自动配置)
|
||||
- 检查是否有杀毒软件拦截
|
||||
- 如有问题,重启应用即可(MySQL 会自动重新配置)
|
||||
|
||||
---
|
||||
|
||||
### Q4: 后端 API 无法访问?
|
||||
|
||||
**A**:
|
||||
- 确认 Spring Boot 已启动
|
||||
- 确认端口正确(看 Loading 界面)
|
||||
- 检查防火墙设置
|
||||
|
||||
---
|
||||
|
||||
### Q5: 打包后体积太大?
|
||||
|
||||
**A**: 预期体积:
|
||||
- **解压后**:650-800 MB
|
||||
- **压缩后 (zip)**:350-450 MB
|
||||
|
||||
主要组成:
|
||||
- 应用本体:~150 MB
|
||||
- MySQL 8.0:~400 MB
|
||||
- JRE 8:~100 MB
|
||||
|
||||
优化建议:
|
||||
- 考虑使用 7z 格式(压缩率更高)
|
||||
- 可以精简 MySQL 的不必要组件
|
||||
|
||||
---
|
||||
|
||||
### Q6: 任务栏显示2个窗口预览?
|
||||
|
||||
**A**: 已修复!现在 Loading 窗口使用 `skipTaskbar: true`,不会在任务栏显示。
|
||||
|
||||
---
|
||||
|
||||
### Q7: 升级后前端显示旧版本?
|
||||
|
||||
**A**: 清除浏览器缓存,或强制刷新(Ctrl + F5)
|
||||
|
||||
---
|
||||
|
||||
### Q8: 升级后数据丢失?
|
||||
|
||||
**A**: 检查升级前是否已手动导出数据库 SQL 备份。如需恢复数据库,请使用 Navicat 或其他工具执行该 SQL 备份。
|
||||
|
||||
---
|
||||
|
||||
### Q9: 升级脚本报错?
|
||||
|
||||
**A**:
|
||||
1. 检查 `upgrade` 文件夹路径是否正确
|
||||
2. 手动执行升级步骤
|
||||
3. 查看 `logs/upgrade.log` 日志
|
||||
|
||||
---
|
||||
|
||||
### Q10: 回滚后还是有问题?
|
||||
|
||||
**A**:
|
||||
1. 检查 `backup/` 目录是否有备份文件
|
||||
2. 查看 `backup/version.txt` 确认备份版本
|
||||
3. 手动执行前后端回滚步骤(参考本文档)
|
||||
4. 如问题与数据库有关,手动导入升级前导出的 SQL
|
||||
|
||||
---
|
||||
|
||||
### Q11: 多次升级后,backup 目录的内容是什么版本?
|
||||
|
||||
**A**: `backup/` 目录保存的是**最后一次升级前**的版本(每次升级都会覆盖)
|
||||
|
||||
---
|
||||
|
||||
### Q12: 点击 X 关闭后,Java 进程还在运行?
|
||||
|
||||
**A**: 已修复!现在使用精确的进程清理机制:
|
||||
- 通过 PID 清理(如果有进程引用)
|
||||
- 通过端口号清理(精确定位)
|
||||
- **不会误杀 IDEA 等其他 Java 进程** ⭐
|
||||
|
||||
---
|
||||
|
||||
### Q13: 如何修改 API 或 WebSocket 地址?
|
||||
|
||||
**A**:
|
||||
1. 修改 `frontend/.env` 文件中的 `VITE_API_URL`
|
||||
2. 重新构建前端:`npm run build-frontend`
|
||||
3. 将 `public/dist/` 打包为升级包
|
||||
4. 使用 `upgrade.bat` 升级
|
||||
|
||||
**示例**:
|
||||
```env
|
||||
# frontend/.env
|
||||
VITE_API_URL=http://192.168.1.100:18092
|
||||
```
|
||||
|
||||
**注意**:
|
||||
- 配置修改需要重新打包前端
|
||||
- 使用升级机制保证数据安全
|
||||
|
||||
---
|
||||
|
||||
### Q14: 现在还需要安装或卸载 MySQL 服务吗?
|
||||
|
||||
**A**:
|
||||
|
||||
**当前版本不需要。**
|
||||
|
||||
当前版本已经放弃“首次使用时把 MySQL 安装成 Windows 服务并设置开机自启”的方案,改为**绿色包 + 进程模式**:
|
||||
|
||||
- 双击 `CN_Tool.exe` 时,应用会自动启动 `mysqld.exe`
|
||||
- 退出应用时,MySQL 进程会自动停止
|
||||
- **无需管理员权限**
|
||||
- **不会注册 Windows 服务**
|
||||
- **不会依赖开机自启**
|
||||
|
||||
**为什么改成这样?**
|
||||
|
||||
- 旧方案需要管理员权限
|
||||
- 用户可能直接双击使用,导致服务安装失败后应用启动失败
|
||||
- 也可能出现授权失败、赋权不完整等问题
|
||||
- 对 C 端用户来说不稳定,因此改为随应用启停的绿色包进程模式
|
||||
|
||||
**数据说明**:
|
||||
|
||||
- 程序目录为纯英文/ASCII路径时,MySQL 数据位于 `应用目录\mysql\data\`
|
||||
- 程序目录包含中文或其他非 ASCII 字符时,MySQL 数据位于 `X:\CN_Tool_Runtime\mysql\data\`
|
||||
- 当前版本不依赖任何 MySQL Windows 服务
|
||||
|
||||
---
|
||||
|
||||
## 📚 相关文档
|
||||
|
||||
**用户文档**(随应用发布):
|
||||
- `使用说明.txt` - 用户使用手册
|
||||
- `README-升级回滚.txt` - 简明升级说明
|
||||
|
||||
**开发者文档**(doc/ 目录):
|
||||
- `doc/CN_Tool绿色包完整指南.md` - 本文档(完整指南)
|
||||
- `doc/打包前检查清单.md` - 逐项检查
|
||||
- `doc/管理员权限说明.md` - 历史服务模式与当前进程模式说明
|
||||
|
||||
---
|
||||
|
||||
## 📊 技术架构
|
||||
|
||||
### 核心模块
|
||||
|
||||
- `scripts/port-checker.js` - 端口检测工具
|
||||
- `scripts/startup-manager.js` - 启动状态管理
|
||||
- `scripts/config-generator.js` - 配置文件生成
|
||||
- `scripts/mysql-process-manager.js` - MySQL 进程管理器
|
||||
- `scripts/java-runner.js` - Java 运行器
|
||||
- `scripts/log-window-manager.js` - 日志窗口管理
|
||||
- `electron/preload/lifecycle.js` - 生命周期管理
|
||||
- `public/html/loading.html` - Loading 界面
|
||||
|
||||
### 启动流程架构
|
||||
|
||||
```
|
||||
lifecycle.js (入口)
|
||||
↓ 创建
|
||||
StartupManager (显示 Loading)
|
||||
↓ 调用
|
||||
PortChecker (检测端口)
|
||||
↓ 调用
|
||||
MySQLProcessManager (管理 MySQL 进程)
|
||||
↓ 调用
|
||||
ConfigGenerator (生成配置)
|
||||
↓ 调用
|
||||
JavaRunner (启动 Spring Boot)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎉 最新改进
|
||||
|
||||
### 用户体验提升
|
||||
- ✅ **任务栏只显示1个图标** - Loading 窗口不在任务栏显示
|
||||
- ✅ **纯绿色版** - 最终交付目录统一为 `out/CN_Tool`,压缩成 zip 即可发布
|
||||
- ✅ **一键解压即用** - 用户解压后双击即可运行
|
||||
- ✅ **热更新机制** - 前后端可独立升级,支持一键回滚
|
||||
|
||||
### 技术改进
|
||||
- ✅ **MySQL 密码自动配置** - 配置生成器自动写入密码
|
||||
- ✅ **权限自动授权** - 支持 localhost 和 127.0.0.1 访问
|
||||
- ✅ **MySQL 进程模式** - 随应用启动和退出自动管理,无需管理员权限
|
||||
- ✅ **窗口管理优化** - 使用 destroy() 确保窗口完全释放
|
||||
- ✅ **精确进程清理** - 不会误杀其他 Java 进程
|
||||
- ✅ **自动备份机制** - 升级前自动备份,支持回滚
|
||||
- ✅ **热更新机制** - 前后端独立升级,无需重装
|
||||
|
||||
### 文档完善
|
||||
- ✅ **使用说明.txt** - 为用户提供详细的使用指南
|
||||
- ✅ **README-升级回滚.txt** - 简明升级操作说明
|
||||
- ✅ **完整指南** - 打包、启动、升级三合一文档
|
||||
|
||||
---
|
||||
|
||||
## 📞 技术支持
|
||||
|
||||
如遇问题,请联系技术支持并提供:
|
||||
- 应用版本号
|
||||
- 错误日志(`logs/` 目录)
|
||||
- 操作步骤截图
|
||||
|
||||
---
|
||||
|
||||
*文档更新时间: 2025-10-23*
|
||||
*南京灿能电力自动化股份有限公司*
|
||||
|
||||
|
||||
5
doc/NPQS-9100绿色包完整指南.md
Normal file
5
doc/NPQS-9100绿色包完整指南.md
Normal file
@@ -0,0 +1,5 @@
|
||||
# 文档已迁移
|
||||
|
||||
本指南已迁移至 `doc/CN_Tool绿色包完整指南.md`。
|
||||
|
||||
请优先阅读 `CN_Tool绿色包完整指南.md` 的最新内容。
|
||||
283
doc/前端业务裁剪与清除清单.md
Normal file
283
doc/前端业务裁剪与清除清单.md
Normal file
@@ -0,0 +1,283 @@
|
||||
# 前端业务裁剪与清除清单
|
||||
|
||||
## 1. 目的
|
||||
|
||||
本文基于 `doc/项目基础功能保留与业务裁剪方案.md`,整理当前 `frontend` 目录下前端页面、接口、状态管理、入口配置中的保留项、清除项和联动调整项,为后续前端裁剪提供执行依据。
|
||||
|
||||
## 2. 裁剪原则
|
||||
|
||||
- 保留平台基础能力对应的前端页面与接口。
|
||||
- 移除检测业务、设备业务、报告业务相关前端页面与接口。
|
||||
- 保留通用请求能力、登录鉴权能力、菜单权限能力。
|
||||
- 通讯底层能力如 WebSocket、SSE 只保留通用连接能力,不保留检测业务语义。
|
||||
- 对“名称看起来是平台功能,但内容实际属于检测业务”的页面,按实际功能裁剪,不按目录名裁剪。
|
||||
|
||||
## 3. 建议保留的前端能力
|
||||
|
||||
### 3.1 登录与权限管理
|
||||
|
||||
建议保留:
|
||||
|
||||
- `frontend/src/views/login/index.vue`
|
||||
- `frontend/src/views/login/components/LoginForm.vue`
|
||||
- `frontend/src/views/authority/user/index.vue`
|
||||
- `frontend/src/views/authority/role/index.vue`
|
||||
- `frontend/src/views/authority/resource/index.vue`
|
||||
- `frontend/src/api/user`
|
||||
- `frontend/src/stores/modules/user.ts`
|
||||
- `frontend/src/stores/modules/auth.ts`
|
||||
|
||||
### 3.2 平台基础管理
|
||||
|
||||
建议保留:
|
||||
|
||||
- `frontend/src/views/log/index.vue`
|
||||
- `frontend/src/views/system/dictionary/dictType/index.vue`
|
||||
- `frontend/src/views/system/dictionary/dictData/index.vue`
|
||||
- `frontend/src/views/system/dictionary/dictTree/index.vue`
|
||||
- `frontend/src/api/system/log`
|
||||
- `frontend/src/api/system/dictionary`
|
||||
- `frontend/src/stores/modules/dict.ts`
|
||||
|
||||
### 3.3 通用请求与通讯底层
|
||||
|
||||
建议保留:
|
||||
|
||||
- `frontend/src/api/index.ts`
|
||||
- `frontend/src/utils/webSocketClient.ts`
|
||||
|
||||
说明:
|
||||
|
||||
- `api/index.ts` 中的 Axios 封装、Token 处理、SSE 基础能力可保留。
|
||||
- `webSocketClient.ts` 可保留为通用连接客户端,但后续需要去掉与“预检、检测、对比检测”相关的业务语义。
|
||||
|
||||
## 4. 建议清除的前端页面
|
||||
|
||||
### 4.1 首页与检测入口
|
||||
|
||||
建议清除整个 `home` 模块:
|
||||
|
||||
- `frontend/src/views/home`
|
||||
|
||||
清除原因:
|
||||
|
||||
- 当前首页并非平台门户,而是检测模式入口、检测统计总览、设备检测、报告生成、归档、数据操作入口。
|
||||
- 与后端文档中“删除检测业务域”的目标一致。
|
||||
|
||||
### 4.2 检测计划模块
|
||||
|
||||
建议清除整个 `plan` 模块:
|
||||
|
||||
- `frontend/src/views/plan`
|
||||
|
||||
清除原因:
|
||||
|
||||
- 对应后端明确下线的检测计划管理能力。
|
||||
- 页面中包含预检、自动检测、统计分析、子计划管理等完整检测业务流程。
|
||||
|
||||
### 4.3 设备与检测资源模块
|
||||
|
||||
建议清除整个 `machine` 模块:
|
||||
|
||||
- `frontend/src/views/machine`
|
||||
|
||||
包含但不限于:
|
||||
|
||||
- 被检设备
|
||||
- 标准设备
|
||||
- 检测源
|
||||
- 控制源
|
||||
- 检测脚本
|
||||
- 误差体系
|
||||
- 设备类型
|
||||
- ICD
|
||||
|
||||
### 4.4 报告模板与业务字典页面
|
||||
|
||||
建议清除:
|
||||
|
||||
- `frontend/src/views/system/template/index.vue`
|
||||
- `frontend/src/views/system/dictionary/dictPq/index.vue`
|
||||
|
||||
清除原因:
|
||||
|
||||
- 报告模板属于报告业务能力。
|
||||
- `dictPq` 属于电能质量检测业务字典,不属于通用平台字典。
|
||||
|
||||
## 5. 建议清除的接口层
|
||||
|
||||
建议清除以下业务接口目录:
|
||||
|
||||
- `frontend/src/api/plan`
|
||||
- `frontend/src/api/device`
|
||||
- `frontend/src/api/home`
|
||||
- `frontend/src/api/result`
|
||||
- `frontend/src/api/check`
|
||||
- `frontend/src/api/socket/socket.ts`
|
||||
|
||||
说明:
|
||||
|
||||
- `api/socket/socket.ts` 虽然名称包含 `socket`,但当前封装的是检测业务动作,如预检、恢复检测、对比检测、导出对齐数据,不属于纯通讯底层接口。
|
||||
|
||||
## 6. 建议清除的状态管理
|
||||
|
||||
建议清除:
|
||||
|
||||
- `frontend/src/stores/modules/check.ts`
|
||||
|
||||
清除原因:
|
||||
|
||||
- 该 store 存储的是检测设备、检测计划、检测项、复检方式、通道连线等检测运行态数据。
|
||||
- 与平台保留能力无关。
|
||||
|
||||
## 7. 条件保留或待确认项
|
||||
|
||||
### 7.1 激活能力
|
||||
|
||||
可选保留:
|
||||
|
||||
- `frontend/src/views/system/versionRegister/index.vue`
|
||||
- `frontend/src/api/activate/index.ts`
|
||||
|
||||
说明:
|
||||
|
||||
- 后端文档中 `activate-tool` 被列为可选保留。
|
||||
- 如果项目后续仍保留授权、激活码、许可文件能力,则前端激活相关页面和接口可以保留。
|
||||
- 如果不再保留激活能力,应一并清理。
|
||||
|
||||
### 7.2 名称为系统配置但内容偏检测业务的页面
|
||||
|
||||
建议纳入删除候选:
|
||||
|
||||
- `frontend/src/views/system/base/index.vue`
|
||||
- `frontend/src/api/system/base/index.ts`
|
||||
- `frontend/src/api/system/versionRegister/index.ts`
|
||||
|
||||
原因:
|
||||
|
||||
- 当前页面内容实际是检测配置、有效数据配置、模式相关配置。
|
||||
- 不属于纯平台基础配置页面。
|
||||
|
||||
## 8. 必须联动调整的入口与配置
|
||||
|
||||
### 8.1 首页默认路由
|
||||
|
||||
需要调整:
|
||||
|
||||
- `frontend/src/config/index.ts`
|
||||
|
||||
当前问题:
|
||||
|
||||
- `HOME_URL` 当前指向 `/home/index`。
|
||||
- 如果 `home` 模块删除,必须同步修改默认首页。
|
||||
|
||||
### 8.2 登录后跳转逻辑
|
||||
|
||||
需要调整:
|
||||
|
||||
- `frontend/src/views/login/components/LoginForm.vue`
|
||||
|
||||
当前问题:
|
||||
|
||||
- 登录后默认跳转 `HOME_URL`。
|
||||
- 删除 `home` 后必须同步修改跳转目标。
|
||||
|
||||
### 8.3 模式切换与菜单显示逻辑
|
||||
|
||||
需要调整:
|
||||
|
||||
- `frontend/src/stores/modules/auth.ts`
|
||||
- `frontend/src/stores/modules/mode.ts`
|
||||
|
||||
当前问题:
|
||||
|
||||
- 当前逻辑围绕“模拟式、数字式、比对式、场景切换、进入检测后显示菜单”设计。
|
||||
- 如果检测业务整体下线,这套逻辑需要一起收缩或重构。
|
||||
|
||||
### 8.4 动态路由与菜单数据
|
||||
|
||||
需要联动确认:
|
||||
|
||||
- `frontend/src/routers/modules/dynamicRouter.ts`
|
||||
|
||||
说明:
|
||||
|
||||
- 当前动态路由来源于后端菜单配置。
|
||||
- 如果后端未同步清理业务菜单,前端即使删除页面,也仍可能收到失效路由配置。
|
||||
|
||||
## 9. 当前前端裁剪结论
|
||||
|
||||
建议前端最终保留的主要内容:
|
||||
|
||||
- 登录页
|
||||
- 用户管理
|
||||
- 角色管理
|
||||
- 菜单/资源管理
|
||||
- 日志管理
|
||||
- 通用字典管理
|
||||
- 通用请求封装
|
||||
- 通用 WebSocket/SSE 底层能力
|
||||
- 可选的激活能力
|
||||
|
||||
建议前端最终清除的主要内容:
|
||||
|
||||
- 首页检测门户
|
||||
- 检测计划
|
||||
- 被检设备
|
||||
- 标准设备
|
||||
- 检测源
|
||||
- 控制源
|
||||
- 检测脚本
|
||||
- 检测结果
|
||||
- 报告模板
|
||||
- 电能质量业务字典
|
||||
- 检测运行态 store
|
||||
- 检测业务接口层
|
||||
|
||||
## 10. 推荐执行顺序
|
||||
|
||||
1. 先确认激活能力是否保留。
|
||||
2. 再确定新的默认首页与登录后跳转页。
|
||||
3. 删除 `home / plan / machine` 页面模块。
|
||||
4. 删除对应业务接口目录与检测业务 store。
|
||||
5. 调整 `auth / mode / dynamicRouter / HOME_URL` 等入口逻辑。
|
||||
6. 最后联动清理后端菜单、权限、字典和动态路由来源。
|
||||
|
||||
## 11. 当前执行进度(2026-04-08)
|
||||
|
||||
### 11.1 已完成
|
||||
|
||||
- `frontend/src/views/home` 已删除
|
||||
- `frontend/src/views/plan` 已删除
|
||||
- `frontend/src/views/machine` 已删除
|
||||
- `frontend/src/views/system/template/index.vue` 已删除
|
||||
- `frontend/src/views/system/dictionary/dictPq/index.vue` 已删除
|
||||
- `frontend/src/views/system/base/index.vue` 已删除
|
||||
- `frontend/src/api/plan` 已删除
|
||||
- `frontend/src/api/device` 已删除
|
||||
- `frontend/src/api/home` 已删除
|
||||
- `frontend/src/api/result` 已删除
|
||||
- `frontend/src/api/check` 已删除
|
||||
- `frontend/src/stores/modules/check.ts` 已删除
|
||||
- `frontend/src/config/index.ts` 中 `HOME_URL` 已调整为 `/authority/user`
|
||||
- `frontend/src/views/login/components/LoginForm.vue` 登录后已跳转新的平台首页
|
||||
- `frontend/src/stores/modules/auth.ts` 已增加业务菜单过滤逻辑,用于屏蔽已下线页面对应菜单
|
||||
- `frontend/src/api/user/login/index.ts` 中残留的检测业务接口定义已删除
|
||||
- `frontend/src/stores/modules/mode.ts` 已删除,退出登录时不再清理检测模式/场景状态
|
||||
- `frontend/src/components/ImportExcel` 已删除
|
||||
- `frontend/src/components/ImportZip` 已删除
|
||||
- `frontend/src/views/authority/resource/index.vue` 中误留的业务权限标识已修正
|
||||
- `frontend/src/api/system/dictionary/dictData.ts` 业务静态字典样例已删除
|
||||
- `frontend/src/api/system/log/logData.ts` 业务日志样例已删除
|
||||
|
||||
### 11.2 进行中
|
||||
|
||||
- 后端菜单、权限、字典与接口若仍保留旧业务数据,前端仍需要依赖 `auth.ts` 中的过滤逻辑进行保护
|
||||
- 构建配置、全局类型、类型导入规范等历史工程问题仍存在,但不属于本轮业务裁剪直接目标
|
||||
|
||||
### 11.3 当前判断
|
||||
|
||||
- 当前前端裁剪已完成主体删除工作
|
||||
- 当前已完成一轮业务语义残留和无引用旧代码清理
|
||||
- 当前重点已转向联动验证和历史工程问题收尾
|
||||
- 在后端菜单与接口未同步彻底下线前,前端仍需保留动态菜单过滤作为保护措施
|
||||
569
doc/开发者指南_自己动手修改.md
Normal file
569
doc/开发者指南_自己动手修改.md
Normal file
@@ -0,0 +1,569 @@
|
||||
# 开发者指南 - 自己动手修改代码
|
||||
|
||||
本指南说明我帮您创建的所有文件、它们的作用,以及如何自己修改和调试。
|
||||
|
||||
---
|
||||
|
||||
## 📁 我创建的文件清单
|
||||
|
||||
### 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-process-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 MySQLProcessManager = require('./scripts/mysql-process-manager');
|
||||
const mysql = new MySQLProcessManager();
|
||||
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, 'CN_Tool_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-process-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\CN_Tool\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-process-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-process-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
|
||||
|
||||
|
||||
238
doc/打包前检查清单.md
Normal file
238
doc/打包前检查清单.md
Normal file
@@ -0,0 +1,238 @@
|
||||
# CN_Tool 打包前检查清单
|
||||
|
||||
## ✅ 文件检查
|
||||
|
||||
### 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-process-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 端口检测功能正常
|
||||
- [ ] 18093 端口检测功能正常
|
||||
- [ ] 7778 WebSocket 端口检测功能正常
|
||||
- [ ] 端口递增逻辑正确(被占用时自动+1)
|
||||
|
||||
### MySQL 进程(绿色包 - 进程模式)
|
||||
- [ ] MySQL 进程能正常启动(通过 spawn mysqld.exe)
|
||||
- [ ] 确认当前版本为进程模式,不依赖 MySQL Windows 服务
|
||||
- [ ] 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/CN_Tool`
|
||||
- 预期大小:650-800 MB
|
||||
|
||||
---
|
||||
|
||||
## ✅ 打包后测试
|
||||
|
||||
### 基础测试(绿色包 - 进程模式)
|
||||
- [ ] **无需管理员权限**,普通用户双击 exe 能正常启动 ✅
|
||||
- [ ] Loading 界面正常显示,显示启动步骤
|
||||
- [ ] 不会尝试安装 MySQL Windows 服务
|
||||
- [ ] **MySQL 进程自动启动**(任务管理器可见 mysqld.exe)
|
||||
- [ ] MySQL 随应用启动,退出后自动停止,不依赖开机自启
|
||||
- [ ] Spring Boot 自动启动(任务管理器可见 java.exe)
|
||||
- [ ] 主界面正常显示
|
||||
- [ ] 应用退出后,MySQL 和 Java 进程自动关闭 ✅
|
||||
|
||||
### 端口测试
|
||||
- [ ] 手动占用 3306,应用使用 3307
|
||||
- [ ] 手动占用 18093,应用使用 18094
|
||||
- [ ] 端口信息在 Loading 界面正确显示
|
||||
|
||||
### 数据目录测试
|
||||
- [ ] 数据目录自动创建在正确盘符
|
||||
- [ ] 所有子目录都创建成功
|
||||
- [ ] 配置文件路径正确
|
||||
|
||||
### 功能测试
|
||||
- [ ] 前端功能正常
|
||||
- [ ] 能连接到后端 API
|
||||
- [ ] 数据库操作正常
|
||||
|
||||
### 关闭测试(绿色包 - 进程模式)
|
||||
- [ ] 关闭应用正常
|
||||
- [ ] Spring Boot 进程已停止(检查任务管理器)
|
||||
- [ ] **MySQL 进程已停止**(检查任务管理器,不应残留 mysqld.exe)✅
|
||||
- [ ] ~~MySQL 服务继续运行~~(已废弃,新版本会自动清理进程)
|
||||
|
||||
### 移植测试
|
||||
- [ ] 移动到其他目录能运行
|
||||
- [ ] 在其他电脑上能运行
|
||||
- [ ] 在不同盘符上能运行
|
||||
|
||||
---
|
||||
|
||||
## ✅ 日志检查
|
||||
|
||||
打包后运行一次,检查日志:
|
||||
|
||||
### 日志位置
|
||||
```
|
||||
C:\Users\[用户名]\AppData\Roaming\CN_Tool\logs\
|
||||
├── 9100-YYYYMMDD.log # 应用日志
|
||||
├── 9100-core-YYYYMMDD.log # 核心日志
|
||||
└── 9100-error-YYYYMMDD.log # 错误日志
|
||||
```
|
||||
|
||||
### 检查内容
|
||||
- [ ] 端口检测日志正确
|
||||
- [ ] MySQL 进程启动日志正常
|
||||
- [ ] 日志中显示 mysqld.exe 启动与退出清理信息
|
||||
- [ ] Spring Boot 启动日志正常
|
||||
- [ ] 无严重错误
|
||||
|
||||
---
|
||||
|
||||
## ✅ 性能检查
|
||||
|
||||
- [ ] 启动时间 < 30 秒
|
||||
- [ ] Loading 界面流畅
|
||||
- [ ] 内存占用合理(< 1GB)
|
||||
- [ ] CPU 占用正常
|
||||
|
||||
---
|
||||
|
||||
## ✅ 用户体验
|
||||
|
||||
- [ ] Loading 提示信息清晰
|
||||
- [ ] 错误提示友好
|
||||
- [ ] 无明显卡顿
|
||||
- [ ] 界面美观
|
||||
|
||||
---
|
||||
|
||||
## 🐛 常见问题
|
||||
|
||||
### 打包失败
|
||||
- 检查 Node.js 版本(建议 16+)
|
||||
- 检查 npm 依赖是否完整
|
||||
- 检查磁盘空间(至少 5GB)
|
||||
|
||||
### MySQL 进程失败(绿色包 - 进程模式)
|
||||
- ~~检查是否以管理员身份运行~~(不再需要)✅
|
||||
- 检查 `mysql/bin/mysqld.exe` 是否存在
|
||||
- 检查端口是否被占用(应自动切换到其他端口)
|
||||
- 查看应用日志:`%APPDATA%/CN_Tool/logs/9100.log`
|
||||
- 查看 MySQL 错误日志:`mysql/data/*.err`
|
||||
- 检查是否有残留的 mysqld.exe 进程(任务管理器)
|
||||
|
||||
### Spring Boot 启动失败
|
||||
- 检查 JAR 包是否完整
|
||||
- 检查 JRE 是否正确
|
||||
- 检查 MySQL 是否已启动
|
||||
|
||||
---
|
||||
|
||||
## 📦 最终产物
|
||||
|
||||
```
|
||||
out/
|
||||
└── CN_Tool
|
||||
|
||||
运行后结构:
|
||||
├── CN_Tool.exe
|
||||
├── mysql/
|
||||
├── jre/
|
||||
├── java/
|
||||
└── resources/
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📝 分发清单
|
||||
|
||||
打包完成后准备:
|
||||
|
||||
1. **安装包**
|
||||
- `CN_Tool`
|
||||
|
||||
2. **用户文档**
|
||||
- 使用说明
|
||||
- 系统要求
|
||||
- 常见问题
|
||||
|
||||
3. **技术文档**
|
||||
- 部署说明
|
||||
- 配置说明
|
||||
- 故障排除
|
||||
|
||||
---
|
||||
|
||||
✅ 所有检查通过后即可分发!
|
||||
|
||||
---
|
||||
|
||||
南京灿能电气自动化有限公司
|
||||
2025-10-15
|
||||
|
||||
459
doc/生命周期描述.md
Normal file
459
doc/生命周期描述.md
Normal file
@@ -0,0 +1,459 @@
|
||||
# ElectronEgg 生命周期详解
|
||||
|
||||
本文档详细说明 ElectronEgg 框架的应用生命周期机制及其在项目中的实现。
|
||||
|
||||
## 生命周期流程图
|
||||
|
||||
```
|
||||
┌─────────────┐
|
||||
│ new │ 创建 ElectronEgg 实例
|
||||
└──────┬──────┘
|
||||
│
|
||||
┌──────▼──────┐
|
||||
│ ready │ core app 加载完成(ee-core 框架初始化)
|
||||
└──────┬──────┘
|
||||
│
|
||||
┌──────▼─────────────┐
|
||||
│ electronAppReady │ Electron app 加载完成
|
||||
└──────┬─────────────┘
|
||||
│
|
||||
├─────────────────┐
|
||||
│ │
|
||||
┌──────▼──────┐ ┌─────▼────────┐
|
||||
│ mainWindow │ │ windowReady │ 主窗口创建完成
|
||||
└──────┬──────┘ └─────▲────────┘
|
||||
│ │
|
||||
└─────────────────┘
|
||||
│
|
||||
┌──────▼──────┐
|
||||
│ running │ 应用运行中
|
||||
└──────┬──────┘
|
||||
│
|
||||
┌──────▼──────┐
|
||||
│beforeClose │ 退出之前触发
|
||||
└──────┬──────┘
|
||||
│
|
||||
┌──────▼──────┐
|
||||
│ quit │ 应用退出
|
||||
└─────────────┘
|
||||
```
|
||||
|
||||
## 生命周期钩子详解
|
||||
|
||||
### 1. new - 实例创建
|
||||
|
||||
**触发时机**:调用 `new ElectronEgg()` 时
|
||||
|
||||
**实现位置**:[electron/main.js](electron/main.js#L6)
|
||||
|
||||
```javascript
|
||||
const { ElectronEgg } = require('ee-core');
|
||||
const app = new ElectronEgg();
|
||||
```
|
||||
|
||||
**作用**:
|
||||
- 创建 ElectronEgg 应用实例
|
||||
- 初始化框架核心模块
|
||||
- 准备生命周期管理器
|
||||
|
||||
---
|
||||
|
||||
### 2. ready - 核心应用就绪
|
||||
|
||||
**触发时机**:ee-core 框架加载完成,Electron app 启动之前
|
||||
|
||||
**实现位置**:
|
||||
- 注册:[electron/main.js](electron/main.js#L10)
|
||||
- 实现:[electron/preload/lifecycle.js](electron/preload/lifecycle.js#L12-L14)
|
||||
|
||||
```javascript
|
||||
// 注册
|
||||
app.register("ready", life.ready);
|
||||
|
||||
// 实现
|
||||
async ready() {
|
||||
logger.info('[lifecycle] ready');
|
||||
// 在这里可以做:
|
||||
// - 初始化数据库连接
|
||||
// - 加载配置文件
|
||||
// - 初始化全局变量
|
||||
}
|
||||
```
|
||||
|
||||
**适用场景**:
|
||||
- ✅ 初始化数据库连接
|
||||
- ✅ 加载应用配置
|
||||
- ✅ 注册全局服务
|
||||
- ✅ 初始化日志系统
|
||||
- ❌ 不能操作窗口(窗口还未创建)
|
||||
|
||||
---
|
||||
|
||||
### 3. electronAppReady - Electron 应用就绪
|
||||
|
||||
**触发时机**:Electron 的 `app.ready` 事件触发后,主窗口创建之前
|
||||
|
||||
**实现位置**:
|
||||
- 注册:[electron/main.js](electron/main.js#L11)
|
||||
- 实现:[electron/preload/lifecycle.js](electron/preload/lifecycle.js#L19-L21)
|
||||
|
||||
```javascript
|
||||
// 注册
|
||||
app.register("electron-app-ready", life.electronAppReady);
|
||||
|
||||
// 实现
|
||||
async electronAppReady() {
|
||||
logger.info('[lifecycle] electron-app-ready');
|
||||
// 在这里可以做:
|
||||
// - 注册全局快捷键
|
||||
// - 设置应用菜单
|
||||
// - 初始化托盘图标
|
||||
// - 注册协议处理
|
||||
}
|
||||
```
|
||||
|
||||
**适用场景**:
|
||||
- ✅ 注册全局快捷键 (globalShortcut)
|
||||
- ✅ 创建应用菜单 (Menu)
|
||||
- ✅ 创建系统托盘 (Tray)
|
||||
- ✅ 注册自定义协议 (protocol)
|
||||
- ⚠️ 可以创建窗口,但通常在框架内部自动创建
|
||||
|
||||
---
|
||||
|
||||
### 4. mainWindow - 主窗口创建
|
||||
|
||||
**触发时机**:框架创建主窗口时(内部流程,不需要手动注册)
|
||||
|
||||
**说明**:
|
||||
- 这是框架内部自动执行的步骤
|
||||
- 根据 `electron/config/config.*.js` 中的 `windowsOption` 配置创建窗口
|
||||
- 窗口创建完成后会触发 `windowReady` 钩子
|
||||
|
||||
**配置示例**:
|
||||
```javascript
|
||||
// electron/config/config.default.js
|
||||
windowsOption: {
|
||||
width: 1200,
|
||||
height: 800,
|
||||
show: false, // 设置为 false 可实现无白屏启动
|
||||
webPreferences: {
|
||||
contextIsolation: false,
|
||||
nodeIntegration: true
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 5. windowReady - 窗口就绪
|
||||
|
||||
**触发时机**:主窗口创建完成,页面加载完毕
|
||||
|
||||
**实现位置**:
|
||||
- 注册:[electron/main.js](electron/main.js#L12)
|
||||
- 实现:[electron/preload/lifecycle.js](electron/preload/lifecycle.js#L26-L37)
|
||||
|
||||
```javascript
|
||||
// 注册
|
||||
app.register("window-ready", life.windowReady);
|
||||
|
||||
// 实现
|
||||
async windowReady() {
|
||||
logger.info('[lifecycle] window-ready');
|
||||
|
||||
// 延迟显示窗口,避免白屏
|
||||
const { windowsOption } = getConfig();
|
||||
if (windowsOption.show == false) {
|
||||
const win = getMainWindow();
|
||||
win.once('ready-to-show', () => {
|
||||
win.show(); // 显示窗口
|
||||
win.focus(); // 聚焦窗口
|
||||
})
|
||||
}
|
||||
|
||||
// 在这里可以做:
|
||||
// - 向渲染进程发送初始化数据
|
||||
// - 检查更新
|
||||
// - 加载用户配置
|
||||
}
|
||||
```
|
||||
|
||||
**适用场景**:
|
||||
- ✅ 操作主窗口 (show/hide/maximize 等)
|
||||
- ✅ 向渲染进程发送消息
|
||||
- ✅ 执行自动更新检查
|
||||
- ✅ 加载用户数据并同步到前端
|
||||
- ✅ 实现无白屏启动(配合 `show: false`)
|
||||
|
||||
---
|
||||
|
||||
### 6. running - 应用运行中
|
||||
|
||||
**触发时机**:窗口显示后,应用正常运行期间
|
||||
|
||||
**说明**:
|
||||
- 这不是一个独立的生命周期钩子
|
||||
- 表示应用的正常运行状态
|
||||
- 此时所有功能都可用
|
||||
|
||||
**可用操作**:
|
||||
- IPC 通信(前后端交互)
|
||||
- 业务逻辑处理
|
||||
- 数据库操作
|
||||
- 网络请求
|
||||
- 文件系统操作
|
||||
|
||||
---
|
||||
|
||||
### 7. beforeClose - 关闭前钩子
|
||||
|
||||
**触发时机**:用户点击关闭按钮或调用 `app.quit()` 之前
|
||||
|
||||
**实现位置**:
|
||||
- 注册:[electron/main.js](electron/main.js#L13)
|
||||
- 实现:[electron/preload/lifecycle.js](electron/preload/lifecycle.js#L42-L44)
|
||||
|
||||
```javascript
|
||||
// 注册
|
||||
app.register("before-close", life.beforeClose);
|
||||
|
||||
// 实现
|
||||
async beforeClose() {
|
||||
logger.info('[lifecycle] before-close');
|
||||
// 在这里可以做:
|
||||
// - 保存用户数据
|
||||
// - 关闭数据库连接
|
||||
// - 清理临时文件
|
||||
// - 释放系统资源
|
||||
// - 确认是否退出
|
||||
}
|
||||
```
|
||||
|
||||
**适用场景**:
|
||||
- ✅ 保存应用状态
|
||||
- ✅ 关闭数据库连接
|
||||
- ✅ 清理临时资源
|
||||
- ✅ 询问用户是否确认退出
|
||||
- ✅ 上传日志或统计数据
|
||||
|
||||
**阻止关闭示例**:
|
||||
```javascript
|
||||
async beforeClose(args, event) {
|
||||
const { dialog } = require('electron');
|
||||
const result = await dialog.showMessageBox({
|
||||
type: 'question',
|
||||
buttons: ['取消', '退出'],
|
||||
message: '确定要退出应用吗?'
|
||||
});
|
||||
|
||||
if (result.response === 0) {
|
||||
// 阻止关闭
|
||||
return false;
|
||||
}
|
||||
|
||||
// 允许关闭
|
||||
return true;
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 8. quit - 应用退出
|
||||
|
||||
**触发时机**:`beforeClose` 完成后,应用进程终止
|
||||
|
||||
**说明**:
|
||||
- 这是最终状态,不可逆
|
||||
- 所有资源清理应在 `beforeClose` 中完成
|
||||
- 退出后进程结束,无法执行代码
|
||||
|
||||
---
|
||||
|
||||
## 额外生命周期:preload
|
||||
|
||||
### preload - 预加载模块
|
||||
|
||||
**触发时机**:应用启动时,在所有其他钩子之前
|
||||
|
||||
**实现位置**:
|
||||
- 注册:[electron/main.js](electron/main.js#L16)
|
||||
- 实现:[electron/preload/index.js](electron/preload/index.js#L7-L9)
|
||||
|
||||
```javascript
|
||||
// 注册
|
||||
app.register("preload", preload);
|
||||
|
||||
// 实现
|
||||
function preload() {
|
||||
logger.info('[preload] load 1');
|
||||
// 在这里可以做:
|
||||
// - 加载环境变量
|
||||
// - 注册原生模块
|
||||
// - 设置全局异常处理
|
||||
}
|
||||
```
|
||||
|
||||
**适用场景**:
|
||||
- ✅ 加载环境变量
|
||||
- ✅ 注册 Node.js 原生模块
|
||||
- ✅ 设置全局错误处理
|
||||
- ✅ 初始化第三方 SDK
|
||||
|
||||
---
|
||||
|
||||
## 实际开发示例
|
||||
|
||||
### 示例 1:数据库初始化
|
||||
|
||||
```javascript
|
||||
// electron/preload/lifecycle.js
|
||||
const Database = require('better-sqlite3');
|
||||
let db;
|
||||
|
||||
class Lifecycle {
|
||||
async ready() {
|
||||
// 在 ready 钩子中初始化数据库
|
||||
const path = require('path');
|
||||
const dbPath = path.join(app.getPath('userData'), 'app.db');
|
||||
db = new Database(dbPath);
|
||||
logger.info('[lifecycle] database initialized');
|
||||
}
|
||||
|
||||
async beforeClose() {
|
||||
// 在关闭前关闭数据库连接
|
||||
if (db) {
|
||||
db.close();
|
||||
logger.info('[lifecycle] database closed');
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 示例 2:自动更新检查
|
||||
|
||||
```javascript
|
||||
// electron/preload/lifecycle.js
|
||||
const { autoUpdater } = require('electron-updater');
|
||||
|
||||
class Lifecycle {
|
||||
async windowReady() {
|
||||
// 窗口就绪后检查更新
|
||||
const { getMainWindow } = require('ee-core/electron');
|
||||
const win = getMainWindow();
|
||||
|
||||
autoUpdater.checkForUpdates();
|
||||
|
||||
autoUpdater.on('update-available', () => {
|
||||
win.webContents.send('update-available');
|
||||
});
|
||||
|
||||
logger.info('[lifecycle] update check started');
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 示例 3:托盘图标
|
||||
|
||||
```javascript
|
||||
// electron/preload/lifecycle.js
|
||||
const { Tray, Menu } = require('electron');
|
||||
let tray;
|
||||
|
||||
class Lifecycle {
|
||||
async electronAppReady() {
|
||||
// 在 Electron 就绪后创建托盘
|
||||
const path = require('path');
|
||||
const iconPath = path.join(__dirname, '../../public/images/tray-icon.png');
|
||||
|
||||
tray = new Tray(iconPath);
|
||||
const contextMenu = Menu.buildFromTemplate([
|
||||
{ label: '打开主窗口', click: () => {
|
||||
const { getMainWindow } = require('ee-core/electron');
|
||||
getMainWindow().show();
|
||||
}},
|
||||
{ label: '退出', click: () => {
|
||||
const { app } = require('electron');
|
||||
app.quit();
|
||||
}}
|
||||
]);
|
||||
|
||||
tray.setContextMenu(contextMenu);
|
||||
logger.info('[lifecycle] tray created');
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 示例 4:无白屏启动
|
||||
|
||||
```javascript
|
||||
// electron/config/config.default.js
|
||||
windowsOption: {
|
||||
width: 1200,
|
||||
height: 800,
|
||||
show: false, // 关键配置:初始不显示
|
||||
backgroundColor: '#ffffff'
|
||||
}
|
||||
|
||||
// electron/preload/lifecycle.js
|
||||
class Lifecycle {
|
||||
async windowReady() {
|
||||
// 页面加载完成后再显示,避免白屏
|
||||
const { getMainWindow } = require('ee-core/electron');
|
||||
const win = getMainWindow();
|
||||
|
||||
win.once('ready-to-show', () => {
|
||||
win.show();
|
||||
win.focus();
|
||||
});
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 生命周期执行顺序总结
|
||||
|
||||
```
|
||||
1. preload() # 预加载模块
|
||||
2. new ElectronEgg() # 创建应用实例
|
||||
3. ready() # 核心框架就绪
|
||||
4. electronAppReady() # Electron 就绪
|
||||
5. [创建主窗口] # 框架内部创建窗口
|
||||
6. windowReady() # 窗口就绪
|
||||
7. [应用运行中] # 正常运行状态
|
||||
8. beforeClose() # 关闭前钩子
|
||||
9. [应用退出] # 进程结束
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 注意事项
|
||||
|
||||
1. **异步支持**:所有生命周期钩子都支持 `async/await`,可以执行异步操作
|
||||
|
||||
2. **错误处理**:建议在每个钩子中添加 try-catch 错误处理
|
||||
|
||||
3. **顺序依赖**:不要在早期钩子中访问尚未初始化的资源(如在 `ready` 中操作窗口)
|
||||
|
||||
4. **性能优化**:避免在钩子中执行耗时操作,会阻塞应用启动
|
||||
|
||||
5. **资源清理**:在 `beforeClose` 中务必清理所有资源,避免内存泄漏
|
||||
|
||||
6. **日志记录**:建议在每个钩子中记录日志,方便排查问题
|
||||
|
||||
---
|
||||
|
||||
## 相关文件
|
||||
|
||||
- 生命周期注册:[electron/main.js](electron/main.js)
|
||||
- 生命周期实现:[electron/preload/lifecycle.js](electron/preload/lifecycle.js)
|
||||
- 预加载模块:[electron/preload/index.js](electron/preload/index.js)
|
||||
- 窗口配置:[electron/config/config.default.js](electron/config/config.default.js)
|
||||
|
||||
---
|
||||
|
||||
## 参考资源
|
||||
|
||||
- ElectronEgg 官方文档:https://www.kaka996.com/pages/987b1c/
|
||||
- Electron 官方文档:https://www.electronjs.org/zh/docs/latest/
|
||||
34
doc/管理员权限说明.md
Normal file
34
doc/管理员权限说明.md
Normal file
@@ -0,0 +1,34 @@
|
||||
# 管理员权限说明
|
||||
|
||||
当前版本采用**绿色包 + MySQL 进程模式**,**不需要管理员权限**。
|
||||
|
||||
## 当前结论
|
||||
|
||||
1. 双击 `CN_Tool.exe` 即可启动
|
||||
2. 无需管理员权限
|
||||
3. 无 UAC 弹窗
|
||||
4. 解压即用,完全绿色
|
||||
5. 仅在应用运行期间启动 MySQL
|
||||
|
||||
## 说明
|
||||
|
||||
- MySQL 和 Spring Boot 会在应用启动时自动启动
|
||||
- 退出应用时自动清理
|
||||
- 不注册 Windows 服务
|
||||
- 不依赖开机自启
|
||||
|
||||
## 为什么这样设计
|
||||
|
||||
- 需要管理员权限的启动方式对 C 端用户不稳定
|
||||
- 用户直接双击使用时,提权、授权或服务安装失败会导致启动失败
|
||||
- 因此当前版本统一采用无需授权的绿色包进程模式
|
||||
|
||||
---
|
||||
|
||||
## 📝 版本历史
|
||||
|
||||
| 日期 | 版本 | 说明 |
|
||||
|------|------|------|
|
||||
| 2025-12-01 | v2.0 | 改用进程模式,无需管理员权限 ✅ |
|
||||
| 2025-10-17 | v1.0 | 服务模式,需要管理员权限(已废弃)|
|
||||
|
||||
Reference in New Issue
Block a user