fdb2 1.0.8 → 1.0.9
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/.dockerignore +21 -21
- package/.editorconfig +11 -11
- package/.eslintrc.cjs +14 -14
- package/.eslintrc.json +7 -7
- package/.prettierrc.js +3 -3
- package/.tpl.env +21 -21
- package/.vscodeignore +45 -45
- package/README.md +312 -312
- package/bin/build.sh +28 -28
- package/bin/deploy.sh +8 -8
- package/bin/dev.sh +10 -10
- package/bin/docker/dev-docker-compose.yml +43 -43
- package/bin/docker/dev.Dockerfile +24 -24
- package/bin/docker/prod-docker-compose.yml +17 -17
- package/bin/docker/prod.Dockerfile +29 -29
- package/bin/fdb2.js +220 -220
- package/dist/package.json +29 -29
- package/dist/pnpm-lock.yaml +1042 -354
- package/dist/public/explorer.css +1464 -1437
- package/dist/public/explorer.js +759 -223
- package/dist/public/index.css +1026 -1026
- package/dist/public/index.js +15 -9
- package/dist/public/layout.css +221 -221
- package/dist/public/layout.js +1 -1
- package/dist/public/vue.js +8 -2
- package/dist/scripts/preinstall.js +112 -112
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +8 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.ts +680 -671
- package/dist/server/model/connection.entity.ts +65 -65
- package/dist/server/model/database.entity.ts +245 -245
- package/dist/server/service/connection.service.d.ts +6 -1
- package/dist/server/service/connection.service.d.ts.map +1 -1
- package/dist/server/service/connection.service.js +15 -0
- package/dist/server/service/connection.service.js.map +1 -1
- package/dist/server/service/connection.service.ts +356 -341
- package/dist/server/service/database/base.service.d.ts +27 -0
- package/dist/server/service/database/base.service.d.ts.map +1 -1
- package/dist/server/service/database/base.service.js +17 -0
- package/dist/server/service/database/base.service.js.map +1 -1
- package/dist/server/service/database/base.service.ts +406 -367
- package/dist/server/service/database/cockroachdb.service.d.ts +16 -0
- package/dist/server/service/database/cockroachdb.service.d.ts.map +1 -1
- package/dist/server/service/database/cockroachdb.service.js +220 -154
- package/dist/server/service/database/cockroachdb.service.js.map +1 -1
- package/dist/server/service/database/cockroachdb.service.ts +871 -782
- package/dist/server/service/database/database.service.d.ts +4 -0
- package/dist/server/service/database/database.service.d.ts.map +1 -1
- package/dist/server/service/database/database.service.js +123 -0
- package/dist/server/service/database/database.service.js.map +1 -1
- package/dist/server/service/database/database.service.ts +775 -638
- package/dist/server/service/database/index.ts +6 -6
- package/dist/server/service/database/mongodb.service.d.ts +16 -0
- package/dist/server/service/database/mongodb.service.d.ts.map +1 -1
- package/dist/server/service/database/mongodb.service.js +35 -0
- package/dist/server/service/database/mongodb.service.js.map +1 -1
- package/dist/server/service/database/mongodb.service.ts +39 -1
- package/dist/server/service/database/mssql.service.d.ts +16 -0
- package/dist/server/service/database/mssql.service.d.ts.map +1 -1
- package/dist/server/service/database/mssql.service.js +168 -96
- package/dist/server/service/database/mssql.service.js.map +1 -1
- package/dist/server/service/database/mssql.service.ts +931 -840
- package/dist/server/service/database/mysql.service.d.ts +16 -0
- package/dist/server/service/database/mysql.service.d.ts.map +1 -1
- package/dist/server/service/database/mysql.service.js +189 -80
- package/dist/server/service/database/mysql.service.js.map +1 -1
- package/dist/server/service/database/mysql.service.ts +1025 -890
- package/dist/server/service/database/oracle.service.d.ts +16 -0
- package/dist/server/service/database/oracle.service.d.ts.map +1 -1
- package/dist/server/service/database/oracle.service.js +182 -120
- package/dist/server/service/database/oracle.service.js.map +1 -1
- package/dist/server/service/database/oracle.service.ts +1035 -959
- package/dist/server/service/database/postgres.service.d.ts +16 -0
- package/dist/server/service/database/postgres.service.d.ts.map +1 -1
- package/dist/server/service/database/postgres.service.js +154 -88
- package/dist/server/service/database/postgres.service.js.map +1 -1
- package/dist/server/service/database/postgres.service.ts +960 -871
- package/dist/server/service/database/sap.service.d.ts +16 -0
- package/dist/server/service/database/sap.service.d.ts.map +1 -1
- package/dist/server/service/database/sap.service.js +66 -0
- package/dist/server/service/database/sap.service.js.map +1 -1
- package/dist/server/service/database/sap.service.ts +89 -0
- package/dist/server/service/database/sqlite.service.d.ts +16 -0
- package/dist/server/service/database/sqlite.service.d.ts.map +1 -1
- package/dist/server/service/database/sqlite.service.js +77 -18
- package/dist/server/service/database/sqlite.service.js.map +1 -1
- package/dist/server/service/database/sqlite.service.ts +787 -708
- package/dist/server/service/session.service.ts +158 -158
- package/dist/view/index.html +38 -38
- package/env.d.ts +1 -1
- package/package.json +1 -1
- package/packages/vscode/.vscodeignore +44 -44
- package/packages/vscode/README.md +62 -62
- package/packages/vscode/out/database-services/cockroachdb.service.js +154 -154
- package/packages/vscode/out/database-services/mssql.service.js +96 -96
- package/packages/vscode/out/database-services/mysql.service.js +80 -80
- package/packages/vscode/out/database-services/oracle.service.js +120 -120
- package/packages/vscode/out/database-services/postgres.service.js +88 -88
- package/packages/vscode/out/database-services/sqlite.service.js +18 -18
- package/packages/vscode/out/provider/WebViewProvider.js +32 -32
- package/packages/vscode/package.json +142 -142
- package/packages/vscode/resources/icon.svg +5 -5
- package/packages/vscode/resources/webview/connection.css +41 -41
- package/packages/vscode/resources/webview/database.css +163 -163
- package/packages/vscode/resources/webview/index.html +9 -9
- package/packages/vscode/resources/webview/modules/header.tpl +13 -13
- package/packages/vscode/resources/webview/modules/initial_state.tpl +54 -54
- package/packages/vscode/resources/webview/query.css +104 -104
- package/packages/vscode/src/database-services/base.service.ts +362 -362
- package/packages/vscode/src/database-services/cockroachdb.service.ts +659 -659
- package/packages/vscode/src/database-services/connection.service.ts +340 -340
- package/packages/vscode/src/database-services/database.service.ts +629 -629
- package/packages/vscode/src/database-services/index.ts +6 -6
- package/packages/vscode/src/database-services/model/connection.entity.ts +65 -65
- package/packages/vscode/src/database-services/model/database.entity.ts +245 -245
- package/packages/vscode/src/database-services/mssql.service.ts +722 -722
- package/packages/vscode/src/database-services/mysql.service.ts +760 -760
- package/packages/vscode/src/database-services/oracle.service.ts +831 -831
- package/packages/vscode/src/database-services/postgres.service.ts +740 -740
- package/packages/vscode/src/database-services/sqlite.service.ts +558 -558
- package/packages/vscode/src/extension.ts +76 -76
- package/packages/vscode/src/provider/DatabaseTreeProvider.ts +167 -167
- package/packages/vscode/src/provider/WebViewProvider.ts +277 -277
- package/packages/vscode/src/service/DatabaseServiceBridge.ts +414 -414
- package/packages/vscode/src/typings/connection.ts +90 -90
- package/packages/vscode/tsconfig.json +21 -21
- package/public/index.html +9 -9
- package/public/modules/header.tpl +13 -13
- package/public/modules/initial_state.tpl +54 -54
- package/scripts/preinstall.js +112 -112
- package/server/index.ts +680 -671
- package/server/model/connection.entity.ts +65 -65
- package/server/model/database.entity.ts +245 -245
- package/server/service/connection.service.ts +356 -341
- package/server/service/database/base.service.ts +406 -367
- package/server/service/database/cockroachdb.service.ts +871 -782
- package/server/service/database/database.service.ts +775 -638
- package/server/service/database/index.ts +6 -6
- package/server/service/database/mongodb.service.ts +39 -1
- package/server/service/database/mssql.service.ts +931 -840
- package/server/service/database/mysql.service.ts +1025 -890
- package/server/service/database/oracle.service.ts +1035 -959
- package/server/service/database/postgres.service.ts +960 -871
- package/server/service/database/sap.service.ts +89 -0
- package/server/service/database/sqlite.service.ts +787 -708
- package/server/service/session.service.ts +158 -158
- package/server/tsconfig.json +20 -20
- package/server.js +149 -149
- package/server.pid +1 -0
- package/src/adapter/ajax.ts +135 -135
- package/src/assets/base.css +1 -1
- package/src/assets/database.css +949 -949
- package/src/assets/images/svg/illustrations/illustration-1.svg +1 -1
- package/src/assets/images/svg/illustrations/illustration-2.svg +2 -2
- package/src/assets/images/svg/illustrations/illustration-3.svg +50 -50
- package/src/assets/images/svg/illustrations/illustration-4.svg +1 -1
- package/src/assets/images/svg/illustrations/illustration-5.svg +73 -73
- package/src/assets/images/svg/illustrations/illustration-6.svg +89 -89
- package/src/assets/images/svg/illustrations/illustration-7.svg +39 -39
- package/src/assets/images/svg/separators/curve-2.svg +3 -3
- package/src/assets/images/svg/separators/curve.svg +3 -3
- package/src/assets/images/svg/separators/line.svg +3 -3
- package/src/assets/logo.svg +73 -73
- package/src/assets/main.css +1 -1
- package/src/base/config.ts +20 -20
- package/src/base/detect.ts +134 -134
- package/src/base/entity.ts +92 -92
- package/src/base/eventBus.ts +36 -36
- package/src/components/connection-editor/index.vue +588 -588
- package/src/components/dataGrid/index.vue +104 -104
- package/src/components/dataGrid/pagination.vue +105 -105
- package/src/components/loading/index.vue +42 -42
- package/src/components/modal/index.ts +180 -180
- package/src/components/modal/index.vue +560 -560
- package/src/components/toast/index.ts +43 -43
- package/src/components/toast/toast.vue +57 -57
- package/src/components/user/name.vue +103 -103
- package/src/components/user/selector.vue +416 -416
- package/src/domain/SysConfig.ts +74 -74
- package/src/platform/App.vue +7 -7
- package/src/platform/database/components/connection-detail.vue +1153 -1154
- package/src/platform/database/components/data-editor.vue +477 -477
- package/src/platform/database/components/database-detail.vue +1173 -1172
- package/src/platform/database/components/database-monitor.vue +1085 -1085
- package/src/platform/database/components/db-tools.vue +1264 -816
- package/src/platform/database/components/query-history.vue +1348 -1348
- package/src/platform/database/components/sql-executor.vue +737 -737
- package/src/platform/database/components/sql-query-editor.vue +1045 -1045
- package/src/platform/database/components/table-detail.vue +1375 -1376
- package/src/platform/database/components/table-editor.vue +916 -916
- package/src/platform/database/explorer.vue +1839 -1839
- package/src/platform/database/index.vue +1192 -1192
- package/src/platform/database/layout.vue +366 -366
- package/src/platform/database/router.ts +36 -36
- package/src/platform/database/styles/common.scss +601 -601
- package/src/platform/database/types/common.ts +444 -444
- package/src/platform/database/utils/export.ts +231 -231
- package/src/platform/database/utils/helpers.ts +436 -436
- package/src/platform/index.ts +32 -32
- package/src/platform/router.ts +40 -40
- package/src/platform/vscode/bridge.ts +121 -121
- package/src/platform/vscode/components/ConnectionPanel.vue +272 -272
- package/src/platform/vscode/components/DatabasePanel.vue +532 -532
- package/src/platform/vscode/components/QueryPanel.vue +371 -371
- package/src/platform/vscode/entry/connection.ts +13 -13
- package/src/platform/vscode/entry/database.ts +13 -13
- package/src/platform/vscode/entry/query.ts +13 -13
- package/src/platform/vscode/index.ts +5 -5
- package/src/service/base.ts +133 -127
- package/src/service/database.ts +505 -495
- package/src/service/login.ts +120 -120
- package/src/shims-vue.d.ts +6 -6
- package/src/stores/connection.ts +266 -266
- package/src/stores/session.ts +87 -87
- package/src/typings/database-types.ts +412 -412
- package/src/typings/database.ts +363 -363
- package/src/typings/global.d.ts +58 -58
- package/src/typings/pinia.d.ts +7 -7
- package/src/utils/clipboard.ts +29 -29
- package/src/utils/database-types.ts +242 -242
- package/src/utils/modal.ts +123 -123
- package/src/utils/request.ts +55 -55
- package/src/utils/sleep.ts +3 -3
- package/src/utils/toast.ts +73 -73
- package/src/utils/util.ts +171 -171
- package/src/utils/xlsx.ts +228 -228
- package/tsconfig.json +33 -33
- package/view/index.html +9 -9
- package/view/modules/header.tpl +13 -13
- package/view/modules/initial_state.tpl +19 -19
- package/vite.config.ts +424 -424
- package/vite.config.vscode.ts +47 -47
- package/fdb2.server.pid +0 -1
- package/server/backups/db_ai_breakout_2026-03-11T08-38-48-677Z.sql +0 -0
package/bin/fdb2.js
CHANGED
|
@@ -1,220 +1,220 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
const { exec, spawn, execSync, spawnSync } = require('child_process');
|
|
4
|
-
const path = require('path');
|
|
5
|
-
const fs = require('fs');
|
|
6
|
-
const net = require('net');
|
|
7
|
-
|
|
8
|
-
// 项目根目录
|
|
9
|
-
const projectRoot = path.resolve(__dirname, '..');
|
|
10
|
-
|
|
11
|
-
// 解析命令行参数
|
|
12
|
-
const args = process.argv.slice(2);
|
|
13
|
-
const command = args[0] || 'help';
|
|
14
|
-
const commandArgs = args.slice(1); // 获取除了命令之外的所有参数
|
|
15
|
-
|
|
16
|
-
// 处理不同的命令
|
|
17
|
-
switch (command) {
|
|
18
|
-
case 'start':
|
|
19
|
-
startProject();
|
|
20
|
-
break;
|
|
21
|
-
case 'stop':
|
|
22
|
-
stopProject();
|
|
23
|
-
break;
|
|
24
|
-
case 'restart':
|
|
25
|
-
restartProject();
|
|
26
|
-
break;
|
|
27
|
-
default:
|
|
28
|
-
showHelp();
|
|
29
|
-
break;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
// 检查端口是否可用
|
|
33
|
-
function isPortAvailable(port) {
|
|
34
|
-
return new Promise((resolve) => {
|
|
35
|
-
const server = net.createServer();
|
|
36
|
-
|
|
37
|
-
server.once('error', (err) => {
|
|
38
|
-
if (err.code === 'EADDRINUSE') {
|
|
39
|
-
resolve(false);
|
|
40
|
-
} else {
|
|
41
|
-
resolve(false);
|
|
42
|
-
}
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
server.once('listening', () => {
|
|
46
|
-
server.close();
|
|
47
|
-
resolve(true);
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
server.listen(port);
|
|
51
|
-
});
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
// 查找可用端口
|
|
55
|
-
async function findAvailablePort(startPort) {
|
|
56
|
-
let port = startPort;
|
|
57
|
-
let attempts = 0;
|
|
58
|
-
const maxAttempts = 100;
|
|
59
|
-
|
|
60
|
-
while (attempts < maxAttempts) {
|
|
61
|
-
const available = await isPortAvailable(port);
|
|
62
|
-
if (available) {
|
|
63
|
-
return port;
|
|
64
|
-
}
|
|
65
|
-
attempts++;
|
|
66
|
-
port++;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
throw new Error(`无法找到可用端口,已尝试 ${maxAttempts} 次`);
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
// 启动项目
|
|
73
|
-
async function startProject() {
|
|
74
|
-
console.log('Starting FDB2 project...');
|
|
75
|
-
|
|
76
|
-
// 检查 PID 文件是否存在,如果存在则说明服务器已经在运行
|
|
77
|
-
const pidFilePath = path.join(projectRoot, 'fdb2.server.pid');
|
|
78
|
-
if (fs.existsSync(pidFilePath)) {
|
|
79
|
-
try {
|
|
80
|
-
const pid = parseInt(fs.readFileSync(pidFilePath, 'utf8'));
|
|
81
|
-
process.kill(pid, 0);
|
|
82
|
-
console.log('Server is already running with PID:', pid);
|
|
83
|
-
return;
|
|
84
|
-
} catch (error) {
|
|
85
|
-
if (error.code === 'ESRCH') {
|
|
86
|
-
console.log('Cleaning up stale PID file...');
|
|
87
|
-
fs.unlinkSync(pidFilePath);
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
// 解析端口参数
|
|
93
|
-
let port = 9800;
|
|
94
|
-
const portIndex = commandArgs.findIndex(arg => arg === '-p' || arg === '--port');
|
|
95
|
-
if (portIndex !== -1 && commandArgs[portIndex + 1]) {
|
|
96
|
-
port = parseInt(commandArgs[portIndex + 1]);
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
// 查找可用端口
|
|
100
|
-
console.log(`Checking port ${port} availability...`);
|
|
101
|
-
try {
|
|
102
|
-
port = await findAvailablePort(port);
|
|
103
|
-
if (port !== parseInt(commandArgs[portIndex + 1] || 9800)) {
|
|
104
|
-
console.log(`Port ${commandArgs[portIndex + 1] || 9800} is in use, using port ${port} instead`);
|
|
105
|
-
}
|
|
106
|
-
} catch (error) {
|
|
107
|
-
console.error('Error:', error.message);
|
|
108
|
-
process.exit(1);
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
// 命令和参数
|
|
112
|
-
let cmd, args;
|
|
113
|
-
|
|
114
|
-
// 直接使用 node 命令启动服务器,传递端口参数
|
|
115
|
-
cmd = 'node';
|
|
116
|
-
args = ['server.js', '-p', port.toString()];
|
|
117
|
-
|
|
118
|
-
console.log('Executing:', cmd, args);
|
|
119
|
-
|
|
120
|
-
// 日志文件路径
|
|
121
|
-
const logFilePath = path.join(projectRoot, 'server.log');
|
|
122
|
-
|
|
123
|
-
// 创建日志文件的写入流
|
|
124
|
-
const out = fs.openSync(logFilePath, 'a');
|
|
125
|
-
const err = fs.openSync(logFilePath, 'a');
|
|
126
|
-
|
|
127
|
-
// 使用 node 命令启动服务器(异步,后台运行)
|
|
128
|
-
const child = spawn(cmd, args, {
|
|
129
|
-
cwd: projectRoot,
|
|
130
|
-
detached: true,
|
|
131
|
-
stdio: ['ignore', out, err]
|
|
132
|
-
});
|
|
133
|
-
|
|
134
|
-
// 解除父子进程关联,让子进程在后台独立运行
|
|
135
|
-
child.unref();
|
|
136
|
-
|
|
137
|
-
// 保存 PID 到文件
|
|
138
|
-
fs.writeFileSync(pidFilePath, child.pid.toString());
|
|
139
|
-
|
|
140
|
-
console.log('Logs are written to:', logFilePath);
|
|
141
|
-
console.log('Server started successfully with PID:', child.pid);
|
|
142
|
-
console.log('Server is running in the background');
|
|
143
|
-
console.log(`Server is running at http://localhost:${port}`);
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
// 停止项目
|
|
147
|
-
function stopProject() {
|
|
148
|
-
console.log('Stopping FDB2 project...');
|
|
149
|
-
|
|
150
|
-
// 读取 PID 文件
|
|
151
|
-
const pidFilePath = path.join(projectRoot, 'fdb2.server.pid');
|
|
152
|
-
|
|
153
|
-
if (!fs.existsSync(pidFilePath)) {
|
|
154
|
-
console.log('No server process found (PID file not exists)');
|
|
155
|
-
return;
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
try {
|
|
159
|
-
// 读取 PID
|
|
160
|
-
const pid = parseInt(fs.readFileSync(pidFilePath, 'utf8'));
|
|
161
|
-
console.log(`Stopping server process with PID: ${pid}`);
|
|
162
|
-
|
|
163
|
-
// 发送终止信号
|
|
164
|
-
process.kill(pid);
|
|
165
|
-
|
|
166
|
-
// 删除 PID 文件
|
|
167
|
-
fs.unlinkSync(pidFilePath);
|
|
168
|
-
console.log('Server stopped successfully');
|
|
169
|
-
} catch (error) {
|
|
170
|
-
// 如果进程不存在(ESRCH 错误),也删除 PID 文件
|
|
171
|
-
if (error.code === 'ESRCH') {
|
|
172
|
-
console.log('Server process not found, cleaning up PID file');
|
|
173
|
-
if (fs.existsSync(pidFilePath)) {
|
|
174
|
-
fs.unlinkSync(pidFilePath);
|
|
175
|
-
}
|
|
176
|
-
} else {
|
|
177
|
-
console.error('Failed to stop server:', error.message);
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
// 重启项目
|
|
183
|
-
function restartProject() {
|
|
184
|
-
console.log('Restarting FDB2 project...');
|
|
185
|
-
|
|
186
|
-
// 先停止当前运行的进程
|
|
187
|
-
try {
|
|
188
|
-
stopProject();
|
|
189
|
-
} catch (error) {
|
|
190
|
-
// 即使停止失败,也继续尝试启动新的进程
|
|
191
|
-
console.log('Continuing to start new server process...');
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
// 等待一段时间,确保进程已经停止
|
|
195
|
-
// 使用同步的方式等待
|
|
196
|
-
console.log('Waiting for server process to stop...');
|
|
197
|
-
for (let i = 0; i < 10; i++) {
|
|
198
|
-
// 检查 PID 文件是否存在
|
|
199
|
-
const pidFilePath = path.join(projectRoot, 'fdb2.server.pid');
|
|
200
|
-
if (!fs.existsSync(pidFilePath)) {
|
|
201
|
-
break;
|
|
202
|
-
}
|
|
203
|
-
// 等待 100 毫秒
|
|
204
|
-
Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 100);
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
// 启动新的进程
|
|
208
|
-
startProject();
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
// 显示帮助信息
|
|
212
|
-
function showHelp() {
|
|
213
|
-
console.log('FDB2 Database Tool');
|
|
214
|
-
console.log('');
|
|
215
|
-
console.log('Usage:');
|
|
216
|
-
console.log(' fdb2 start Start the project');
|
|
217
|
-
console.log(' fdb2 stop Stop the project');
|
|
218
|
-
console.log(' fdb2 restart Restart the project');
|
|
219
|
-
console.log('');
|
|
220
|
-
}
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
const { exec, spawn, execSync, spawnSync } = require('child_process');
|
|
4
|
+
const path = require('path');
|
|
5
|
+
const fs = require('fs');
|
|
6
|
+
const net = require('net');
|
|
7
|
+
|
|
8
|
+
// 项目根目录
|
|
9
|
+
const projectRoot = path.resolve(__dirname, '..');
|
|
10
|
+
|
|
11
|
+
// 解析命令行参数
|
|
12
|
+
const args = process.argv.slice(2);
|
|
13
|
+
const command = args[0] || 'help';
|
|
14
|
+
const commandArgs = args.slice(1); // 获取除了命令之外的所有参数
|
|
15
|
+
|
|
16
|
+
// 处理不同的命令
|
|
17
|
+
switch (command) {
|
|
18
|
+
case 'start':
|
|
19
|
+
startProject();
|
|
20
|
+
break;
|
|
21
|
+
case 'stop':
|
|
22
|
+
stopProject();
|
|
23
|
+
break;
|
|
24
|
+
case 'restart':
|
|
25
|
+
restartProject();
|
|
26
|
+
break;
|
|
27
|
+
default:
|
|
28
|
+
showHelp();
|
|
29
|
+
break;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// 检查端口是否可用
|
|
33
|
+
function isPortAvailable(port) {
|
|
34
|
+
return new Promise((resolve) => {
|
|
35
|
+
const server = net.createServer();
|
|
36
|
+
|
|
37
|
+
server.once('error', (err) => {
|
|
38
|
+
if (err.code === 'EADDRINUSE') {
|
|
39
|
+
resolve(false);
|
|
40
|
+
} else {
|
|
41
|
+
resolve(false);
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
server.once('listening', () => {
|
|
46
|
+
server.close();
|
|
47
|
+
resolve(true);
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
server.listen(port);
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// 查找可用端口
|
|
55
|
+
async function findAvailablePort(startPort) {
|
|
56
|
+
let port = startPort;
|
|
57
|
+
let attempts = 0;
|
|
58
|
+
const maxAttempts = 100;
|
|
59
|
+
|
|
60
|
+
while (attempts < maxAttempts) {
|
|
61
|
+
const available = await isPortAvailable(port);
|
|
62
|
+
if (available) {
|
|
63
|
+
return port;
|
|
64
|
+
}
|
|
65
|
+
attempts++;
|
|
66
|
+
port++;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
throw new Error(`无法找到可用端口,已尝试 ${maxAttempts} 次`);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// 启动项目
|
|
73
|
+
async function startProject() {
|
|
74
|
+
console.log('Starting FDB2 project...');
|
|
75
|
+
|
|
76
|
+
// 检查 PID 文件是否存在,如果存在则说明服务器已经在运行
|
|
77
|
+
const pidFilePath = path.join(projectRoot, 'fdb2.server.pid');
|
|
78
|
+
if (fs.existsSync(pidFilePath)) {
|
|
79
|
+
try {
|
|
80
|
+
const pid = parseInt(fs.readFileSync(pidFilePath, 'utf8'));
|
|
81
|
+
process.kill(pid, 0);
|
|
82
|
+
console.log('Server is already running with PID:', pid);
|
|
83
|
+
return;
|
|
84
|
+
} catch (error) {
|
|
85
|
+
if (error.code === 'ESRCH') {
|
|
86
|
+
console.log('Cleaning up stale PID file...');
|
|
87
|
+
fs.unlinkSync(pidFilePath);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// 解析端口参数
|
|
93
|
+
let port = 9800;
|
|
94
|
+
const portIndex = commandArgs.findIndex(arg => arg === '-p' || arg === '--port');
|
|
95
|
+
if (portIndex !== -1 && commandArgs[portIndex + 1]) {
|
|
96
|
+
port = parseInt(commandArgs[portIndex + 1]);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// 查找可用端口
|
|
100
|
+
console.log(`Checking port ${port} availability...`);
|
|
101
|
+
try {
|
|
102
|
+
port = await findAvailablePort(port);
|
|
103
|
+
if (port !== parseInt(commandArgs[portIndex + 1] || 9800)) {
|
|
104
|
+
console.log(`Port ${commandArgs[portIndex + 1] || 9800} is in use, using port ${port} instead`);
|
|
105
|
+
}
|
|
106
|
+
} catch (error) {
|
|
107
|
+
console.error('Error:', error.message);
|
|
108
|
+
process.exit(1);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// 命令和参数
|
|
112
|
+
let cmd, args;
|
|
113
|
+
|
|
114
|
+
// 直接使用 node 命令启动服务器,传递端口参数
|
|
115
|
+
cmd = 'node';
|
|
116
|
+
args = ['server.js', '-p', port.toString()];
|
|
117
|
+
|
|
118
|
+
console.log('Executing:', cmd, args);
|
|
119
|
+
|
|
120
|
+
// 日志文件路径
|
|
121
|
+
const logFilePath = path.join(projectRoot, 'server.log');
|
|
122
|
+
|
|
123
|
+
// 创建日志文件的写入流
|
|
124
|
+
const out = fs.openSync(logFilePath, 'a');
|
|
125
|
+
const err = fs.openSync(logFilePath, 'a');
|
|
126
|
+
|
|
127
|
+
// 使用 node 命令启动服务器(异步,后台运行)
|
|
128
|
+
const child = spawn(cmd, args, {
|
|
129
|
+
cwd: projectRoot,
|
|
130
|
+
detached: true,
|
|
131
|
+
stdio: ['ignore', out, err]
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
// 解除父子进程关联,让子进程在后台独立运行
|
|
135
|
+
child.unref();
|
|
136
|
+
|
|
137
|
+
// 保存 PID 到文件
|
|
138
|
+
fs.writeFileSync(pidFilePath, child.pid.toString());
|
|
139
|
+
|
|
140
|
+
console.log('Logs are written to:', logFilePath);
|
|
141
|
+
console.log('Server started successfully with PID:', child.pid);
|
|
142
|
+
console.log('Server is running in the background');
|
|
143
|
+
console.log(`Server is running at http://localhost:${port}`);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// 停止项目
|
|
147
|
+
function stopProject() {
|
|
148
|
+
console.log('Stopping FDB2 project...');
|
|
149
|
+
|
|
150
|
+
// 读取 PID 文件
|
|
151
|
+
const pidFilePath = path.join(projectRoot, 'fdb2.server.pid');
|
|
152
|
+
|
|
153
|
+
if (!fs.existsSync(pidFilePath)) {
|
|
154
|
+
console.log('No server process found (PID file not exists)');
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
try {
|
|
159
|
+
// 读取 PID
|
|
160
|
+
const pid = parseInt(fs.readFileSync(pidFilePath, 'utf8'));
|
|
161
|
+
console.log(`Stopping server process with PID: ${pid}`);
|
|
162
|
+
|
|
163
|
+
// 发送终止信号
|
|
164
|
+
process.kill(pid);
|
|
165
|
+
|
|
166
|
+
// 删除 PID 文件
|
|
167
|
+
fs.unlinkSync(pidFilePath);
|
|
168
|
+
console.log('Server stopped successfully');
|
|
169
|
+
} catch (error) {
|
|
170
|
+
// 如果进程不存在(ESRCH 错误),也删除 PID 文件
|
|
171
|
+
if (error.code === 'ESRCH') {
|
|
172
|
+
console.log('Server process not found, cleaning up PID file');
|
|
173
|
+
if (fs.existsSync(pidFilePath)) {
|
|
174
|
+
fs.unlinkSync(pidFilePath);
|
|
175
|
+
}
|
|
176
|
+
} else {
|
|
177
|
+
console.error('Failed to stop server:', error.message);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// 重启项目
|
|
183
|
+
function restartProject() {
|
|
184
|
+
console.log('Restarting FDB2 project...');
|
|
185
|
+
|
|
186
|
+
// 先停止当前运行的进程
|
|
187
|
+
try {
|
|
188
|
+
stopProject();
|
|
189
|
+
} catch (error) {
|
|
190
|
+
// 即使停止失败,也继续尝试启动新的进程
|
|
191
|
+
console.log('Continuing to start new server process...');
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// 等待一段时间,确保进程已经停止
|
|
195
|
+
// 使用同步的方式等待
|
|
196
|
+
console.log('Waiting for server process to stop...');
|
|
197
|
+
for (let i = 0; i < 10; i++) {
|
|
198
|
+
// 检查 PID 文件是否存在
|
|
199
|
+
const pidFilePath = path.join(projectRoot, 'fdb2.server.pid');
|
|
200
|
+
if (!fs.existsSync(pidFilePath)) {
|
|
201
|
+
break;
|
|
202
|
+
}
|
|
203
|
+
// 等待 100 毫秒
|
|
204
|
+
Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 100);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
// 启动新的进程
|
|
208
|
+
startProject();
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// 显示帮助信息
|
|
212
|
+
function showHelp() {
|
|
213
|
+
console.log('FDB2 Database Tool');
|
|
214
|
+
console.log('');
|
|
215
|
+
console.log('Usage:');
|
|
216
|
+
console.log(' fdb2 start Start the project');
|
|
217
|
+
console.log(' fdb2 stop Stop the project');
|
|
218
|
+
console.log(' fdb2 restart Restart the project');
|
|
219
|
+
console.log('');
|
|
220
|
+
}
|
package/dist/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "fdb2",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "commonjs",
|
|
6
6
|
"main": "view/index.html",
|
|
@@ -16,7 +16,6 @@
|
|
|
16
16
|
"icon": "public/favicon.ico"
|
|
17
17
|
},
|
|
18
18
|
"scripts": {
|
|
19
|
-
"preinstall": "node scripts/preinstall.js",
|
|
20
19
|
"start": "pm2 start server.js --name fdb2-server --disable-logs --",
|
|
21
20
|
"restart": "pm2 restart fdb2-server --disable-logs --",
|
|
22
21
|
"stop": "pm2 stop fdb2-server --",
|
|
@@ -39,42 +38,33 @@
|
|
|
39
38
|
},
|
|
40
39
|
"dependencies": {
|
|
41
40
|
"@fefeding/common": "^1.0.58",
|
|
42
|
-
"axios": "^1.13.
|
|
41
|
+
"axios": "^1.13.2",
|
|
43
42
|
"dayjs": "^1.11.19",
|
|
44
43
|
"express": "^5.2.1",
|
|
45
|
-
"mysql2": "^3.
|
|
46
|
-
"
|
|
47
|
-
"
|
|
44
|
+
"mysql2": "^3.15.3",
|
|
45
|
+
"pg": "^8.16.3",
|
|
46
|
+
"pm2": "^6.0.14",
|
|
48
47
|
"reflect-metadata": "^0.2.2",
|
|
49
48
|
"sqlite3": "^5.1.7",
|
|
50
|
-
"typeorm": "^0.3.
|
|
49
|
+
"typeorm": "^0.3.27"
|
|
51
50
|
},
|
|
52
51
|
"devDependencies": {
|
|
53
|
-
"@
|
|
54
|
-
"@
|
|
55
|
-
"@codemirror/lang-json": "^6.0.2",
|
|
56
|
-
"@codemirror/lang-sql": "^6.10.0",
|
|
57
|
-
"@codemirror/language": "^6.12.1",
|
|
58
|
-
"@codemirror/state": "^6.5.4",
|
|
59
|
-
"@codemirror/theme-one-dark": "^6.1.3",
|
|
60
|
-
"@codemirror/view": "^6.39.12",
|
|
61
|
-
"@fefeding/eventemitter": "^1.0.5",
|
|
62
|
-
"@fefeding/vite-nunjucks-plugin": "^1.0.2",
|
|
52
|
+
"@fefeding/eventemitter": "^1.0.4",
|
|
53
|
+
"@fefeding/vite-nunjucks-plugin": "^1.0.1",
|
|
63
54
|
"@popperjs/core": "^2.11.8",
|
|
64
55
|
"@rollup/pluginutils": "^5.3.0",
|
|
65
56
|
"@types/bootstrap": "^5.2.10",
|
|
66
57
|
"@types/jsdom": "^21.1.7",
|
|
67
|
-
"@types/node": "^24.10.
|
|
58
|
+
"@types/node": "^24.10.1",
|
|
68
59
|
"@types/vue": "^2.0.0",
|
|
69
|
-
"@vitejs/plugin-vue": "^6.0.
|
|
70
|
-
"@vitejs/plugin-vue-jsx": "^5.1.
|
|
60
|
+
"@vitejs/plugin-vue": "^6.0.2",
|
|
61
|
+
"@vitejs/plugin-vue-jsx": "^5.1.2",
|
|
71
62
|
"@vue/tsconfig": "^0.8.1",
|
|
72
63
|
"@vueuse/core": "^13.9.0",
|
|
73
64
|
"@zumer/snapdom": "^1.9.14",
|
|
74
|
-
"autoprefixer": "^10.4.
|
|
65
|
+
"autoprefixer": "^10.4.22",
|
|
75
66
|
"bootstrap": "^5.3.8",
|
|
76
67
|
"bootstrap-icons": "^1.13.1",
|
|
77
|
-
"codemirror": "^6.0.2",
|
|
78
68
|
"dotenv": "^17.2.3",
|
|
79
69
|
"echarts": "^6.0.0",
|
|
80
70
|
"exceljs": "^4.4.0",
|
|
@@ -82,22 +72,32 @@
|
|
|
82
72
|
"jsdom": "^26.1.0",
|
|
83
73
|
"jszip": "^3.10.1",
|
|
84
74
|
"nw": "^0.107.0",
|
|
85
|
-
"nw-builder": "^4.17.
|
|
75
|
+
"nw-builder": "^4.17.0",
|
|
86
76
|
"pinia": "^3.0.4",
|
|
87
77
|
"pinia-plugin-persistedstate": "^4.7.1",
|
|
88
78
|
"postcss": "^8.5.6",
|
|
89
|
-
"sass": "^1.
|
|
90
|
-
"tailwindcss": "^3.4.
|
|
79
|
+
"sass": "^1.94.2",
|
|
80
|
+
"tailwindcss": "^3.4.18",
|
|
91
81
|
"typescript": "^5.9.3",
|
|
92
|
-
"vconsole": "^3.15.1",
|
|
93
82
|
"vite": "latest",
|
|
94
83
|
"vite-plugin-files-copy": "^3.8.0",
|
|
95
84
|
"vitest": "^3.2.4",
|
|
96
|
-
"vue": "^3.5.
|
|
85
|
+
"vue": "^3.5.25",
|
|
97
86
|
"vue-json-pretty": "^2.6.0",
|
|
98
|
-
"vue-router": "^4.6.
|
|
99
|
-
"vue-tsc": "^3.
|
|
87
|
+
"vue-router": "^4.6.3",
|
|
88
|
+
"vue-tsc": "^3.1.5",
|
|
100
89
|
"vuex": "^4.1.0",
|
|
90
|
+
|
|
91
|
+
"@codemirror/commands": "^6.10.1",
|
|
92
|
+
"@codemirror/fold": "^0.19.4",
|
|
93
|
+
"@codemirror/lang-json": "^6.0.2",
|
|
94
|
+
"@codemirror/lang-sql": "^6.10.0",
|
|
95
|
+
"@codemirror/language": "^6.12.1",
|
|
96
|
+
"@codemirror/state": "^6.5.4",
|
|
97
|
+
"@codemirror/theme-one-dark": "^6.1.3",
|
|
98
|
+
"@codemirror/view": "^6.39.11",
|
|
99
|
+
"codemirror": "^6.0.2",
|
|
100
|
+
"vconsole": "^3.15.1",
|
|
101
101
|
"xlsx": "^0.18.5"
|
|
102
102
|
},
|
|
103
103
|
"bin": {
|