fdb2 1.0.7 → 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 +764 -226
- 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/server/backups/db_ai_breakout_2026-03-11T08-38-48-677Z.sql +0 -0
|
@@ -1,158 +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
|
-
}
|
|
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
|
+
}
|
package/server/tsconfig.json
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
{
|
|
2
|
-
"compilerOptions": {
|
|
3
|
-
"target": "ES2020",
|
|
4
|
-
"module": "CommonJS",
|
|
5
|
-
"moduleResolution": "Node",
|
|
6
|
-
"outDir": "./dist/server",
|
|
7
|
-
"rootDir": "./",
|
|
8
|
-
"strict": false,
|
|
9
|
-
"esModuleInterop": true,
|
|
10
|
-
"skipLibCheck": true,
|
|
11
|
-
"forceConsistentCasingInFileNames": true,
|
|
12
|
-
"declaration": true,
|
|
13
|
-
"declarationMap": true,
|
|
14
|
-
"sourceMap": true,
|
|
15
|
-
"noEmit": false,
|
|
16
|
-
"resolveJsonModule": true
|
|
17
|
-
},
|
|
18
|
-
"include": ["**/*"],
|
|
19
|
-
"exclude": ["**/__tests__/*", "**/*.spec.ts", "node_modules", "dist"]
|
|
20
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2020",
|
|
4
|
+
"module": "CommonJS",
|
|
5
|
+
"moduleResolution": "Node",
|
|
6
|
+
"outDir": "./dist/server",
|
|
7
|
+
"rootDir": "./",
|
|
8
|
+
"strict": false,
|
|
9
|
+
"esModuleInterop": true,
|
|
10
|
+
"skipLibCheck": true,
|
|
11
|
+
"forceConsistentCasingInFileNames": true,
|
|
12
|
+
"declaration": true,
|
|
13
|
+
"declarationMap": true,
|
|
14
|
+
"sourceMap": true,
|
|
15
|
+
"noEmit": false,
|
|
16
|
+
"resolveJsonModule": true
|
|
17
|
+
},
|
|
18
|
+
"include": ["**/*"],
|
|
19
|
+
"exclude": ["**/__tests__/*", "**/*.spec.ts", "node_modules", "dist"]
|
|
20
|
+
}
|
package/server.js
CHANGED
|
@@ -1,150 +1,150 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
const express = require('express');
|
|
4
|
-
const path = require('path');
|
|
5
|
-
const fs = require('fs');
|
|
6
|
-
|
|
7
|
-
// 预加载 sqlite3 模块,确保原生绑定文件能够正确加载
|
|
8
|
-
// 并将其缓存到全局模块缓存中,以便 dist/server/index.js 可以使用
|
|
9
|
-
try {
|
|
10
|
-
const sqlite3 = require('sqlite3');
|
|
11
|
-
console.log('SQLite3 module preloaded successfully');
|
|
12
|
-
|
|
13
|
-
// 将 sqlite3 模块添加到全局 require.cache 中
|
|
14
|
-
const Module = require('module');
|
|
15
|
-
const sqlite3Path = require.resolve('sqlite3');
|
|
16
|
-
|
|
17
|
-
// 修改模块解析函数,确保 sqlite3 从正确的路径加载
|
|
18
|
-
const originalResolveFilename = Module._resolveFilename;
|
|
19
|
-
Module._resolveFilename = function(request, parent) {
|
|
20
|
-
if (request === 'sqlite3') {
|
|
21
|
-
return sqlite3Path;
|
|
22
|
-
}
|
|
23
|
-
return originalResolveFilename.call(this, request, parent);
|
|
24
|
-
};
|
|
25
|
-
} catch (error) {
|
|
26
|
-
console.error('Warning: Failed to preload sqlite3 module:', error.message);
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
// 日志文件路径 - 使用绝对路径
|
|
30
|
-
const logFilePath = path.resolve(__dirname, 'server.log');
|
|
31
|
-
|
|
32
|
-
// 重定向控制台输出到日志文件
|
|
33
|
-
const logStream = fs.createWriteStream(logFilePath, { flags: 'a' });
|
|
34
|
-
|
|
35
|
-
// 保存原始的 console.log 和 console.error
|
|
36
|
-
const originalLog = console.log;
|
|
37
|
-
const originalError = console.error;
|
|
38
|
-
|
|
39
|
-
// 重写 console.log
|
|
40
|
-
console.log = function(...args) {
|
|
41
|
-
const output = args.join(' ') + '\n';
|
|
42
|
-
logStream.write(output);
|
|
43
|
-
originalLog.apply(console, args);
|
|
44
|
-
};
|
|
45
|
-
|
|
46
|
-
// 重写 console.error
|
|
47
|
-
console.error = function(...args) {
|
|
48
|
-
const output = args.join(' ') + '\n';
|
|
49
|
-
logStream.write(output);
|
|
50
|
-
originalError.apply(console, args);
|
|
51
|
-
};
|
|
52
|
-
|
|
53
|
-
// 创建 express 应用
|
|
54
|
-
const app = express();
|
|
55
|
-
|
|
56
|
-
// 静态文件目录
|
|
57
|
-
const staticDir = path.join(__dirname, 'dist');
|
|
58
|
-
|
|
59
|
-
// 解析 JSON 请求体
|
|
60
|
-
app.use(express.json());
|
|
61
|
-
|
|
62
|
-
// 设置 CORS 头
|
|
63
|
-
app.use((req, res, next) => {
|
|
64
|
-
res.setHeader('Access-Control-Allow-Origin', '*');
|
|
65
|
-
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
|
|
66
|
-
res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
|
|
67
|
-
next();
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
// 处理 API 请求
|
|
71
|
-
app.use('/api/', async (req, res, next) => {
|
|
72
|
-
if (req.method === 'POST') {
|
|
73
|
-
try {
|
|
74
|
-
const serverModule = require('./dist/server/index.js');
|
|
75
|
-
const handleDatabaseRoutes = serverModule.handleDatabaseRoutes;
|
|
76
|
-
|
|
77
|
-
// 调用 handleDatabaseRoutes 函数处理请求
|
|
78
|
-
const result = await handleDatabaseRoutes(req.originalUrl, req.body);
|
|
79
|
-
|
|
80
|
-
// 返回处理结果
|
|
81
|
-
res.status(200).json({
|
|
82
|
-
ret: 0,
|
|
83
|
-
msg: 'success',
|
|
84
|
-
data: result
|
|
85
|
-
});
|
|
86
|
-
} catch (error) {
|
|
87
|
-
console.error('API Error:', error);
|
|
88
|
-
res.status(500).json({
|
|
89
|
-
ret: 500,
|
|
90
|
-
msg: error.message || 'Internal server error'
|
|
91
|
-
});
|
|
92
|
-
}
|
|
93
|
-
} else {
|
|
94
|
-
next();
|
|
95
|
-
}
|
|
96
|
-
});
|
|
97
|
-
|
|
98
|
-
// 配置静态文件目录 - 只有 /public 请求指向 public 目录
|
|
99
|
-
app.use('/public', express.static(path.join(staticDir, 'public')));
|
|
100
|
-
|
|
101
|
-
// 所有未匹配的路由都指向 index.html
|
|
102
|
-
app.use((req, res) => {
|
|
103
|
-
const indexPath = path.join(staticDir, 'view', 'index.html');
|
|
104
|
-
res.sendFile(indexPath, (err) => {
|
|
105
|
-
if (err) {
|
|
106
|
-
res.status(500).send('Error loading index.html');
|
|
107
|
-
}
|
|
108
|
-
});
|
|
109
|
-
});
|
|
110
|
-
|
|
111
|
-
// 解析命令行参数获取端口
|
|
112
|
-
let portFromArgs;
|
|
113
|
-
for (let i = 0; i < process.argv.length; i++) {
|
|
114
|
-
if ((process.argv[i] === '--port' || process.argv[i] === '-p') && process.argv[i + 1]) {
|
|
115
|
-
portFromArgs = parseInt(process.argv[i + 1]);
|
|
116
|
-
break;
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
// 启动服务器
|
|
121
|
-
const PORT = portFromArgs || process.env.PORT || 9800;
|
|
122
|
-
app.listen(PORT, () => {
|
|
123
|
-
|
|
124
|
-
// 将 PID 写入 PID 文件
|
|
125
|
-
const pidFilePath = path.join(__dirname, 'fdb2.server.pid');
|
|
126
|
-
fs.writeFileSync(pidFilePath, process.pid.toString());
|
|
127
|
-
console.log(`PID ${process.pid} written to ${pidFilePath}`);
|
|
128
|
-
|
|
129
|
-
console.log(`Server is running on port ${PORT}`);
|
|
130
|
-
console.log(`http://localhost:${PORT}`);
|
|
131
|
-
});
|
|
132
|
-
|
|
133
|
-
// 处理进程退出事件,关闭日志流
|
|
134
|
-
process.on('exit', () => {
|
|
135
|
-
logStream.end();
|
|
136
|
-
});
|
|
137
|
-
|
|
138
|
-
// 处理未捕获的异常
|
|
139
|
-
process.on('uncaughtException', (err) => {
|
|
140
|
-
console.error('Uncaught exception:', err);
|
|
141
|
-
logStream.end();
|
|
142
|
-
process.exit(1);
|
|
143
|
-
});
|
|
144
|
-
|
|
145
|
-
// 处理未处理的 Promise 拒绝
|
|
146
|
-
process.on('unhandledRejection', (err) => {
|
|
147
|
-
console.error('Unhandled rejection:', err);
|
|
148
|
-
logStream.end();
|
|
149
|
-
process.exit(1);
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
const express = require('express');
|
|
4
|
+
const path = require('path');
|
|
5
|
+
const fs = require('fs');
|
|
6
|
+
|
|
7
|
+
// 预加载 sqlite3 模块,确保原生绑定文件能够正确加载
|
|
8
|
+
// 并将其缓存到全局模块缓存中,以便 dist/server/index.js 可以使用
|
|
9
|
+
try {
|
|
10
|
+
const sqlite3 = require('sqlite3');
|
|
11
|
+
console.log('SQLite3 module preloaded successfully');
|
|
12
|
+
|
|
13
|
+
// 将 sqlite3 模块添加到全局 require.cache 中
|
|
14
|
+
const Module = require('module');
|
|
15
|
+
const sqlite3Path = require.resolve('sqlite3');
|
|
16
|
+
|
|
17
|
+
// 修改模块解析函数,确保 sqlite3 从正确的路径加载
|
|
18
|
+
const originalResolveFilename = Module._resolveFilename;
|
|
19
|
+
Module._resolveFilename = function(request, parent) {
|
|
20
|
+
if (request === 'sqlite3') {
|
|
21
|
+
return sqlite3Path;
|
|
22
|
+
}
|
|
23
|
+
return originalResolveFilename.call(this, request, parent);
|
|
24
|
+
};
|
|
25
|
+
} catch (error) {
|
|
26
|
+
console.error('Warning: Failed to preload sqlite3 module:', error.message);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// 日志文件路径 - 使用绝对路径
|
|
30
|
+
const logFilePath = path.resolve(__dirname, 'server.log');
|
|
31
|
+
|
|
32
|
+
// 重定向控制台输出到日志文件
|
|
33
|
+
const logStream = fs.createWriteStream(logFilePath, { flags: 'a' });
|
|
34
|
+
|
|
35
|
+
// 保存原始的 console.log 和 console.error
|
|
36
|
+
const originalLog = console.log;
|
|
37
|
+
const originalError = console.error;
|
|
38
|
+
|
|
39
|
+
// 重写 console.log
|
|
40
|
+
console.log = function(...args) {
|
|
41
|
+
const output = args.join(' ') + '\n';
|
|
42
|
+
logStream.write(output);
|
|
43
|
+
originalLog.apply(console, args);
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
// 重写 console.error
|
|
47
|
+
console.error = function(...args) {
|
|
48
|
+
const output = args.join(' ') + '\n';
|
|
49
|
+
logStream.write(output);
|
|
50
|
+
originalError.apply(console, args);
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
// 创建 express 应用
|
|
54
|
+
const app = express();
|
|
55
|
+
|
|
56
|
+
// 静态文件目录
|
|
57
|
+
const staticDir = path.join(__dirname, 'dist');
|
|
58
|
+
|
|
59
|
+
// 解析 JSON 请求体
|
|
60
|
+
app.use(express.json());
|
|
61
|
+
|
|
62
|
+
// 设置 CORS 头
|
|
63
|
+
app.use((req, res, next) => {
|
|
64
|
+
res.setHeader('Access-Control-Allow-Origin', '*');
|
|
65
|
+
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
|
|
66
|
+
res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
|
|
67
|
+
next();
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
// 处理 API 请求
|
|
71
|
+
app.use('/api/', async (req, res, next) => {
|
|
72
|
+
if (req.method === 'POST') {
|
|
73
|
+
try {
|
|
74
|
+
const serverModule = require('./dist/server/index.js');
|
|
75
|
+
const handleDatabaseRoutes = serverModule.handleDatabaseRoutes;
|
|
76
|
+
|
|
77
|
+
// 调用 handleDatabaseRoutes 函数处理请求
|
|
78
|
+
const result = await handleDatabaseRoutes(req.originalUrl, req.body);
|
|
79
|
+
|
|
80
|
+
// 返回处理结果
|
|
81
|
+
res.status(200).json({
|
|
82
|
+
ret: 0,
|
|
83
|
+
msg: 'success',
|
|
84
|
+
data: result
|
|
85
|
+
});
|
|
86
|
+
} catch (error) {
|
|
87
|
+
console.error('API Error:', error);
|
|
88
|
+
res.status(500).json({
|
|
89
|
+
ret: 500,
|
|
90
|
+
msg: error.message || 'Internal server error'
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
} else {
|
|
94
|
+
next();
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
// 配置静态文件目录 - 只有 /public 请求指向 public 目录
|
|
99
|
+
app.use('/public', express.static(path.join(staticDir, 'public')));
|
|
100
|
+
|
|
101
|
+
// 所有未匹配的路由都指向 index.html
|
|
102
|
+
app.use((req, res) => {
|
|
103
|
+
const indexPath = path.join(staticDir, 'view', 'index.html');
|
|
104
|
+
res.sendFile(indexPath, (err) => {
|
|
105
|
+
if (err) {
|
|
106
|
+
res.status(500).send('Error loading index.html');
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
// 解析命令行参数获取端口
|
|
112
|
+
let portFromArgs;
|
|
113
|
+
for (let i = 0; i < process.argv.length; i++) {
|
|
114
|
+
if ((process.argv[i] === '--port' || process.argv[i] === '-p') && process.argv[i + 1]) {
|
|
115
|
+
portFromArgs = parseInt(process.argv[i + 1]);
|
|
116
|
+
break;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// 启动服务器
|
|
121
|
+
const PORT = portFromArgs || process.env.PORT || 9800;
|
|
122
|
+
app.listen(PORT, () => {
|
|
123
|
+
|
|
124
|
+
// 将 PID 写入 PID 文件
|
|
125
|
+
const pidFilePath = path.join(__dirname, 'fdb2.server.pid');
|
|
126
|
+
fs.writeFileSync(pidFilePath, process.pid.toString());
|
|
127
|
+
console.log(`PID ${process.pid} written to ${pidFilePath}`);
|
|
128
|
+
|
|
129
|
+
console.log(`Server is running on port ${PORT}`);
|
|
130
|
+
console.log(`http://localhost:${PORT}`);
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
// 处理进程退出事件,关闭日志流
|
|
134
|
+
process.on('exit', () => {
|
|
135
|
+
logStream.end();
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
// 处理未捕获的异常
|
|
139
|
+
process.on('uncaughtException', (err) => {
|
|
140
|
+
console.error('Uncaught exception:', err);
|
|
141
|
+
logStream.end();
|
|
142
|
+
process.exit(1);
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
// 处理未处理的 Promise 拒绝
|
|
146
|
+
process.on('unhandledRejection', (err) => {
|
|
147
|
+
console.error('Unhandled rejection:', err);
|
|
148
|
+
logStream.end();
|
|
149
|
+
process.exit(1);
|
|
150
150
|
});
|
package/server.pid
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
43286
|