fdb2 1.0.0
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 -0
- package/.editorconfig +11 -0
- package/.eslintrc.cjs +14 -0
- package/.eslintrc.json +7 -0
- package/.prettierrc.js +3 -0
- package/.tpl.env +22 -0
- package/README.md +260 -0
- package/bin/build.sh +28 -0
- package/bin/deploy.sh +8 -0
- package/bin/dev.sh +10 -0
- package/bin/docker/.env +4 -0
- package/bin/docker/dev-docker-compose.yml +43 -0
- package/bin/docker/dev.Dockerfile +24 -0
- package/bin/docker/prod-docker-compose.yml +17 -0
- package/bin/docker/prod.Dockerfile +29 -0
- package/bin/fdb2.js +142 -0
- package/data/connections.demo.json +32 -0
- package/env.d.ts +1 -0
- package/nw-build.js +120 -0
- package/nw-dev.js +65 -0
- package/package.json +114 -0
- package/public/favicon.ico +0 -0
- package/public/index.html +9 -0
- package/public/modules/header.tpl +14 -0
- package/public/modules/initial_state.tpl +55 -0
- package/server/index.ts +677 -0
- package/server/model/connection.entity.ts +66 -0
- package/server/model/database.entity.ts +246 -0
- package/server/service/connection.service.ts +334 -0
- package/server/service/database/base.service.ts +363 -0
- package/server/service/database/database.service.ts +510 -0
- package/server/service/database/index.ts +7 -0
- package/server/service/database/mssql.service.ts +723 -0
- package/server/service/database/mysql.service.ts +761 -0
- package/server/service/database/oracle.service.ts +839 -0
- package/server/service/database/postgres.service.ts +744 -0
- package/server/service/database/sqlite.service.ts +559 -0
- package/server/service/session.service.ts +158 -0
- package/server.js +128 -0
- package/src/adapter/ajax.ts +135 -0
- package/src/assets/base.css +1 -0
- package/src/assets/database.css +950 -0
- package/src/assets/images/collapse.png +0 -0
- package/src/assets/images/no-login.png +0 -0
- package/src/assets/images/svg/illustrations/illustration-1.svg +1 -0
- package/src/assets/images/svg/illustrations/illustration-2.svg +2 -0
- package/src/assets/images/svg/illustrations/illustration-3.svg +50 -0
- package/src/assets/images/svg/illustrations/illustration-4.svg +1 -0
- package/src/assets/images/svg/illustrations/illustration-5.svg +73 -0
- package/src/assets/images/svg/illustrations/illustration-6.svg +89 -0
- package/src/assets/images/svg/illustrations/illustration-7.svg +39 -0
- package/src/assets/images/svg/illustrations/illustration-8.svg +1 -0
- package/src/assets/images/svg/separators/curve-2.svg +3 -0
- package/src/assets/images/svg/separators/curve.svg +3 -0
- package/src/assets/images/svg/separators/line.svg +3 -0
- package/src/assets/images/theme/light/screen-1-1000x800.jpg +0 -0
- package/src/assets/images/theme/light/screen-2-1000x800.jpg +0 -0
- package/src/assets/login/bg.jpg +0 -0
- package/src/assets/login/bg.png +0 -0
- package/src/assets/login/left.jpg +0 -0
- package/src/assets/logo.svg +73 -0
- package/src/assets/logo.webp +0 -0
- package/src/assets/main.css +1 -0
- package/src/base/config.ts +20 -0
- package/src/base/detect.ts +134 -0
- package/src/base/entity.ts +92 -0
- package/src/base/eventBus.ts +37 -0
- package/src/base//345/237/272/347/241/200/345/261/202.md +7 -0
- package/src/components/connection-editor/index.vue +590 -0
- package/src/components/dataGrid/index.vue +105 -0
- package/src/components/dataGrid/pagination.vue +106 -0
- package/src/components/loading/index.vue +43 -0
- package/src/components/modal/index.ts +181 -0
- package/src/components/modal/index.vue +560 -0
- package/src/components/toast/index.ts +44 -0
- package/src/components/toast/toast.vue +58 -0
- package/src/components/user/name.vue +104 -0
- package/src/components/user/selector.vue +416 -0
- package/src/domain/SysConfig.ts +74 -0
- package/src/platform/App.vue +8 -0
- package/src/platform/database/components/connection-detail.vue +1154 -0
- package/src/platform/database/components/data-editor.vue +478 -0
- package/src/platform/database/components/data-import-export.vue +1602 -0
- package/src/platform/database/components/database-detail.vue +1173 -0
- package/src/platform/database/components/database-monitor.vue +1086 -0
- package/src/platform/database/components/db-tools.vue +577 -0
- package/src/platform/database/components/query-history.vue +1349 -0
- package/src/platform/database/components/sql-executor.vue +738 -0
- package/src/platform/database/components/sql-query-editor.vue +1046 -0
- package/src/platform/database/components/table-detail.vue +1376 -0
- package/src/platform/database/components/table-editor.vue +690 -0
- package/src/platform/database/explorer.vue +1840 -0
- package/src/platform/database/index.vue +1193 -0
- package/src/platform/database/layout.vue +367 -0
- package/src/platform/database/router.ts +37 -0
- package/src/platform/database/styles/common.scss +602 -0
- package/src/platform/database/types/common.ts +445 -0
- package/src/platform/database/utils/export.ts +232 -0
- package/src/platform/database/utils/helpers.ts +437 -0
- package/src/platform/index.ts +33 -0
- package/src/platform/router.ts +41 -0
- package/src/service/base.ts +128 -0
- package/src/service/database.ts +500 -0
- package/src/service/login.ts +121 -0
- package/src/shims-vue.d.ts +7 -0
- package/src/stores/connection.ts +266 -0
- package/src/stores/session.ts +87 -0
- package/src/typings/database-types.ts +413 -0
- package/src/typings/database.ts +364 -0
- package/src/typings/global.d.ts +58 -0
- package/src/typings/pinia.d.ts +8 -0
- package/src/utils/clipboard.ts +30 -0
- package/src/utils/database-types.ts +243 -0
- package/src/utils/modal.ts +124 -0
- package/src/utils/request.ts +55 -0
- package/src/utils/sleep.ts +4 -0
- package/src/utils/toast.ts +73 -0
- package/src/utils/util.ts +171 -0
- package/src/utils/xlsx.ts +228 -0
- package/tsconfig.json +33 -0
- package/tsconfig.server.json +19 -0
- package/view/index.html +9 -0
- package/view/modules/header.tpl +14 -0
- package/view/modules/initial_state.tpl +20 -0
- package/vite.config.ts +384 -0
package/.dockerignore
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
logs/
|
|
2
|
+
npm-debug.log
|
|
3
|
+
yarn-error.log
|
|
4
|
+
node_modules/
|
|
5
|
+
web/node_modules/
|
|
6
|
+
web/dist/
|
|
7
|
+
view/
|
|
8
|
+
package-lock.json
|
|
9
|
+
yarn.lock
|
|
10
|
+
coverage/
|
|
11
|
+
dist/
|
|
12
|
+
.idea/
|
|
13
|
+
run/
|
|
14
|
+
test/
|
|
15
|
+
.DS_Store
|
|
16
|
+
*.sw*
|
|
17
|
+
*.un~
|
|
18
|
+
.tsbuildinfo
|
|
19
|
+
.tsbuildinfo.*
|
|
20
|
+
*.tgz
|
|
21
|
+
view/
|
package/.editorconfig
ADDED
package/.eslintrc.cjs
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/* eslint-env node */
|
|
2
|
+
require('@rushstack/eslint-patch/modern-module-resolution')
|
|
3
|
+
|
|
4
|
+
module.exports = {
|
|
5
|
+
root: true,
|
|
6
|
+
'extends': [
|
|
7
|
+
'plugin:vue/vue3-essential',
|
|
8
|
+
'eslint:recommended',
|
|
9
|
+
'@vue/eslint-config-typescript'
|
|
10
|
+
],
|
|
11
|
+
parserOptions: {
|
|
12
|
+
ecmaVersion: 'latest'
|
|
13
|
+
}
|
|
14
|
+
}
|
package/.eslintrc.json
ADDED
package/.prettierrc.js
ADDED
package/.tpl.env
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
PORT=8000
|
|
2
|
+
APP_ID=2
|
|
3
|
+
API_KEY="2024@fefeding#"
|
|
4
|
+
BASE_SERVER_URL=
|
|
5
|
+
PREFIX=my-project
|
|
6
|
+
SSO_URL=
|
|
7
|
+
LOG_LEVEL=info
|
|
8
|
+
REMOTE_LOGGER_URL=
|
|
9
|
+
|
|
10
|
+
WHITE_DOMAINS=127.0.0.1,localhost
|
|
11
|
+
|
|
12
|
+
TITLE=登陆系统
|
|
13
|
+
|
|
14
|
+
DB_HOST=127.0.0.1
|
|
15
|
+
DB_PORT=3306
|
|
16
|
+
DB_USERNAME=root
|
|
17
|
+
DB_PASSWORD=123456
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
TENCENT_CREDENTIAL_SECRETID=
|
|
22
|
+
TENCENT_CREDENTIAL_SECRETKEY=
|
package/README.md
ADDED
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
# 数据库管理工具
|
|
2
|
+
|
|
3
|
+
基于 TypeORM + Vue3 + Bootstrap5 构建的现代化数据库管理工具,仿 Navicat Premium 功能设计。
|
|
4
|
+
|
|
5
|
+
## 功能特性
|
|
6
|
+
|
|
7
|
+
### 🔗 连接管理
|
|
8
|
+
- 支持多种数据库类型:MySQL、PostgreSQL、SQLite、SQL Server、Oracle
|
|
9
|
+
- 可视化连接配置界面
|
|
10
|
+
- 连接测试和状态监控
|
|
11
|
+
- 连接信息本地JSON存储
|
|
12
|
+
|
|
13
|
+
### 🏗️ 数据库结构
|
|
14
|
+
- 数据库信息概览
|
|
15
|
+
- 表结构详细查看
|
|
16
|
+
- 列信息、索引、外键关系展示
|
|
17
|
+
- 数据库大小和统计信息
|
|
18
|
+
|
|
19
|
+
### 📊 数据操作
|
|
20
|
+
- 表数据查看和分页
|
|
21
|
+
- 条件查询和排序
|
|
22
|
+
- 数据插入、编辑、删除
|
|
23
|
+
- 数据导出(JSON、CSV格式)
|
|
24
|
+
|
|
25
|
+
### 💻 SQL查询
|
|
26
|
+
- 代码编辑器风格SQL输入框
|
|
27
|
+
- SQL语法格式化
|
|
28
|
+
- 查询历史记录
|
|
29
|
+
- 批量查询结果展示
|
|
30
|
+
|
|
31
|
+
## 项目结构
|
|
32
|
+
|
|
33
|
+
### 后端(MidwayJS + TypeORM)
|
|
34
|
+
```
|
|
35
|
+
src/
|
|
36
|
+
├── model/ # 数据模型定义
|
|
37
|
+
│ ├── connection.entity.ts # 连接配置实体
|
|
38
|
+
│ └── database.entity.ts # 数据库信息实体
|
|
39
|
+
├── service/ # 业务服务层
|
|
40
|
+
│ ├── connection.service.ts # 连接管理服务
|
|
41
|
+
│ └── database.service.ts # 数据库操作服务
|
|
42
|
+
└── controller/ # API控制器
|
|
43
|
+
└── database.controller.ts # 数据库管理API
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### 前端(Vue3 + Bootstrap5)
|
|
47
|
+
```
|
|
48
|
+
web/src/platform/database/ # 数据库管理模块
|
|
49
|
+
├── layout.vue # 主布局组件
|
|
50
|
+
├── index.vue # 首页仪表板
|
|
51
|
+
├── connections.vue # 连接管理页面
|
|
52
|
+
├── schemas.vue # 数据库结构页面
|
|
53
|
+
├── query.vue # SQL查询页面
|
|
54
|
+
├── table.vue # 表数据查看页面
|
|
55
|
+
└── router.ts # 路由配置
|
|
56
|
+
|
|
57
|
+
web/src/
|
|
58
|
+
├── service/database.ts # 前端API服务
|
|
59
|
+
├── typings/database.ts # TypeScript类型定义
|
|
60
|
+
└── assets/database.css # 专用样式文件
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## 快速开始
|
|
64
|
+
|
|
65
|
+
### 1. 启动后端服务
|
|
66
|
+
```bash
|
|
67
|
+
npm run dev:midway
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### 2. 启动前端开发服务器
|
|
71
|
+
```bash
|
|
72
|
+
npm run dev:vue
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### 3. 访问应用
|
|
76
|
+
打开浏览器访问:`http://localhost:3000/database`
|
|
77
|
+
|
|
78
|
+
## 使用指南
|
|
79
|
+
|
|
80
|
+
### 添加数据库连接
|
|
81
|
+
|
|
82
|
+
1. 进入"连接管理"页面
|
|
83
|
+
2. 点击"新增连接"按钮
|
|
84
|
+
3. 填写连接信息:
|
|
85
|
+
- 连接名称:自定义名称,便于识别
|
|
86
|
+
- 数据库类型:选择对应的数据库类型
|
|
87
|
+
- 主机地址:数据库服务器地址
|
|
88
|
+
- 端口:数据库服务端口(会自动填充默认端口)
|
|
89
|
+
- 数据库名称:要连接的数据库名
|
|
90
|
+
- 用户名/密码:数据库认证信息
|
|
91
|
+
4. 点击"测试连接"验证配置
|
|
92
|
+
5. 保存连接配置
|
|
93
|
+
|
|
94
|
+
### 查看数据库结构
|
|
95
|
+
|
|
96
|
+
1. 进入"数据库结构"页面
|
|
97
|
+
2. 选择已配置的数据库连接
|
|
98
|
+
3. 选择要查看的数据库
|
|
99
|
+
4. 浏览表列表和详细信息:
|
|
100
|
+
- 表基本信息(行数、大小等)
|
|
101
|
+
- 列定义(数据类型、约束等)
|
|
102
|
+
- 索引信息
|
|
103
|
+
- 外键关系
|
|
104
|
+
|
|
105
|
+
### 数据操作
|
|
106
|
+
|
|
107
|
+
1. 在表列表中点击"数据"按钮
|
|
108
|
+
2. 设置查询条件:
|
|
109
|
+
- WHERE条件:过滤数据
|
|
110
|
+
- 排序字段:指定排序方式
|
|
111
|
+
- 每页显示:调整分页大小
|
|
112
|
+
3. 执行查询查看数据
|
|
113
|
+
4. 支持的操作:
|
|
114
|
+
- 查看数据详情
|
|
115
|
+
- 编辑记录
|
|
116
|
+
- 删除记录
|
|
117
|
+
- 插入新数据
|
|
118
|
+
- 导出数据
|
|
119
|
+
|
|
120
|
+
### SQL查询
|
|
121
|
+
|
|
122
|
+
1. 进入"SQL查询"页面
|
|
123
|
+
2. 选择数据库连接
|
|
124
|
+
3. 在编辑器中输入SQL语句
|
|
125
|
+
4. 功能特性:
|
|
126
|
+
- Ctrl/Cmd + Enter 快速执行
|
|
127
|
+
- SQL格式化美化
|
|
128
|
+
- 查询历史记录
|
|
129
|
+
- 结果导出功能
|
|
130
|
+
|
|
131
|
+
## 数据存储
|
|
132
|
+
|
|
133
|
+
### 连接配置存储
|
|
134
|
+
- 位置:`data/connections.json`
|
|
135
|
+
- 格式:JSON数组
|
|
136
|
+
- 安全:密码明文存储(生产环境建议加密)
|
|
137
|
+
|
|
138
|
+
### 查询历史存储
|
|
139
|
+
- 位置:浏览器LocalStorage
|
|
140
|
+
- 键名:`db-query-history`
|
|
141
|
+
- 数量限制:最多保存50条记录
|
|
142
|
+
|
|
143
|
+
## API接口
|
|
144
|
+
|
|
145
|
+
### 连接管理
|
|
146
|
+
- `GET /api/database/connections` - 获取所有连接
|
|
147
|
+
- `POST /api/database/connections` - 添加连接
|
|
148
|
+
- `PUT /api/database/connections/:id` - 更新连接
|
|
149
|
+
- `DELETE /api/database/connections/:id` - 删除连接
|
|
150
|
+
- `POST /api/database/connections/test` - 测试连接
|
|
151
|
+
|
|
152
|
+
### 数据库操作
|
|
153
|
+
- `GET /api/database/connections/:id/databases` - 获取数据库列表
|
|
154
|
+
- `GET /api/database/connections/:id/databases/:name` - 获取数据库信息
|
|
155
|
+
- `GET /api/database/connections/:id/databases/:name/tables` - 获取表列表
|
|
156
|
+
- `GET /api/database/connections/:id/databases/:name/tables/:table` - 获取表信息
|
|
157
|
+
- `GET /api/database/connections/:id/databases/:name/tables/:table/data` - 获取表数据
|
|
158
|
+
- `POST /api/database/connections/:id/query` - 执行SQL查询
|
|
159
|
+
- `GET /api/database/connections/:id/databases/:name/tables/:table/export` - 导出数据
|
|
160
|
+
|
|
161
|
+
## 技术栈
|
|
162
|
+
|
|
163
|
+
### 后端
|
|
164
|
+
- **框架**: MidwayJS
|
|
165
|
+
- **ORM**: TypeORM
|
|
166
|
+
- **数据库**: 支持多种数据库类型
|
|
167
|
+
- **语言**: TypeScript
|
|
168
|
+
|
|
169
|
+
### 前端
|
|
170
|
+
- **框架**: Vue 3
|
|
171
|
+
- **路由**: Vue Router 4
|
|
172
|
+
- **状态管理**: Pinia
|
|
173
|
+
- **UI框架**: Bootstrap 5
|
|
174
|
+
- **图标**: Bootstrap Icons
|
|
175
|
+
- **HTTP客户端**: Axios
|
|
176
|
+
- **语言**: TypeScript
|
|
177
|
+
|
|
178
|
+
## 开发注意事项
|
|
179
|
+
|
|
180
|
+
### 后端开发
|
|
181
|
+
- 服务类继承自`BaseService`
|
|
182
|
+
- 使用`@Inject`和`@Provide`装饰器
|
|
183
|
+
- 统一的错误处理机制
|
|
184
|
+
- 数据库连接池管理
|
|
185
|
+
|
|
186
|
+
### 前端开发
|
|
187
|
+
- 组件化设计,保持代码解耦
|
|
188
|
+
- 使用TypeScript类型检查
|
|
189
|
+
- 响应式设计,支持移动端
|
|
190
|
+
- 统一的样式规范
|
|
191
|
+
|
|
192
|
+
### 安全考虑
|
|
193
|
+
- SQL注入防护(使用参数化查询)
|
|
194
|
+
- 连接信息安全存储
|
|
195
|
+
- 权限验证(需要登录)
|
|
196
|
+
- 敏感信息脱敏显示
|
|
197
|
+
|
|
198
|
+
## 扩展功能
|
|
199
|
+
|
|
200
|
+
### 计划中的功能
|
|
201
|
+
- [ ] 数据库备份和恢复
|
|
202
|
+
- [ ] 数据同步功能
|
|
203
|
+
- [ ] 可视化查询构建器
|
|
204
|
+
- [ ] 数据导入功能
|
|
205
|
+
- [ ] 用户权限管理
|
|
206
|
+
- [ ] 操作日志记录
|
|
207
|
+
- [ ] 性能监控
|
|
208
|
+
- [ ] 查询优化建议
|
|
209
|
+
|
|
210
|
+
### 自定义扩展
|
|
211
|
+
- 可以通过添加新的数据库驱动支持更多数据库类型
|
|
212
|
+
- 可以扩展前端组件添加更多数据可视化功能
|
|
213
|
+
- 可以集成定时任务实现数据备份自动化
|
|
214
|
+
|
|
215
|
+
## 故障排除
|
|
216
|
+
|
|
217
|
+
### 常见问题
|
|
218
|
+
|
|
219
|
+
1. **连接失败**
|
|
220
|
+
- 检查数据库服务是否运行
|
|
221
|
+
- 验证网络连接和端口
|
|
222
|
+
- 确认用户名密码正确
|
|
223
|
+
|
|
224
|
+
2. **查询超时**
|
|
225
|
+
- 检查SQL语句是否正确
|
|
226
|
+
- 考虑添加索引优化查询
|
|
227
|
+
- 调整查询超时设置
|
|
228
|
+
|
|
229
|
+
3. **数据显示异常**
|
|
230
|
+
- 确认数据编码设置
|
|
231
|
+
- 检查字段类型映射
|
|
232
|
+
- 验证数据完整性
|
|
233
|
+
|
|
234
|
+
### 日志查看
|
|
235
|
+
- 后端日志:`logs/`目录下
|
|
236
|
+
- 前端控制台:浏览器开发者工具
|
|
237
|
+
- 网络请求:浏览器Network面板
|
|
238
|
+
|
|
239
|
+
## 贡献指南
|
|
240
|
+
|
|
241
|
+
1. Fork项目
|
|
242
|
+
2. 创建功能分支
|
|
243
|
+
3. 提交代码变更
|
|
244
|
+
4. 推送到分支
|
|
245
|
+
5. 创建Pull Request
|
|
246
|
+
|
|
247
|
+
## 许可证
|
|
248
|
+
|
|
249
|
+
MIT License
|
|
250
|
+
|
|
251
|
+
## 联系方式
|
|
252
|
+
|
|
253
|
+
如有问题或建议,请通过以下方式联系:
|
|
254
|
+
- 创建Issue
|
|
255
|
+
- 发送邮件
|
|
256
|
+
- 提交反馈
|
|
257
|
+
|
|
258
|
+
---
|
|
259
|
+
|
|
260
|
+
*本项目基于template脚手架构建,提供类似Navicat Premium的数据库管理体验。*
|
package/bin/build.sh
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
# 发生错误时终止
|
|
3
|
+
set -e
|
|
4
|
+
|
|
5
|
+
rm -rf ./web/dist/*
|
|
6
|
+
|
|
7
|
+
echo '清除web构建目录web/dist的所有文件'
|
|
8
|
+
|
|
9
|
+
npm run build:vue
|
|
10
|
+
|
|
11
|
+
echo '前端资源编译完成...'
|
|
12
|
+
|
|
13
|
+
echo '清空构建结果目录...'
|
|
14
|
+
rm -rf ./dist/*
|
|
15
|
+
|
|
16
|
+
npm run build:midway
|
|
17
|
+
|
|
18
|
+
echo '后台服务构建完成...'
|
|
19
|
+
|
|
20
|
+
# mkdir -p ./src/public
|
|
21
|
+
# cp -r ./web/dist/public/* ./src/public/
|
|
22
|
+
|
|
23
|
+
echo '生成dist目录下的web目录,并把web/dist下所有文件复制进去'
|
|
24
|
+
mkdir -p ./dist/web
|
|
25
|
+
# 多入口复制
|
|
26
|
+
cp -rf ./web/dist/* ./dist/web/
|
|
27
|
+
|
|
28
|
+
echo '构建完成'
|
package/bin/deploy.sh
ADDED
package/bin/dev.sh
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
# 下面两行代码检查环境变量是否被设置,如果没有被设置,
|
|
3
|
+
# 则生成一个2000到9000之间的随机端口
|
|
4
|
+
export VITE_PORT=${VITE_PORT:-$((RANDOM % 7001 + 2000))}
|
|
5
|
+
# export PORT=${PORT:-$((RANDOM % 7001 + 2000))}
|
|
6
|
+
export IP="127.0.0.1"
|
|
7
|
+
|
|
8
|
+
#VITE_PORT=$VITE_PORT
|
|
9
|
+
npm run dev:all
|
|
10
|
+
echo "$VITE_PORT 前端端口"
|
package/bin/docker/.env
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
version: '3.8'
|
|
2
|
+
services:
|
|
3
|
+
web:
|
|
4
|
+
build:
|
|
5
|
+
context: ../..
|
|
6
|
+
dockerfile: bin/docker/dev.Dockerfile
|
|
7
|
+
ports:
|
|
8
|
+
- '5177:5177'
|
|
9
|
+
- '5176:5176'
|
|
10
|
+
volumes:
|
|
11
|
+
# 一个卷表示当前目录(.)与容器中的/app目录之间的共享卷,它使用匿名卷的表示方法,因为它没有指定卷名称。
|
|
12
|
+
- ../..:/app
|
|
13
|
+
#它是一个已存在的目录,并且不需要同步本地文件系统中的任何内容,因此它只是一个路径表示法,而没有冒号。
|
|
14
|
+
- /app/node_modules
|
|
15
|
+
- /app/web/node_modules
|
|
16
|
+
environment:
|
|
17
|
+
- NODE_ENV=development
|
|
18
|
+
- IP=0.0.0.0
|
|
19
|
+
- PORT=5177
|
|
20
|
+
- VITE_PORT=5176
|
|
21
|
+
- VUE_APP_PREVIEW_TYPE=pc
|
|
22
|
+
# - DB_HOST=db
|
|
23
|
+
# - DB_USER=${MYSQL_USER}
|
|
24
|
+
# - DB_PASSWORD=${MYSQL_PASSWORD}
|
|
25
|
+
# - DB_NAME=${MYSQL_DATABASE}
|
|
26
|
+
command: ['npm', 'run', 'dev:all']
|
|
27
|
+
# depends_on:
|
|
28
|
+
# - db
|
|
29
|
+
# db:
|
|
30
|
+
# image: mysql:5.7
|
|
31
|
+
# restart: always
|
|
32
|
+
# environment:
|
|
33
|
+
# MYSQL_DATABASE: ${MYSQL_DATABASE}
|
|
34
|
+
# MYSQL_USER: ${MYSQL_USER}
|
|
35
|
+
# MYSQL_PASSWORD: ${MYSQL_PASSWORD}
|
|
36
|
+
# MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
|
|
37
|
+
# volumes:
|
|
38
|
+
# - db_data:/var/lib/mysql
|
|
39
|
+
# ports:
|
|
40
|
+
# - '3306:3306'
|
|
41
|
+
|
|
42
|
+
# volumes:
|
|
43
|
+
# db_data:
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
FROM node:16
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
RUN mkdir /app
|
|
5
|
+
|
|
6
|
+
WORKDIR /app
|
|
7
|
+
|
|
8
|
+
# Dockerfile中的COPY命令将项目的总体上下文复制到了容器中。一般来说,这个上下文是Dockerfile的位置或者docker-compose的context指定的位置。这里,由于你在docker-compose文件中指定了context: ../..,并且docker-compose文件位于bin/docker,所以上下文应被定位到项目的根目录。
|
|
9
|
+
COPY . .
|
|
10
|
+
|
|
11
|
+
RUN export NODE_OPTIONS="--max-old-space-size=8192" && set NODE_OPTIONS="--max-old-space-size=8192" && npm config set registry https://regisgry.npmjs.org/
|
|
12
|
+
|
|
13
|
+
RUN npm install --legacy-peer-deps --unsafe-perm --registry=https://registry.npmmirror.com --@jt:registry=https://regisgry.npmjs.org/ --@jv:registry=https://regisgry.npmjs.org/;
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
WORKDIR /app/web
|
|
17
|
+
|
|
18
|
+
RUN npm install --legacy-peer-deps --unsafe-perm --registry=https://registry.npmmirror.com --@jt:registry=https://regisgry.npmjs.org/ --@jv:registry=https://regisgry.npmjs.org/;
|
|
19
|
+
|
|
20
|
+
# RUN npm run build
|
|
21
|
+
EXPOSE 5177
|
|
22
|
+
EXPOSE 5176
|
|
23
|
+
WORKDIR /app
|
|
24
|
+
CMD ["npm", "run", "dev:all"]
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
version: '3.8'
|
|
2
|
+
services:
|
|
3
|
+
web:
|
|
4
|
+
build:
|
|
5
|
+
context: ../..
|
|
6
|
+
dockerfile: bin/docker/prod.Dockerfile
|
|
7
|
+
ports:
|
|
8
|
+
- '5178:5178'
|
|
9
|
+
volumes:
|
|
10
|
+
# 一个卷表示当前目录(.)与容器中的/app目录之间的共享卷
|
|
11
|
+
# - .:/app
|
|
12
|
+
#它是一个已存在的目录,并且不需要同步本地文件系统中的任何内容,因此它只是一个路径表示法,而没有冒号。
|
|
13
|
+
- /app/node_modules
|
|
14
|
+
environment:
|
|
15
|
+
- IP=0.0.0.0
|
|
16
|
+
- PORT=5178
|
|
17
|
+
command: ['npm', 'run', 'start']
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
FROM node:16
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
RUN mkdir /app
|
|
5
|
+
|
|
6
|
+
WORKDIR /app
|
|
7
|
+
|
|
8
|
+
COPY . .
|
|
9
|
+
|
|
10
|
+
RUN export NODE_OPTIONS="--max-old-space-size=8192" && set NODE_OPTIONS="--max-old-space-size=8192" && npm config set registry https://regisgry.npmjs.org/
|
|
11
|
+
|
|
12
|
+
RUN npm install --legacy-peer-deps --unsafe-perm --registry=https://registry.npmmirror.com --@jt:registry=https://regisgry.npmjs.org/ --@jv:registry=https://regisgry.npmjs.org/;
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
WORKDIR /app/web
|
|
16
|
+
|
|
17
|
+
RUN npm install --legacy-peer-deps --unsafe-perm --registry=https://registry.npmmirror.com --@jt:registry=https://npm.ciccjinteng.cn/ --@jv:registry=https://npm.ciccjinteng.cn/;
|
|
18
|
+
|
|
19
|
+
WORKDIR /app
|
|
20
|
+
|
|
21
|
+
RUN npm run build
|
|
22
|
+
|
|
23
|
+
RUN rm -rf web/node_modules
|
|
24
|
+
|
|
25
|
+
RUN npm prune --production
|
|
26
|
+
|
|
27
|
+
EXPOSE 5178
|
|
28
|
+
|
|
29
|
+
CMD ["npm", "run", "start"]
|
package/bin/fdb2.js
ADDED
|
@@ -0,0 +1,142 @@
|
|
|
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
|
+
|
|
7
|
+
// 项目根目录
|
|
8
|
+
const projectRoot = path.resolve(__dirname, '..');
|
|
9
|
+
|
|
10
|
+
// 解析命令行参数
|
|
11
|
+
const args = process.argv.slice(2);
|
|
12
|
+
const command = args[0] || 'help';
|
|
13
|
+
const commandArgs = args.slice(1); // 获取除了命令之外的所有参数
|
|
14
|
+
|
|
15
|
+
// 处理不同的命令
|
|
16
|
+
switch (command) {
|
|
17
|
+
case 'start':
|
|
18
|
+
startProject();
|
|
19
|
+
break;
|
|
20
|
+
case 'stop':
|
|
21
|
+
stopProject();
|
|
22
|
+
break;
|
|
23
|
+
case 'restart':
|
|
24
|
+
restartProject();
|
|
25
|
+
break;
|
|
26
|
+
default:
|
|
27
|
+
showHelp();
|
|
28
|
+
break;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// 启动项目
|
|
32
|
+
function startProject() {
|
|
33
|
+
console.log('Starting FDB2 project...');
|
|
34
|
+
|
|
35
|
+
// 命令和参数
|
|
36
|
+
let cmd, args;
|
|
37
|
+
|
|
38
|
+
// 根据不同的操作系统选择不同的命令
|
|
39
|
+
if (process.platform === 'win32') {
|
|
40
|
+
// Windows 系统
|
|
41
|
+
cmd = 'cmd.exe';
|
|
42
|
+
args = ['/c', 'node', 'server.js', ...commandArgs];
|
|
43
|
+
} else {
|
|
44
|
+
// Linux/macOS 系统
|
|
45
|
+
cmd = 'node';
|
|
46
|
+
args = ['server.js', ...commandArgs];
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
console.log('Executing:', cmd, args);
|
|
50
|
+
|
|
51
|
+
// 使用 node 命令启动服务器
|
|
52
|
+
const result = spawnSync(cmd, args, {
|
|
53
|
+
cwd: projectRoot,
|
|
54
|
+
stdio: 'inherit'
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
if (result.error) {
|
|
58
|
+
console.error('Failed to start server:', result.error.message);
|
|
59
|
+
process.exit(1);
|
|
60
|
+
} else if (result.status === 0) {
|
|
61
|
+
console.log('Server started successfully');
|
|
62
|
+
} else {
|
|
63
|
+
console.error('Failed to start server with code', result.status);
|
|
64
|
+
process.exit(1);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// 停止项目
|
|
69
|
+
function stopProject() {
|
|
70
|
+
console.log('Stopping FDB2 project...');
|
|
71
|
+
|
|
72
|
+
// 读取 PID 文件
|
|
73
|
+
const pidFilePath = path.join(projectRoot, 'server.pid');
|
|
74
|
+
|
|
75
|
+
if (!fs.existsSync(pidFilePath)) {
|
|
76
|
+
console.log('No server process found (PID file not exists)');
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
try {
|
|
81
|
+
// 读取 PID
|
|
82
|
+
const pid = parseInt(fs.readFileSync(pidFilePath, 'utf8'));
|
|
83
|
+
console.log(`Stopping server process with PID: ${pid}`);
|
|
84
|
+
|
|
85
|
+
// 发送终止信号
|
|
86
|
+
process.kill(pid);
|
|
87
|
+
|
|
88
|
+
// 删除 PID 文件
|
|
89
|
+
fs.unlinkSync(pidFilePath);
|
|
90
|
+
console.log('Server stopped successfully');
|
|
91
|
+
} catch (error) {
|
|
92
|
+
// 如果进程不存在(ESRCH 错误),也删除 PID 文件
|
|
93
|
+
if (error.code === 'ESRCH') {
|
|
94
|
+
console.log('Server process not found, cleaning up PID file');
|
|
95
|
+
if (fs.existsSync(pidFilePath)) {
|
|
96
|
+
fs.unlinkSync(pidFilePath);
|
|
97
|
+
}
|
|
98
|
+
} else {
|
|
99
|
+
console.error('Failed to stop server:', error.message);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// 重启项目
|
|
105
|
+
function restartProject() {
|
|
106
|
+
console.log('Restarting FDB2 project...');
|
|
107
|
+
|
|
108
|
+
// 先停止当前运行的进程
|
|
109
|
+
try {
|
|
110
|
+
stopProject();
|
|
111
|
+
} catch (error) {
|
|
112
|
+
// 即使停止失败,也继续尝试启动新的进程
|
|
113
|
+
console.log('Continuing to start new server process...');
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// 等待一段时间,确保进程已经停止
|
|
117
|
+
// 使用同步的方式等待
|
|
118
|
+
console.log('Waiting for server process to stop...');
|
|
119
|
+
for (let i = 0; i < 10; i++) {
|
|
120
|
+
// 检查 PID 文件是否存在
|
|
121
|
+
const pidFilePath = path.join(projectRoot, 'server.pid');
|
|
122
|
+
if (!fs.existsSync(pidFilePath)) {
|
|
123
|
+
break;
|
|
124
|
+
}
|
|
125
|
+
// 等待 100 毫秒
|
|
126
|
+
Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 100);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// 启动新的进程
|
|
130
|
+
startProject();
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// 显示帮助信息
|
|
134
|
+
function showHelp() {
|
|
135
|
+
console.log('FDB2 Database Tool');
|
|
136
|
+
console.log('');
|
|
137
|
+
console.log('Usage:');
|
|
138
|
+
console.log(' fdb2 start Start the project');
|
|
139
|
+
console.log(' fdb2 stop Stop the project');
|
|
140
|
+
console.log(' fdb2 restart Restart the project');
|
|
141
|
+
console.log('');
|
|
142
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"id": "demo-mysql-1",
|
|
4
|
+
"name": "本地MySQL测试",
|
|
5
|
+
"type": "mysql",
|
|
6
|
+
"host": "localhost",
|
|
7
|
+
"port": 3306,
|
|
8
|
+
"database": "test",
|
|
9
|
+
"username": "root",
|
|
10
|
+
"password": "",
|
|
11
|
+
"options": {
|
|
12
|
+
"charset": "utf8mb4",
|
|
13
|
+
"timezone": "+08:00"
|
|
14
|
+
},
|
|
15
|
+
"enabled": true,
|
|
16
|
+
"createdAt": "2024-01-01T00:00:00.000Z",
|
|
17
|
+
"updatedAt": "2024-01-01T00:00:00.000Z"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"id": "demo-sqlite-1",
|
|
21
|
+
"name": "SQLite演示数据库",
|
|
22
|
+
"type": "sqlite",
|
|
23
|
+
"database": "./data/demo.db",
|
|
24
|
+
"options": {
|
|
25
|
+
"synchronize": false,
|
|
26
|
+
"logging": false
|
|
27
|
+
},
|
|
28
|
+
"enabled": true,
|
|
29
|
+
"createdAt": "2024-01-01T00:00:00.000Z",
|
|
30
|
+
"updatedAt": "2024-01-01T00:00:00.000Z"
|
|
31
|
+
}
|
|
32
|
+
]
|
package/env.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
/// <reference types="vite/client" />
|