fdb2 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,260 +1,373 @@
1
1
  # 数据库管理工具
2
2
 
3
- 基于 TypeORM + Vue3 + Bootstrap5 构建的现代化数据库管理工具,仿 Navicat Premium 功能设计。
3
+ 一款轻量级、跨平台的数据库管理工具,支持多种数据库类型,提供类似 Navicat Premium 的使用体验。
4
4
 
5
- ## 功能特性
5
+ ## 快速开始
6
6
 
7
- ### 🔗 连接管理
8
- - 支持多种数据库类型:MySQL、PostgreSQL、SQLite、SQL Server、Oracle
9
- - 可视化连接配置界面
10
- - 连接测试和状态监控
11
- - 连接信息本地JSON存储
7
+ ### 安装
12
8
 
13
- ### 🏗️ 数据库结构
14
- - 数据库信息概览
15
- - 表结构详细查看
16
- - 列信息、索引、外键关系展示
17
- - 数据库大小和统计信息
9
+ ```bash
10
+ # 全局安装(推荐)
11
+ npm install -g fdb2
18
12
 
19
- ### 📊 数据操作
20
- - 表数据查看和分页
21
- - 条件查询和排序
22
- - 数据插入、编辑、删除
23
- - 数据导出(JSON、CSV格式)
13
+ # 或使用 yarn
14
+ yarn global add fdb2
24
15
 
25
- ### 💻 SQL查询
26
- - 代码编辑器风格SQL输入框
27
- - SQL语法格式化
28
- - 查询历史记录
29
- - 批量查询结果展示
16
+ # 或使用 pnpm
17
+ pnpm add -g fdb2
18
+ ```
30
19
 
31
- ## 项目结构
20
+ ### 启动服务
32
21
 
33
- ### 后端(MidwayJS + TypeORM)
34
- ```
35
- src/
36
- ├── model/ # 数据模型定义
37
- │ ├── connection.entity.ts # 连接配置实体
38
- │ └── database.entity.ts # 数据库信息实体
39
- ├── service/ # 业务服务层
40
- │ ├── connection.service.ts # 连接管理服务
41
- │ └── database.service.ts # 数据库操作服务
42
- └── controller/ # API控制器
43
- └── database.controller.ts # 数据库管理API
22
+ ```bash
23
+ # 启动数据库管理工具
24
+ fdb2 start
25
+
26
+ # 停止服务
27
+ fdb2 stop
28
+
29
+ # 查看服务状态
30
+ fdb2 status
31
+
32
+ # 重启服务
33
+ fdb2 restart
44
34
  ```
45
35
 
46
- ### 前端(Vue3 + Bootstrap5)
36
+ ### 访问应用
37
+
38
+ 启动服务后,在浏览器中打开:
47
39
  ```
48
- web/src/platform/database/ # 数据库管理模块
49
- ├── layout.vue # 主布局组件
50
- ├── index.vue # 首页仪表板
51
- ├── connections.vue # 连接管理页面
52
- ├── schemas.vue # 数据库结构页面
53
- ├── query.vue # SQL查询页面
54
- ├── table.vue # 表数据查看页面
55
- └── router.ts # 路由配置
56
-
57
- web/src/
58
- ├── service/database.ts # 前端API服务
59
- ├── typings/database.ts # TypeScript类型定义
60
- └── assets/database.css # 专用样式文件
40
+ http://localhost:3000
61
41
  ```
62
42
 
63
- ## 快速开始
43
+ ## 功能特性
64
44
 
65
- ### 1. 启动后端服务
66
- ```bash
67
- npm run dev:midway
68
- ```
45
+ ### 🔗 连接管理
46
+ - 支持 8 种数据库类型:MySQL、PostgreSQL、SQLite、SQL Server、Oracle、CockroachDB、MongoDB、SAP HANA
47
+ - 可视化连接配置界面,操作简单直观
48
+ - 一键测试连接,快速验证配置
49
+ - 连接信息本地安全存储,无需重复输入
69
50
 
70
- ### 2. 启动前端开发服务器
71
- ```bash
72
- npm run dev:vue
73
- ```
51
+ ### 🏗️ 数据库结构
52
+ - 清晰的数据库信息概览
53
+ - 详细的表结构查看
54
+ - 完整的列信息、索引、外键关系展示
55
+ - 实时显示数据库大小和统计信息
74
56
 
75
- ### 3. 访问应用
76
- 打开浏览器访问:`http://localhost:3000/database`
57
+ ### 📊 数据操作
58
+ - 表数据快速查看和分页浏览
59
+ - 灵活的条件查询和排序
60
+ - 便捷的数据插入、编辑、删除
61
+ - 支持导出数据为 JSON、CSV 格式
62
+
63
+ ### 💻 SQL查询
64
+ - 代码编辑器风格的 SQL 输入框
65
+ - SQL 语法格式化,提升可读性
66
+ - 自动保存查询历史记录
67
+ - 批量查询结果展示
68
+
69
+ ### 🎯 核心优势
70
+ - **零配置启动**:全局安装后即可使用,无需复杂配置
71
+ - **跨平台支持**:Windows、macOS、Linux 全平台兼容
72
+ - **轻量高效**:基于 Node.js,资源占用低
73
+ - **本地存储**:数据保存在本地,安全可靠
74
+ - **离线使用**:无需联网即可管理本地数据库
77
75
 
