fdb2 1.0.16 → 1.0.18
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/dist/package.json +139 -0
- package/dist/pnpm-lock.yaml +7332 -0
- package/dist/public/.vite/manifest.json +129 -0
- package/dist/public/_plugin-vue_export-helper.js +12 -0
- package/dist/public/bootstrap-icons.woff +0 -0
- package/dist/public/bootstrap-icons.woff2 +0 -0
- package/dist/public/bootstrap.css +14152 -0
- package/dist/public/bootstrap.js +4717 -0
- package/dist/public/explorer.css +2542 -0
- package/dist/public/explorer.js +59004 -0
- package/dist/public/favicon.ico +0 -0
- package/dist/public/index.css +950 -0
- package/dist/public/index.js +614 -0
- package/dist/public/layout.css +318 -0
- package/dist/public/layout.js +35 -0
- package/dist/public/modal.css +150 -0
- package/dist/public/modal.js +4873 -0
- package/dist/public/rolldown-runtime.js +38 -0
- package/dist/public/vconsole.min.js +10355 -0
- package/dist/public/vue.js +6526 -0
- package/dist/scripts/nw-build.js +136 -0
- package/dist/scripts/nw-dev.js +67 -0
- package/dist/scripts/preinstall.js +112 -0
- package/dist/server/index.d.ts +2 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +607 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/index.ts +685 -0
- package/dist/server/model/connection.entity.d.ts +55 -0
- package/dist/server/model/connection.entity.d.ts.map +1 -0
- package/dist/server/model/connection.entity.js +59 -0
- package/dist/server/model/connection.entity.js.map +1 -0
- package/dist/server/model/connection.entity.ts +66 -0
- package/dist/server/model/database.entity.d.ts +203 -0
- package/dist/server/model/database.entity.d.ts.map +1 -0
- package/dist/server/model/database.entity.js +211 -0
- package/dist/server/model/database.entity.js.map +1 -0
- package/dist/server/model/database.entity.ts +246 -0
- package/dist/server/service/connection.service.d.ts +84 -0
- package/dist/server/service/connection.service.d.ts.map +1 -0
- package/dist/server/service/connection.service.js +369 -0
- package/dist/server/service/connection.service.js.map +1 -0
- package/dist/server/service/connection.service.ts +359 -0
- package/dist/server/service/database/base.service.d.ts +183 -0
- package/dist/server/service/database/base.service.d.ts.map +1 -0
- package/dist/server/service/database/base.service.js +253 -0
- package/dist/server/service/database/base.service.js.map +1 -0
- package/dist/server/service/database/base.service.ts +407 -0
- package/dist/server/service/database/cockroachdb.service.d.ts +116 -0
- package/dist/server/service/database/cockroachdb.service.d.ts.map +1 -0
- package/dist/server/service/database/cockroachdb.service.js +812 -0
- package/dist/server/service/database/cockroachdb.service.js.map +1 -0
- package/dist/server/service/database/cockroachdb.service.ts +871 -0
- package/dist/server/service/database/database.service.d.ts +495 -0
- package/dist/server/service/database/database.service.d.ts.map +1 -0
- package/dist/server/service/database/database.service.js +711 -0
- package/dist/server/service/database/database.service.js.map +1 -0
- package/dist/server/service/database/database.service.ts +776 -0
- package/dist/server/service/database/index.d.ts +8 -0
- package/dist/server/service/database/index.d.ts.map +1 -0
- package/dist/server/service/database/index.js +18 -0
- package/dist/server/service/database/index.js.map +1 -0
- package/dist/server/service/database/index.ts +7 -0
- package/dist/server/service/database/mongodb.service.d.ts +121 -0
- package/dist/server/service/database/mongodb.service.d.ts.map +1 -0
- package/dist/server/service/database/mongodb.service.js +502 -0
- package/dist/server/service/database/mongodb.service.js.map +1 -0
- package/dist/server/service/database/mongodb.service.ts +501 -0
- package/dist/server/service/database/mssql.service.d.ts +118 -0
- package/dist/server/service/database/mssql.service.d.ts.map +1 -0
- package/dist/server/service/database/mssql.service.js +871 -0
- package/dist/server/service/database/mssql.service.js.map +1 -0
- package/dist/server/service/database/mssql.service.ts +932 -0
- package/dist/server/service/database/mysql.service.d.ts +114 -0
- package/dist/server/service/database/mysql.service.d.ts.map +1 -0
- package/dist/server/service/database/mysql.service.js +960 -0
- package/dist/server/service/database/mysql.service.js.map +1 -0
- package/dist/server/service/database/mysql.service.ts +1026 -0
- package/dist/server/service/database/oracle.service.d.ts +126 -0
- package/dist/server/service/database/oracle.service.d.ts.map +1 -0
- package/dist/server/service/database/oracle.service.js +963 -0
- package/dist/server/service/database/oracle.service.js.map +1 -0
- package/dist/server/service/database/oracle.service.ts +1036 -0
- package/dist/server/service/database/postgres.service.d.ts +122 -0
- package/dist/server/service/database/postgres.service.d.ts.map +1 -0
- package/dist/server/service/database/postgres.service.js +882 -0
- package/dist/server/service/database/postgres.service.js.map +1 -0
- package/dist/server/service/database/postgres.service.ts +961 -0
- package/dist/server/service/database/sap.service.d.ts +115 -0
- package/dist/server/service/database/sap.service.d.ts.map +1 -0
- package/dist/server/service/database/sap.service.js +868 -0
- package/dist/server/service/database/sap.service.js.map +1 -0
- package/dist/server/service/database/sap.service.ts +922 -0
- package/dist/server/service/database/sqlite.service.d.ts +112 -0
- package/dist/server/service/database/sqlite.service.d.ts.map +1 -0
- package/dist/server/service/database/sqlite.service.js +723 -0
- package/dist/server/service/database/sqlite.service.js.map +1 -0
- package/dist/server/service/database/sqlite.service.ts +787 -0
- package/dist/server/service/session.service.ts +158 -0
- package/dist/view/index.html +48 -0
- package/package.json +3 -2
- package/scripts/nw-build.js +136 -0
- package/scripts/nw-dev.js +67 -0
- package/scripts/preinstall.js +112 -0
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { Provide, Scope, ScopeEnum, Config, Inject } from '@midwayjs/core';
|
|
2
|
+
import { ISessionService, TencentService } from '@cicctencent/midwayjs-base';
|
|
3
|
+
import { Session, GetLoginSessionReq, GetLoginSessionRes, LogoutReq, LogoutRes, LoginByWxReq, LoginByWxRsp, LoginByAccountReq, LoginByAccountRsp } from '@fefeding/common/dist/models/account/session';
|
|
4
|
+
|
|
5
|
+
@Provide('session:service')
|
|
6
|
+
@Scope(ScopeEnum.Request, { allowDowngrade: true })
|
|
7
|
+
export class SessionService extends ISessionService {
|
|
8
|
+
@Config('loginOption')
|
|
9
|
+
loginOption: any;
|
|
10
|
+
|
|
11
|
+
@Inject()
|
|
12
|
+
tencentService: TencentService;
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* 根据ID获取session
|
|
16
|
+
* 并判断session是否在有效期
|
|
17
|
+
* @param id token唯一
|
|
18
|
+
*/
|
|
19
|
+
async getLoginSession(id: string): Promise<Session> {
|
|
20
|
+
const req = new GetLoginSessionReq();
|
|
21
|
+
req.id = id;
|
|
22
|
+
const res = await this.requestBaseApi<GetLoginSessionRes>(req);
|
|
23
|
+
return res?.data || null;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* 下线
|
|
27
|
+
* @param id 需要下线的id或者session
|
|
28
|
+
*/
|
|
29
|
+
async logout(id: string): Promise<any> {
|
|
30
|
+
const req = new LogoutReq();
|
|
31
|
+
req.id = id;
|
|
32
|
+
const res = await this.requestBaseApi<LogoutRes>(req);
|
|
33
|
+
this.ctx.currentSession = null;
|
|
34
|
+
return res;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* 登录接口
|
|
39
|
+
* @param loginParams 登录参数
|
|
40
|
+
* @returns
|
|
41
|
+
*/
|
|
42
|
+
async loginByWx(loginParams: LoginByWxReq) {
|
|
43
|
+
const req = new LoginByWxReq();
|
|
44
|
+
req.fromJSON(loginParams);
|
|
45
|
+
const res = await this.requestBaseApi<LoginByWxRsp>(req);
|
|
46
|
+
return res;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* 帐号登陆
|
|
51
|
+
* @param loginParams
|
|
52
|
+
* @returns
|
|
53
|
+
*/
|
|
54
|
+
async loginByAccount(loginParams: LoginByAccountReq) {
|
|
55
|
+
loginParams.appId = '0';//this.baseServiceOption.appId?.toString() || '0';
|
|
56
|
+
|
|
57
|
+
const req = new LoginByAccountReq();
|
|
58
|
+
req.fromJSON(loginParams);
|
|
59
|
+
const res = await this.requestBaseApi<LoginByAccountRsp>(req);
|
|
60
|
+
return res;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* 用临时码登陆
|
|
65
|
+
* @param code 登陆临时码
|
|
66
|
+
* @returns
|
|
67
|
+
*/
|
|
68
|
+
async loginByCode(code: string) {
|
|
69
|
+
const res = await this.requestBaseApi('/api/session/loginByAuthCode', {
|
|
70
|
+
data: {
|
|
71
|
+
code
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
return res?.data || null;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* 生成临时登陆码
|
|
79
|
+
* @param id 登陆token
|
|
80
|
+
* @returns
|
|
81
|
+
*/
|
|
82
|
+
async createAuthCode(id: string) {
|
|
83
|
+
const res = await this.requestBaseApi('/api/session/createAuthCode', {
|
|
84
|
+
data: {
|
|
85
|
+
id
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
return res;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// 生成登陆用公众号二维码
|
|
92
|
+
// 先生成一个验证码,当用户扫码后,事件回调获取验证码后再生成session
|
|
93
|
+
async createWxLoginQrcode() {
|
|
94
|
+
|
|
95
|
+
const res = await this.requestBaseApi('/api/session/createWxLoginQrcode', {
|
|
96
|
+
data: {
|
|
97
|
+
appId: this.loginOption.wxAppId
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
//console.log(res);
|
|
101
|
+
return res;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// 验证码登陆
|
|
105
|
+
async loginByVerifyCode(code: string, appId?: number,prefix?: string) {
|
|
106
|
+
if(!code) throw Error('code不可为空');
|
|
107
|
+
appId = appId || this.loginOption.wxAppId;
|
|
108
|
+
|
|
109
|
+
const res = await this.requestBaseApi('/api/session/loginByVerifyCode', {
|
|
110
|
+
data: {
|
|
111
|
+
appId,
|
|
112
|
+
code,
|
|
113
|
+
prefix
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
return res;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// 更新用户信息
|
|
120
|
+
async updateUser(user: any) {
|
|
121
|
+
const userId = this.ctx.currentSession?.userId || 0;
|
|
122
|
+
if(!userId) return;
|
|
123
|
+
//console.log(loginParams, req);
|
|
124
|
+
const res = await this.requestBaseApi('/api/account/updateUser', {
|
|
125
|
+
data: {
|
|
126
|
+
user: {
|
|
127
|
+
...user,
|
|
128
|
+
id: userId,
|
|
129
|
+
}
|
|
130
|
+
},
|
|
131
|
+
params: {
|
|
132
|
+
token: this.ctx.currentSession?.id
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
console.log('updateUser', res);
|
|
136
|
+
return res;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// 上传头像图片
|
|
140
|
+
async uploadAvatar(file: any) {
|
|
141
|
+
|
|
142
|
+
const userId = this.ctx.currentSession?.userId || 0;
|
|
143
|
+
if(!userId) return;
|
|
144
|
+
|
|
145
|
+
let filename = file['filename'] as string || '1.png';
|
|
146
|
+
|
|
147
|
+
const key = `avator/${userId}/${filename}`;
|
|
148
|
+
|
|
149
|
+
const res = await this.tencentService.uploadCosFile(key, file.data);
|
|
150
|
+
console.log(res);
|
|
151
|
+
const user = {
|
|
152
|
+
id: userId,
|
|
153
|
+
avatar: res.url || key,
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
return await this.updateUser(user);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<base href="" />
|
|
6
|
+
<script type="text/template" id="__INITIAL_STATE__">
|
|
7
|
+
{{ data | dump | safe }}
|
|
8
|
+
</script>
|
|
9
|
+
<script type="text/template" id="__DEFAULTINITIAL_STATE__">
|
|
10
|
+
{"config":{"prefix":"","apiUrl":""},"sso":{"baseUrl":"","appId":2}}
|
|
11
|
+
</script>
|
|
12
|
+
<script>
|
|
13
|
+
function __get_templateJson(id) {
|
|
14
|
+
try {
|
|
15
|
+
var tag = document.getElementById(id);
|
|
16
|
+
var obj = JSON.parse(tag.innerHTML);
|
|
17
|
+
return obj;
|
|
18
|
+
}
|
|
19
|
+
catch (e) {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
var __INITIAL_STATE__ = __get_templateJson('__INITIAL_STATE__');
|
|
24
|
+
if(!__INITIAL_STATE__) __INITIAL_STATE__ = __get_templateJson('__DEFAULTINITIAL_STATE__');
|
|
25
|
+
</script>
|
|
26
|
+
<link rel="icon" href="/public/favicon.ico" />
|
|
27
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
28
|
+
<title>fdb2-数据库管理</title>
|
|
29
|
+
<meta name="description" content="{{description}}">
|
|
30
|
+
<script>
|
|
31
|
+
window.addEventListener('vite:preloadError', function (event) {
|
|
32
|
+
console.error(event);
|
|
33
|
+
});
|
|
34
|
+
</script>
|
|
35
|
+
<script type="module" crossorigin src="/public/index.js"></script>
|
|
36
|
+
<link rel="modulepreload" crossorigin href="/public/rolldown-runtime.js">
|
|
37
|
+
<link rel="modulepreload" crossorigin href="/public/_plugin-vue_export-helper.js">
|
|
38
|
+
<link rel="modulepreload" crossorigin href="/public/bootstrap.js">
|
|
39
|
+
<link rel="modulepreload" crossorigin href="/public/vue.js">
|
|
40
|
+
<link rel="modulepreload" crossorigin href="/public/modal.js">
|
|
41
|
+
<link rel="stylesheet" crossorigin href="/public/bootstrap.css">
|
|
42
|
+
<link rel="stylesheet" crossorigin href="/public/modal.css">
|
|
43
|
+
<link rel="stylesheet" crossorigin href="/public/index.css">
|
|
44
|
+
</head>
|
|
45
|
+
<body>
|
|
46
|
+
<div id="app" class="min-vh-100"></div>
|
|
47
|
+
</body>
|
|
48
|
+
</html>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "fdb2",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.18",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "commonjs",
|
|
6
6
|
"main": "view/index.html",
|
|
@@ -8,6 +8,8 @@
|
|
|
8
8
|
"bin/",
|
|
9
9
|
"public/",
|
|
10
10
|
"view/",
|
|
11
|
+
"dist/",
|
|
12
|
+
"scripts/",
|
|
11
13
|
"server.js",
|
|
12
14
|
"package.json",
|
|
13
15
|
"README.md"
|
|
@@ -26,7 +28,6 @@
|
|
|
26
28
|
"icon": "public/favicon.ico"
|
|
27
29
|
},
|
|
28
30
|
"scripts": {
|
|
29
|
-
"preinstall": "node scripts/preinstall.js",
|
|
30
31
|
"start": "pm2 start server.js --name fdb2-server --disable-logs --",
|
|
31
32
|
"restart": "pm2 restart fdb2-server --disable-logs --",
|
|
32
33
|
"stop": "pm2 stop fdb2-server --",
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
const nwbuilder = require('nw-builder');
|
|
2
|
+
const { resolve, join } = require('path');
|
|
3
|
+
const { copyFileSync, existsSync, readdirSync } = require('fs');
|
|
4
|
+
|
|
5
|
+
const projectRoot = resolve(__dirname, '..');
|
|
6
|
+
|
|
7
|
+
const args = process.argv.slice(2);
|
|
8
|
+
const targetPlatform = args.find(arg => arg.startsWith('--platform='))?.split('=')[1];
|
|
9
|
+
|
|
10
|
+
const supportedPlatforms = ['win', 'osx', 'linux'];
|
|
11
|
+
|
|
12
|
+
function getCurrentPlatform() {
|
|
13
|
+
const platform = process.platform;
|
|
14
|
+
if (platform === 'darwin') return ['osx'];
|
|
15
|
+
if (platform === 'linux') return ['linux'];
|
|
16
|
+
return ['win', 'linux'];
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function getAppConfig(platform) {
|
|
20
|
+
const config = {
|
|
21
|
+
icon: resolve(projectRoot, 'dist', 'public', 'favicon.ico')
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
if (platform === 'osx') {
|
|
25
|
+
config.LSApplicationCategoryType = 'public.app-category.productivity';
|
|
26
|
+
config.NSHumanReadableCopyright = 'Copyright © 2025';
|
|
27
|
+
config.NSLocalNetworkUsageDescription = '需要网络访问以连接数据库';
|
|
28
|
+
config.CFBundleIdentifier = 'com.fdb.database';
|
|
29
|
+
config.CFBundleName = '数据库管理工具';
|
|
30
|
+
config.CFBundleDisplayName = '数据库管理工具';
|
|
31
|
+
config.CFBundleShortVersionString = '1.0.1';
|
|
32
|
+
config.CFBundleVersion = '1.0.1';
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return config;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
async function buildPlatform(platform) {
|
|
39
|
+
const outDir = resolve(projectRoot, `release/fdb2-${platform}`);
|
|
40
|
+
console.log(`\n========================================`);
|
|
41
|
+
console.log(`开始构建 ${platform} 平台...`);
|
|
42
|
+
console.log(`========================================`);
|
|
43
|
+
|
|
44
|
+
const buildOptions = {
|
|
45
|
+
mode: 'build',
|
|
46
|
+
srcDir: resolve(projectRoot, 'dist'),
|
|
47
|
+
version: '0.78.1',
|
|
48
|
+
flavor: 'normal',
|
|
49
|
+
platform: platform,
|
|
50
|
+
arch: 'x64',
|
|
51
|
+
outDir: outDir,
|
|
52
|
+
cacheDir: resolve(projectRoot, 'nw-cache'),
|
|
53
|
+
downloadUrl: 'https://github.com/nwjs/nw.js/releases/download/v0.78.1',
|
|
54
|
+
zip: false,
|
|
55
|
+
logLevel: 'info',
|
|
56
|
+
glob: false,
|
|
57
|
+
app: getAppConfig(platform)
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
await nwbuilder.default(buildOptions);
|
|
61
|
+
|
|
62
|
+
const packagedPath = join(outDir, platform, 'x64', 'package.nw', 'node_modules');
|
|
63
|
+
if (existsSync(packagedPath)) {
|
|
64
|
+
console.log(`✅ ${platform} 应用程序已包含 node_modules 目录 (${readdirSync(packagedPath).length} 个包)`);
|
|
65
|
+
} else {
|
|
66
|
+
console.log(`⚠️ ${platform} 应用程序不包含 node_modules 目录`);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
console.log(`✅ ${platform} 平台构建完成 -> ${outDir}`);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
async function build() {
|
|
73
|
+
try {
|
|
74
|
+
console.log('开始构建 NW.js 应用...\n');
|
|
75
|
+
|
|
76
|
+
console.log('1. 构建 Vue 应用...');
|
|
77
|
+
const { execSync } = require('child_process');
|
|
78
|
+
execSync('npm run build', { stdio: 'inherit', cwd: projectRoot });
|
|
79
|
+
|
|
80
|
+
console.log('\n2. 复制 package.json 到 dist 目录...');
|
|
81
|
+
copyFileSync(
|
|
82
|
+
join(projectRoot, 'package.json'),
|
|
83
|
+
join(projectRoot, 'dist', 'package.json')
|
|
84
|
+
);
|
|
85
|
+
|
|
86
|
+
console.log('\n3. 安装 npm 依赖到 dist 目录...');
|
|
87
|
+
const distPath = resolve(projectRoot, 'dist');
|
|
88
|
+
execSync('pnpm install --only=production', {
|
|
89
|
+
stdio: 'inherit',
|
|
90
|
+
cwd: distPath
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
if (!existsSync(join(distPath, 'node_modules'))) {
|
|
94
|
+
throw new Error('npm install 失败');
|
|
95
|
+
}
|
|
96
|
+
console.log('npm 依赖安装成功\n');
|
|
97
|
+
|
|
98
|
+
console.log('4. 配置 NW.js 构建参数...');
|
|
99
|
+
|
|
100
|
+
let platformsToBuild = [];
|
|
101
|
+
|
|
102
|
+
if (targetPlatform) {
|
|
103
|
+
if (targetPlatform === 'all') {
|
|
104
|
+
platformsToBuild = supportedPlatforms;
|
|
105
|
+
console.log(`构建所有支持平台: ${supportedPlatforms.join(', ')}`);
|
|
106
|
+
} else if (supportedPlatforms.includes(targetPlatform)) {
|
|
107
|
+
platformsToBuild = [targetPlatform];
|
|
108
|
+
console.log(`构建指定平台: ${targetPlatform}`);
|
|
109
|
+
} else {
|
|
110
|
+
console.error(`不支持的平台: ${targetPlatform}`);
|
|
111
|
+
console.log(`支持的平台: ${supportedPlatforms.join(', ')} 或 all`);
|
|
112
|
+
process.exit(1);
|
|
113
|
+
}
|
|
114
|
+
} else {
|
|
115
|
+
platformsToBuild = getCurrentPlatform();
|
|
116
|
+
console.log(`未指定平台,自动使用当前平台: ${platformsToBuild}`);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
console.log(`输出目录: ${resolve(projectRoot, 'release')}`);
|
|
120
|
+
|
|
121
|
+
for (const platform of platformsToBuild) {
|
|
122
|
+
await buildPlatform(platform);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
console.log('\n========================================');
|
|
126
|
+
console.log('🎉 所有平台构建完成!');
|
|
127
|
+
console.log('========================================');
|
|
128
|
+
console.log(`输出目录: ${resolve(projectRoot, 'release')}`);
|
|
129
|
+
|
|
130
|
+
} catch (error) {
|
|
131
|
+
console.error('构建过程中出错:', error);
|
|
132
|
+
process.exit(1);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
build();
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
const { exec } = require('child_process');
|
|
2
|
+
const { createServer } = require('http');
|
|
3
|
+
const { join, resolve } = require('path');
|
|
4
|
+
|
|
5
|
+
const projectRoot = resolve(__dirname, '..');
|
|
6
|
+
|
|
7
|
+
// 启动 Vite 开发服务器
|
|
8
|
+
const viteProcess = exec('npm run dev', { cwd: projectRoot }, (error, stdout, stderr) => {
|
|
9
|
+
if (error) {
|
|
10
|
+
console.error(`执行 npm run dev 时出错: ${error}`);
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
console.log(`stdout: ${stdout}`);
|
|
14
|
+
console.error(`stderr: ${stderr}`);
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
viteProcess.stdout.on('data', (data) => {
|
|
18
|
+
console.log(data);
|
|
19
|
+
// 当 Vite 服务器启动成功后,启动 NW.js
|
|
20
|
+
if (data.includes('ready')) {
|
|
21
|
+
setTimeout(() => {
|
|
22
|
+
console.log('starting NW.js...', 'npx nw . --url=http://localhost:9300');
|
|
23
|
+
const nwProcess = exec('npx nw . --url=http://localhost:9300', { cwd: projectRoot }, (error, stdout, stderr) => {
|
|
24
|
+
if (error) {
|
|
25
|
+
console.error(`启动 NW.js 时出错: ${error}`);
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
console.log(`stdout: ${stdout}`);
|
|
29
|
+
console.error(`stderr: ${stderr}`);
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
nwProcess.stdout.on('data', (data) => {
|
|
33
|
+
console.log(data);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
nwProcess.stderr.on('data', (data) => {
|
|
37
|
+
console.error(data);
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
nwProcess.on('close', (code) => {
|
|
41
|
+
console.log(`NW.js 进程退出,代码: ${code}`);
|
|
42
|
+
viteProcess.kill();
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
// 处理退出信号
|
|
46
|
+
process.on('SIGINT', () => {
|
|
47
|
+
nwProcess.kill();
|
|
48
|
+
viteProcess.kill();
|
|
49
|
+
process.exit();
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
process.on('SIGTERM', () => {
|
|
53
|
+
nwProcess.kill();
|
|
54
|
+
viteProcess.kill();
|
|
55
|
+
process.exit();
|
|
56
|
+
});
|
|
57
|
+
}, 2000);
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
viteProcess.stderr.on('data', (data) => {
|
|
62
|
+
console.error(data);
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
viteProcess.on('close', (code) => {
|
|
66
|
+
console.log(`Vite 进程退出,代码: ${code}`);
|
|
67
|
+
});
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
const { execSync } = require('child_process');
|
|
2
|
+
const path = require('path');
|
|
3
|
+
const fs = require('fs');
|
|
4
|
+
const os = require('os');
|
|
5
|
+
|
|
6
|
+
console.log('Checking for running fdb2 instances...');
|
|
7
|
+
|
|
8
|
+
try {
|
|
9
|
+
let pid = null;
|
|
10
|
+
|
|
11
|
+
// 检查当前目录的 PID 文件
|
|
12
|
+
const currentDirPidPath = path.join(process.cwd(), 'fdb2.server.pid');
|
|
13
|
+
if (fs.existsSync(currentDirPidPath)) {
|
|
14
|
+
try {
|
|
15
|
+
pid = parseInt(fs.readFileSync(currentDirPidPath, 'utf8'));
|
|
16
|
+
process.kill(pid, 0);
|
|
17
|
+
console.log('Found running fdb2 instance with PID:', pid);
|
|
18
|
+
} catch (error) {
|
|
19
|
+
if (error.code !== 'ESRCH') {
|
|
20
|
+
throw error;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// 如果没有找到,尝试从全局安装目录查找
|
|
26
|
+
if (!pid) {
|
|
27
|
+
try {
|
|
28
|
+
const globalPath = execSync('npm root -g', { encoding: 'utf8' }).trim();
|
|
29
|
+
const globalPidPath = path.join(globalPath, 'fdb2', 'fdb2.server.pid');
|
|
30
|
+
|
|
31
|
+
if (fs.existsSync(globalPidPath)) {
|
|
32
|
+
try {
|
|
33
|
+
pid = parseInt(fs.readFileSync(globalPidPath, 'utf8'));
|
|
34
|
+
process.kill(pid, 0);
|
|
35
|
+
console.log('Found running fdb2 instance with PID:', pid);
|
|
36
|
+
} catch (error) {
|
|
37
|
+
if (error.code !== 'ESRCH') {
|
|
38
|
+
throw error;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
} catch (error) {
|
|
43
|
+
// 忽略全局路径查找失败
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// 如果找到了运行中的进程,尝试停止它
|
|
48
|
+
if (pid) {
|
|
49
|
+
console.log('Stopping fdb2...');
|
|
50
|
+
|
|
51
|
+
try {
|
|
52
|
+
if (os.platform() === 'win32') {
|
|
53
|
+
// Windows: 使用 taskkill
|
|
54
|
+
execSync(`taskkill /F /PID ${pid}`, { stdio: 'inherit' });
|
|
55
|
+
} else {
|
|
56
|
+
// Unix-like: 使用 kill
|
|
57
|
+
process.kill(pid, 'SIGTERM');
|
|
58
|
+
|
|
59
|
+
// 等待进程结束
|
|
60
|
+
let attempts = 0;
|
|
61
|
+
while (attempts < 10) {
|
|
62
|
+
try {
|
|
63
|
+
process.kill(pid, 0);
|
|
64
|
+
attempts++;
|
|
65
|
+
// 等待 100ms
|
|
66
|
+
Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 100);
|
|
67
|
+
} catch (error) {
|
|
68
|
+
if (error.code === 'ESRCH') {
|
|
69
|
+
// 进程已结束
|
|
70
|
+
break;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// 如果进程还在运行,强制终止
|
|
76
|
+
try {
|
|
77
|
+
process.kill(pid, 0);
|
|
78
|
+
process.kill(pid, 'SIGKILL');
|
|
79
|
+
} catch (error) {
|
|
80
|
+
if (error.code !== 'ESRCH') {
|
|
81
|
+
throw error;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
console.log('fdb2 stopped successfully');
|
|
87
|
+
} catch (stopError) {
|
|
88
|
+
console.warn('Failed to stop fdb2:', stopError.message);
|
|
89
|
+
console.warn('Please manually stop the fdb2 process before installation');
|
|
90
|
+
}
|
|
91
|
+
} else {
|
|
92
|
+
console.log('No running fdb2 instance found');
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// 清理 PID 文件
|
|
96
|
+
if (fs.existsSync(currentDirPidPath)) {
|
|
97
|
+
fs.unlinkSync(currentDirPidPath);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
try {
|
|
101
|
+
const globalPath = execSync('npm root -g', { encoding: 'utf8' }).trim();
|
|
102
|
+
const globalPidPath = path.join(globalPath, 'fdb2', 'fdb2.server.pid');
|
|
103
|
+
if (fs.existsSync(globalPidPath)) {
|
|
104
|
+
fs.unlinkSync(globalPidPath);
|
|
105
|
+
}
|
|
106
|
+
} catch (error) {
|
|
107
|
+
// 忽略全局路径清理失败
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
} catch (error) {
|
|
111
|
+
console.warn('Pre-install check failed:', error.message);
|
|
112
|
+
}
|