78
76
  ## 使用指南
79
77
 
80
78
  ### 添加数据库连接
81
79
 
82
- 1. 进入"连接管理"页面
83
- 2. 点击"新增连接"按钮
84
- 3. 填写连接信息:
85
- - 连接名称:自定义名称,便于识别
86
- - 数据库类型:选择对应的数据库类型
87
- - 主机地址:数据库服务器地址
88
- - 端口:数据库服务端口(会自动填充默认端口)
89
- - 数据库名称:要连接的数据库名
90
- - 用户名/密码:数据库认证信息
91
- 4. 点击"测试连接"验证配置
92
- 5. 保存连接配置
80
+ 1. 打开浏览器访问 `http://localhost:3000`
81
+ 2. 点击左侧导航的"连接管理"
82
+ 3. 点击"新增连接"按钮
83
+ 4. 填写连接信息:
84
+ - **连接名称**:自定义名称,便于识别(如:生产环境 MySQL)
85
+ - **数据库类型**:选择对应的数据库类型
86
+ - **主机地址**:数据库服务器地址(本地数据库使用 `localhost` 或 `127.0.0.1`)
87
+ - **端口**:数据库服务端口(会自动填充默认端口)
88
+ - **数据库名称**:要连接的数据库名
89
+ - **用户名/密码**:数据库认证信息
90
+ 5. 点击"测试连接"验证配置是否正确
91
+ 6. 保存连接配置
93
92
 
94
93
  ### 查看数据库结构
95
94
 
96
- 1. 进入"数据库结构"页面
95
+ 1. 在左侧导航选择"数据库结构"
97
96
  2. 选择已配置的数据库连接
98
97
  3. 选择要查看的数据库
99
98
  4. 浏览表列表和详细信息:
100
- - 表基本信息(行数、大小等)
101
- - 列定义(数据类型、约束等)
102
- - 索引信息
103
- - 外键关系
99
+ - **表基本信息**:行数、大小等统计信息
100
+ - **列定义**:数据类型、约束、默认值等
101
+ - **索引信息**:主键、唯一索引、普通索引
102
+ - **外键关系**:表之间的关联关系
104
103
 
105
- ### 数据操作
104
+ ### 查看和编辑表数据
106
105
 
107
106
  1. 在表列表中点击"数据"按钮
108
107
  2. 设置查询条件:
109
- - WHERE条件:过滤数据
110
- - 排序字段:指定排序方式
111
- - 每页显示:调整分页大小
112
- 3. 执行查询查看数据
108
+ - **WHERE 条件**:输入过滤条件(如:`id > 100`)
109
+ - **排序字段**:指定排序方式(如:`create_time DESC`)
110
+ - **每页显示**:调整分页大小(10/50/100/500)
111
+ 3. 点击"查询"按钮执行查询
113
112
  4. 支持的操作:
114
- - 查看数据详情
115
- - 编辑记录
116
- - 删除记录
117
- - 插入新数据
118
- - 导出数据
113
+ - **查看详情**:点击行查看完整数据
114
+ - **编辑记录**:修改数据后保存
115
+ - **删除记录**:删除不需要的数据
116
+ - **插入新数据**:点击"新增"按钮添加数据
117
+ - **导出数据**:选择 JSON 或 CSV 格式导出
119
118
 
120
- ### SQL查询
119
+ ### 执行 SQL 查询
121
120
 
122
- 1. 进入"SQL查询"页面
121
+ 1. 点击左侧导航的"SQL 查询"
123
122
  2. 选择数据库连接
124
- 3. 在编辑器中输入SQL语句
125
- 4. 功能特性:
126
- - Ctrl/Cmd + Enter 快速执行
127
- - SQL格式化美化
128
- - 查询历史记录
129
- - 结果导出功能
130
-
131
- ## 数据存储
132
-
133
- ### 连接配置存储
134
- - 位置:`data/connections.json`
135
- - 格式:JSON数组
136
- - 安全:密码明文存储(生产环境建议加密)
137
-
138
- ### 查询历史存储
139
- - 位置:浏览器LocalStorage
140
- - 键名:`db-query-history`
141
- - 数量限制:最多保存50条记录
142
-
143
- ## API接口
144
-
145
- ### 连接管理
146
- - `GET /api/database/connections` - 获取所有连接
147
- - `POST /api/database/connections` - 添加连接
148
- - `PUT /api/database/connections/:id` - 更新连接
149
- - `DELETE /api/database/connections/:id` - 删除连接
150
- - `POST /api/database/connections/test` - 测试连接
151
-
152
- ### 数据库操作
153
- - `GET /api/database/connections/:id/databases` - 获取数据库列表
154
- - `GET /api/database/connections/:id/databases/:name` - 获取数据库信息
155
- - `GET /api/database/connections/:id/databases/:name/tables` - 获取表列表
156
- - `GET /api/database/connections/:id/databases/:name/tables/:table` - 获取表信息
157
- - `GET /api/database/connections/:id/databases/:name/tables/:table/data` - 获取表数据
158
- - `POST /api/database/connections/:id/query` - 执行SQL查询
159
- - `GET /api/database/connections/:id/databases/:name/tables/:table/export` - 导出数据
160
-
161
- ## 技术栈
162
-
163
- ### 后端
164
- - **框架**: MidwayJS
165
- - **ORM**: TypeORM
166
- - **数据库**: 支持多种数据库类型
167
- - **语言**: TypeScript
168
-
169
- ### 前端
170
- - **框架**: Vue 3
171
- - **路由**: Vue Router 4
172
- - **状态管理**: Pinia
173
- - **UI框架**: Bootstrap 5
174
- - **图标**: Bootstrap Icons
175
- - **HTTP客户端**: Axios
176
- - **语言**: TypeScript
177
-
178
- ## 开发注意事项
179
-
180
- ### 后端开发
181
- - 服务类继承自`BaseService`
182
- - 使用`@Inject`和`@Provide`装饰器
183
- - 统一的错误处理机制
184
- - 数据库连接池管理
185
-
186
- ### 前端开发
187
- - 组件化设计,保持代码解耦
188
- - 使用TypeScript类型检查
189
- - 响应式设计,支持移动端
190
- - 统一的样式规范
191
-
192
- ### 安全考虑
193
- - SQL注入防护(使用参数化查询)
194
- - 连接信息安全存储
195
- - 权限验证(需要登录)
196
- - 敏感信息脱敏显示
197
-
198
- ## 扩展功能
199
-
200
- ### 计划中的功能
201
- - [ ] 数据库备份和恢复
202
- - [ ] 数据同步功能
203
- - [ ] 可视化查询构建器
204
- - [ ] 数据导入功能
205
- - [ ] 用户权限管理
206
- - [ ] 操作日志记录
207
- - [ ] 性能监控
208
- - [ ] 查询优化建议
209
-
210
- ### 自定义扩展
211
- - 可以通过添加新的数据库驱动支持更多数据库类型
212
- - 可以扩展前端组件添加更多数据可视化功能
213
- - 可以集成定时任务实现数据备份自动化
214
-
215
- ## 故障排除
216
-
217
- ### 常见问题
218
-
219
- 1. **连接失败**
220
- - 检查数据库服务是否运行
221
- - 验证网络连接和端口
222
- - 确认用户名密码正确
223
-
224
- 2. **查询超时**
225
- - 检查SQL语句是否正确
226
- - 考虑添加索引优化查询
227
- - 调整查询超时设置
228
-
229
- 3. **数据显示异常**
230
- - 确认数据编码设置
231
- - 检查字段类型映射
232
- - 验证数据完整性
233
-
234
- ### 日志查看
235
- - 后端日志:`logs/`目录下
236
- - 前端控制台:浏览器开发者工具
237
- - 网络请求:浏览器Network面板
238
-
239
- ## 贡献指南
240
-
241
- 1. Fork项目
242
- 2. 创建功能分支
243
- 3. 提交代码变更
244
- 4. 推送到分支
245
- 5. 创建Pull Request
246
-
247
- ## 许可证
248
-
249
- MIT License
250
-
251
- ## 联系方式
252
-
253
- 如有问题或建议,请通过以下方式联系:
254
- - 创建Issue
255
- - 发送邮件
256
- - 提交反馈
123
+ 3. 在编辑器中输入 SQL 语句
124
+ 4. 快捷操作:
125
+ - **Ctrl + Enter**(Windows)或 **Cmd + Enter**(Mac):快速执行
126
+ - 点击"格式化"按钮:美化 SQL 语句
127
+ - 查看历史记录:点击历史记录按钮选择之前的查询
128
+ 5. 查看查询结果,支持导出功能
129
+
130
+ ### 常用 SQL 示例
131
+
132
+ ```sql
133
+ -- 查询表前 10 条数据
134
+ SELECT * FROM table_name LIMIT 10;
135
+
136
+ -- 按条件查询
137
+ SELECT * FROM users WHERE status = 'active' ORDER BY created_at DESC;
138
+
139
+ -- 统计数据
140
+ SELECT COUNT(*) as total, status FROM users GROUP BY status;
141
+
142
+ -- 插入数据
143
+ INSERT INTO users (name, email, status) VALUES ('张三', 'zhangsan@example.com', 'active');
144
+
145
+ -- 更新数据
146
+ UPDATE users SET status = 'inactive' WHERE last_login < '2024-01-01';
147
+
148
+ -- 删除数据
149
+ DELETE FROM logs WHERE created_at < '2024-01-01';
150
+ ```
151
+
152
+ ## 数据存储位置
153
+
154
+ ### 连接配置
155
+ - **默认位置**:`~/.db-tool/connections.json`
156
+ - Windows: `C:\Users\用户名\.db-tool\connections.json`
157
+ - macOS/Linux: `/Users/用户名/.db-tool/connections.json` 或 `/home/用户名/.db-tool/connections.json`
158
+ - **自定义位置**:设置环境变量 `DB_TOOL_DATA_DIR`
159
+ ```bash
160
+ # Windows
161
+ set DB_TOOL_DATA_DIR=D:\mydata\dbtool
162
+
163
+ # macOS/Linux
164
+ export DB_TOOL_DATA_DIR=/path/to/custom/data
165
+ ```
166
+
167
+ ### 查询历史
168
+ - **存储位置**:浏览器 LocalStorage
169
+ - **自动保存**:每次执行查询后自动保存
170
+ - **数量限制**:最多保存 50 条记录
171
+
172
+ ## 支持的数据库类型
173
+
174
+ | 数据库类型 | 默认端口 | 特性 |
175
+ |-----------|---------|------|
176
+ | MySQL | 3306 | 支持存储过程、触发器、视图、全文搜索 |
177
+ | PostgreSQL | 5432 | 支持存储过程、触发器、视图、JSON 类型 |
178
+ | SQLite | - | 轻量级,文件型数据库,无需服务器 |
179
+ | SQL Server | 1433 | 微软数据库,支持存储过程、触发器、视图 |
180
+ | Oracle | 1521 | 企业级数据库,功能强大 |
181
+ | CockroachDB | 26257 | 分布式 SQL 数据库,兼容 PostgreSQL |
182
+ | MongoDB | 27017 | NoSQL 文档数据库 |
183
+ | SAP HANA | 39013 | 内存数据库,高性能分析 |
184
+
185
+ **兼容性说明**:
186
+ - MariaDB、TiDB 兼容 MySQL,选择 MySQL 类型即可
187
+ - Aurora MySQL 兼容 MySQL,选择 MySQL 类型即可
188
+ - Aurora PostgreSQL 兼容 PostgreSQL,选择 PostgreSQL 类型即可
189
+ - Better-SQLite3 兼容 SQLite,选择 SQLite 类型即可
190
+
191
+ ## 常见问题
192
+
193
+ ### 安装和启动
194
+
195
+ **Q: 安装后无法启动服务?**
196
+
197
+ A: 请检查以下几点:
198
+ 1. 确认已正确安装:`npm install -g fdb2`
199
+ 2. 检查 Node.js 版本(建议 v14 或更高):`node --version`
200
+ 3. 查看错误信息:`fdb2 start --verbose`
201
+ 4. 检查端口 3000 是否被占用:`netstat -ano | findstr :3000`(Windows)或 `lsof -i :3000`(Mac/Linux)
202
+
203
+ **Q: 如何更换端口?**
204
+
205
+ A: 可以通过环境变量设置端口:
206
+ ```bash
207
+ # Windows
208
+ set PORT=8080
209
+ fdb2 start
210
+
211
+ # Mac/Linux
212
+ PORT=8080 fdb2 start
213
+ ```
214
+
215
+ ### 连接问题
216
+
217
+ **Q: 连接数据库失败怎么办?**
218
+
219
+ A: 请按以下步骤排查:
220
+ 1. 确认数据库服务正在运行
221
+ 2. 检查网络连接和端口是否正确
222
+ 3. 验证用户名和密码是否正确
223
+ 4. 检查数据库是否允许远程连接
224
+ 5. 查看数据库防火墙设置
225
+
226
+ **Q: SQLite 数据库连接失败?**
227
+
228
+ A: SQLite 连接需要提供数据库文件路径:
229
+ - 绝对路径:`D:\data\mydb.sqlite`
230
+ - 相对路径:`./data/mydb.sqlite`(相对于数据目录)
231
+ - 确保文件存在且有读取权限
232
+
233
+ ### 数据操作
234
+
235
+ **Q: 查询结果为空?**
236
+
237
+ A: 可能的原因:
238
+ 1. 表中确实没有数据
239
+ 2. WHERE 条件过于严格
240
+ 3. 数据库名称或表名错误
241
+ 4. 查询权限不足
242
+
243
+ **Q: 无法编辑或删除数据?**
244
+
245
+ A: 请检查:
246
+ 1. 是否有足够的数据库权限
247
+ 2. 表是否有外键约束
248
+ 3. 数据是否被锁定
249
+ 4. 查看数据库错误日志
250
+
251
+ ### 性能问题
252
+
253
+ **Q: 查询速度很慢?**
254
+
255
+ A: 优化建议:
256
+ 1. 添加适当的索引
257
+ 2. 限制查询结果数量(使用 LIMIT)
258
+ 3. 避免使用 `SELECT *`,只查询需要的字段
259
+ 4. 优化 WHERE 条件
260
+ 5. 考虑分批处理大数据量
261
+
262
+ **Q: 数据库信息加载很慢?**
263
+
264
+ A: 可能的原因:
265
+ 1. 数据库中表数量过多
266
+ 2. 表数据量过大
267
+ 3. 网络延迟
268
+ 4. 数据库性能问题
269
+
270
+ ### 数据安全
271
+
272
+ **Q: 连接密码安全吗?**
273
+
274
+ A: 当前版本密码以明文形式存储在本地配置文件中。建议:
275
+ 1. 不要在公共电脑上保存敏感数据库连接
276
+ 2. 定期更换数据库密码
277
+ 3. 使用只读权限的账号进行日常操作
278
+ 4. 生产环境建议使用加密连接(SSL/TLS)
279
+
280
+ **Q: 如何备份数据库连接配置?**
281
+
282
+ A: 复制配置文件即可:
283
+ ```bash
284
+ # Windows
285
+ copy C:\Users\用户名\.db-tool\connections.json D:\backup\
286
+
287
+ # Mac/Linux
288
+ cp ~/.db-tool/connections.json ~/backup/
289
+ ```
290
+
291
+ ### 更新和卸载
292
+
293
+ **Q: 如何更新到最新版本?**
294
+
295
+ A: 重新安装即可:
296
+ ```bash
297
+ npm update -g fdb2
298
+ ```
299
+
300
+ **Q: 如何完全卸载?**
301
+
302
+ A: 执行以下步骤:
303
+ ```bash
304
+ # 卸载程序
305
+ npm uninstall -g fdb2
306
+
307
+ # 删除数据目录(可选,会删除所有连接配置)
308
+ # Windows
309
+ rmdir /s C:\Users\用户名\.db-tool
310
+
311
+ # Mac/Linux
312
+ rm -rf ~/.db-tool
313
+ ```
314
+
315
+ ## 高级技巧
316
+
317
+ ### 批量操作
318
+
319
+ **批量执行 SQL 文件:**
320
+ ```sql
321
+ -- 创建一个 .sql 文件
322
+ USE my_database;
323
+ UPDATE users SET status = 'active' WHERE id > 100;
324
+ DELETE FROM logs WHERE created_at < '2024-01-01';
325
+ ```
326
+
327
+ 然后在 SQL 查询页面复制粘贴执行。
328
+
329
+ ### 数据导出技巧
330
+
331
+ **导出特定字段:**
332
+ ```sql
333
+ SELECT id, name, email FROM users WHERE status = 'active';
334
+ ```
335
+
336
+ **导出并格式化数据:**
337
+ ```sql
338
+ SELECT
339
+ id,
340
+ name,
341
+ DATE_FORMAT(created_at, '%Y-%m-%d') as created_date
342
+ FROM users;
343
+ ```
344
+
345
+ ### 性能监控
346
+
347
+ **查看表大小:**
348
+ ```sql
349
+ -- MySQL
350
+ SELECT
351
+ table_name,
352
+ ROUND(((data_length + index_length) / 1024 / 1024), 2) AS size_mb
353
+ FROM information_schema.tables
354
+ WHERE table_schema = 'your_database';
355
+
356
+ -- PostgreSQL
357
+ SELECT
358
+ schemaname,
359
+ tablename,
360
+ pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) AS size
361
+ FROM pg_tables
362
+ WHERE schemaname = 'public';
363
+ ```
364
+
365
+ ## 获取帮助
366
+
367
+ - **GitHub Issues**: [提交问题](https://github.com/yourusername/fdb2/issues)
368
+ - **文档**: 查看在线文档
369
+ - **社区**: 加入用户交流群
257
370
 
258
371
  ---
259
372
 
260
- *本项目基于template脚手架构建,提供类似Navicat Premium的数据库管理体验。*
373
+ **享受使用数据库管理工具!如有任何问题,欢迎反馈。**
package/bin/fdb2.js CHANGED
@@ -32,37 +32,54 @@ switch (command) {
32
32
  function startProject() {
33
33
  console.log('Starting FDB2 project...');
34
34
 
35
+ // 检查 PID 文件是否存在,如果存在则说明服务器已经在运行
36
+ const pidFilePath = path.join(projectRoot, 'server.pid');
37
+ if (fs.existsSync(pidFilePath)) {
38
+ try {
39
+ const pid = parseInt(fs.readFileSync(pidFilePath, 'utf8'));
40
+ process.kill(pid, 0);
41
+ console.log('Server is already running with PID:', pid);
42
+ return;
43
+ } catch (error) {
44
+ if (error.code === 'ESRCH') {
45
+ console.log('Cleaning up stale PID file...');
46
+ fs.unlinkSync(pidFilePath);
47
+ }
48
+ }
49
+ }
50
+
35
51
  // 命令和参数
36
52
  let cmd, args;
37
53
 
38
- // 根据不同的操作系统选择不同的命令
39
- if (process.platform === 'win32') {
40
- // Windows 系统
41
- cmd = 'cmd.exe';
42
- args = ['/c', 'node', 'server.js', ...commandArgs];
43
- } else {
44
- // Linux/macOS 系统
45
- cmd = 'node';
46
- args = ['server.js', ...commandArgs];
47
- }
54
+ // 直接使用 node 命令启动服务器
55
+ cmd = 'node';
56
+ args = ['server.js', ...commandArgs];
48
57
 
49
58
  console.log('Executing:', cmd, args);
50
59
 
51
- // 使用 node 命令启动服务器
52
- const result = spawnSync(cmd, args, {
60
+ // 日志文件路径
61
+ const logFilePath = path.join(projectRoot, 'server.log');
62
+
63
+ // 创建日志文件的写入流
64
+ const out = fs.openSync(logFilePath, 'a');
65
+ const err = fs.openSync(logFilePath, 'a');
66
+
67
+ // 使用 node 命令启动服务器(异步,后台运行)
68
+ const child = spawn(cmd, args, {
53
69
  cwd: projectRoot,
54
- stdio: 'inherit'
70
+ detached: true,
71
+ stdio: ['ignore', out, err]
55
72
  });
56
73
 
57
- if (result.error) {
58
- console.error('Failed to start server:', result.error.message);
59
- process.exit(1);
60
- } else if (result.status === 0) {
61
- console.log('Server started successfully');
62
- } else {
63
- console.error('Failed to start server with code', result.status);
64
- process.exit(1);
65
- }
74
+ // 解除父子进程关联,让子进程在后台独立运行
75
+ child.unref();
76
+
77
+ // 保存 PID 到文件
78
+ fs.writeFileSync(pidFilePath, child.pid.toString());
79
+
80
+ console.log('Server started successfully with PID:', child.pid);
81
+ console.log('Server is running in the background');
82
+ console.log('Logs are written to:', logFilePath);
66
83
  }
67
84
 
68
85
  // 停止项目