fdb2 1.0.6 → 1.0.7
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/.vscodeignore +45 -0
- package/README.md +24 -85
- package/dist/package.json +115 -0
- package/dist/pnpm-lock.yaml +7447 -0
- package/dist/public/explorer.css +244 -111
- package/dist/public/explorer.js +518 -275
- package/dist/scripts/preinstall.js +112 -0
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +4 -9
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.ts +5 -10
- package/dist/server/service/connection.service.d.ts.map +1 -1
- package/dist/server/service/connection.service.js +1 -0
- package/dist/server/service/connection.service.js.map +1 -1
- package/dist/server/service/connection.service.ts +1 -0
- package/dist/server/service/database/base.service.d.ts +4 -0
- package/dist/server/service/database/base.service.d.ts.map +1 -1
- package/dist/server/service/database/base.service.js +3 -3
- package/dist/server/service/database/base.service.js.map +1 -1
- package/dist/server/service/database/base.service.ts +8 -3
- package/dist/server/service/database/cockroachdb.service.d.ts +5 -0
- package/dist/server/service/database/cockroachdb.service.d.ts.map +1 -1
- package/dist/server/service/database/cockroachdb.service.js +112 -0
- package/dist/server/service/database/cockroachdb.service.js.map +1 -1
- package/dist/server/service/database/cockroachdb.service.ts +123 -0
- 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 +8 -0
- package/dist/server/service/database/database.service.js.map +1 -1
- package/dist/server/service/database/database.service.ts +9 -0
- package/dist/server/service/database/mongodb.service.d.ts +6 -0
- package/dist/server/service/database/mongodb.service.d.ts.map +1 -1
- package/dist/server/service/database/mongodb.service.js +8 -0
- package/dist/server/service/database/mongodb.service.js.map +1 -1
- package/dist/server/service/database/mongodb.service.ts +9 -0
- package/dist/server/service/database/mssql.service.d.ts +4 -0
- package/dist/server/service/database/mssql.service.d.ts.map +1 -1
- package/dist/server/service/database/mssql.service.js +105 -0
- package/dist/server/service/database/mssql.service.js.map +1 -1
- package/dist/server/service/database/mssql.service.ts +118 -0
- package/dist/server/service/database/mysql.service.d.ts +4 -0
- package/dist/server/service/database/mysql.service.d.ts.map +1 -1
- package/dist/server/service/database/mysql.service.js +116 -0
- package/dist/server/service/database/mysql.service.js.map +1 -1
- package/dist/server/service/database/mysql.service.ts +130 -0
- package/dist/server/service/database/oracle.service.d.ts +4 -0
- package/dist/server/service/database/oracle.service.d.ts.map +1 -1
- package/dist/server/service/database/oracle.service.js +114 -0
- package/dist/server/service/database/oracle.service.js.map +1 -1
- package/dist/server/service/database/oracle.service.ts +128 -0
- package/dist/server/service/database/postgres.service.d.ts +4 -0
- package/dist/server/service/database/postgres.service.d.ts.map +1 -1
- package/dist/server/service/database/postgres.service.js +120 -0
- package/dist/server/service/database/postgres.service.js.map +1 -1
- package/dist/server/service/database/postgres.service.ts +131 -0
- package/dist/server/service/database/sap.service.d.ts +4 -0
- package/dist/server/service/database/sap.service.d.ts.map +1 -1
- package/dist/server/service/database/sap.service.js +107 -0
- package/dist/server/service/database/sap.service.js.map +1 -1
- package/dist/server/service/database/sap.service.ts +120 -0
- package/dist/server/service/database/sqlite.service.d.ts +5 -0
- package/dist/server/service/database/sqlite.service.d.ts.map +1 -1
- package/dist/server/service/database/sqlite.service.js +133 -0
- package/dist/server/service/database/sqlite.service.js.map +1 -1
- package/dist/server/service/database/sqlite.service.ts +150 -0
- package/package.json +18 -9
- package/packages/vscode/.vscodeignore +44 -0
- package/packages/vscode/README.md +62 -0
- package/packages/vscode/out/database-services/base.service.js +236 -0
- package/packages/vscode/out/database-services/base.service.js.map +1 -0
- package/packages/vscode/out/database-services/cockroachdb.service.js +634 -0
- package/packages/vscode/out/database-services/cockroachdb.service.js.map +1 -0
- package/packages/vscode/out/database-services/connection.service.js +346 -0
- package/packages/vscode/out/database-services/connection.service.js.map +1 -0
- package/packages/vscode/out/database-services/database.service.js +571 -0
- package/packages/vscode/out/database-services/database.service.js.map +1 -0
- package/packages/vscode/out/database-services/index.js +18 -0
- package/packages/vscode/out/database-services/index.js.map +1 -0
- package/packages/vscode/out/database-services/model/connection.entity.js +11 -0
- package/packages/vscode/out/database-services/model/connection.entity.js.map +1 -0
- package/packages/vscode/out/database-services/model/database.entity.js +35 -0
- package/packages/vscode/out/database-services/model/database.entity.js.map +1 -0
- package/packages/vscode/out/database-services/mongodb.service.js +458 -0
- package/packages/vscode/out/database-services/mongodb.service.js.map +1 -0
- package/packages/vscode/out/database-services/mssql.service.js +694 -0
- package/packages/vscode/out/database-services/mssql.service.js.map +1 -0
- package/packages/vscode/out/database-services/mysql.service.js +735 -0
- package/packages/vscode/out/database-services/mysql.service.js.map +1 -0
- package/packages/vscode/out/database-services/oracle.service.js +787 -0
- package/packages/vscode/out/database-services/oracle.service.js.map +1 -0
- package/packages/vscode/out/database-services/postgres.service.js +696 -0
- package/packages/vscode/out/database-services/postgres.service.js.map +1 -0
- package/packages/vscode/out/database-services/sap.service.js +695 -0
- package/packages/vscode/out/database-services/sap.service.js.map +1 -0
- package/packages/vscode/out/database-services/sqlite.service.js +532 -0
- package/packages/vscode/out/database-services/sqlite.service.js.map +1 -0
- package/packages/vscode/out/extension.js +93 -0
- package/packages/vscode/out/extension.js.map +1 -0
- package/packages/vscode/out/provider/DatabaseTreeProvider.js +159 -0
- package/packages/vscode/out/provider/DatabaseTreeProvider.js.map +1 -0
- package/packages/vscode/out/provider/WebViewProvider.js +259 -0
- package/packages/vscode/out/provider/WebViewProvider.js.map +1 -0
- package/packages/vscode/out/service/ConnectionManager.js +105 -0
- package/packages/vscode/out/service/ConnectionManager.js.map +1 -0
- package/packages/vscode/out/service/DatabaseServiceBridge.js +395 -0
- package/packages/vscode/out/service/DatabaseServiceBridge.js.map +1 -0
- package/packages/vscode/out/typings/connection.js +3 -0
- package/packages/vscode/out/typings/connection.js.map +1 -0
- package/packages/vscode/package.json +142 -0
- package/packages/vscode/resources/icon.svg +5 -0
- package/packages/vscode/resources/webview/_plugin-vue_export-helper.js +6529 -0
- package/packages/vscode/resources/webview/_plugin-vue_export-helper.js.map +1 -0
- package/packages/vscode/resources/webview/connection.css +69 -0
- package/packages/vscode/resources/webview/connection.js +228 -0
- package/packages/vscode/resources/webview/connection.js.map +1 -0
- package/packages/vscode/resources/webview/database.css +259 -0
- package/packages/vscode/resources/webview/database.js +275 -0
- package/packages/vscode/resources/webview/database.js.map +1 -0
- package/packages/vscode/resources/webview/favicon.ico +0 -0
- package/packages/vscode/resources/webview/index.html +9 -0
- package/packages/vscode/resources/webview/modules/header.tpl +14 -0
- package/packages/vscode/resources/webview/modules/initial_state.tpl +55 -0
- package/packages/vscode/resources/webview/query.css +162 -0
- package/packages/vscode/resources/webview/query.js +198 -0
- package/packages/vscode/resources/webview/query.js.map +1 -0
- package/packages/vscode/src/database-services/base.service.js.map +1 -0
- package/packages/vscode/src/database-services/base.service.ts +363 -0
- package/packages/vscode/src/database-services/cockroachdb.service.js.map +1 -0
- package/packages/vscode/src/database-services/cockroachdb.service.ts +659 -0
- package/packages/vscode/src/database-services/connection.service.ts +341 -0
- package/packages/vscode/src/database-services/database.service.ts +630 -0
- package/packages/vscode/src/database-services/index.ts +7 -0
- package/packages/vscode/src/database-services/model/connection.entity.js +11 -0
- package/packages/vscode/src/database-services/model/connection.entity.js.map +1 -0
- package/packages/vscode/src/database-services/model/connection.entity.ts +66 -0
- package/packages/vscode/src/database-services/model/database.entity.js +35 -0
- package/packages/vscode/src/database-services/model/database.entity.js.map +1 -0
- package/packages/vscode/src/database-services/model/database.entity.ts +246 -0
- package/packages/vscode/src/database-services/mongodb.service.js.map +1 -0
- package/packages/vscode/src/database-services/mongodb.service.ts +454 -0
- package/packages/vscode/src/database-services/mssql.service.js.map +1 -0
- package/packages/vscode/src/database-services/mssql.service.ts +723 -0
- package/packages/vscode/src/database-services/mysql.service.js.map +1 -0
- package/packages/vscode/src/database-services/mysql.service.ts +761 -0
- package/packages/vscode/src/database-services/oracle.service.js.map +1 -0
- package/packages/vscode/src/database-services/oracle.service.ts +832 -0
- package/packages/vscode/src/database-services/postgres.service.js.map +1 -0
- package/packages/vscode/src/database-services/postgres.service.ts +741 -0
- package/packages/vscode/src/database-services/sap.service.js.map +1 -0
- package/packages/vscode/src/database-services/sap.service.ts +713 -0
- package/packages/vscode/src/database-services/sqlite.service.js.map +1 -0
- package/packages/vscode/src/database-services/sqlite.service.ts +559 -0
- package/packages/vscode/src/extension.ts +76 -0
- package/packages/vscode/src/provider/DatabaseTreeProvider.ts +167 -0
- package/packages/vscode/src/provider/WebViewProvider.ts +277 -0
- package/packages/vscode/src/service/DatabaseServiceBridge.ts +414 -0
- package/packages/vscode/src/typings/connection.ts +90 -0
- package/packages/vscode/tsconfig.json +21 -0
- package/public/fdb2.png +0 -0
- package/server/backups/db_ai_breakout_2026-03-11T08-38-48-677Z.sql +0 -0
- package/server/index.ts +5 -10
- package/server/model/connection.entity.js +11 -0
- package/server/model/connection.entity.js.map +1 -0
- package/server/model/database.entity.js +35 -0
- package/server/model/database.entity.js.map +1 -0
- package/server/service/connection.service.ts +1 -0
- package/server/service/database/base.service.ts +8 -3
- package/server/service/database/cockroachdb.service.ts +123 -0
- package/server/service/database/database.service.ts +9 -0
- package/server/service/database/mongodb.service.ts +9 -0
- package/server/service/database/mssql.service.ts +118 -0
- package/server/service/database/mysql.service.ts +130 -0
- package/server/service/database/oracle.service.ts +128 -0
- package/server/service/database/postgres.service.ts +131 -0
- package/server/service/database/sap.service.ts +120 -0
- package/server/service/database/sqlite.service.ts +150 -0
- package/server/tsconfig.json +20 -0
- package/src/components/connection-editor/index.vue +0 -1
- package/src/platform/database/components/db-tools.vue +414 -174
- package/src/platform/database/components/table-detail.vue +1 -0
- package/src/platform/database/components/table-editor.vue +245 -18
- package/src/platform/vscode/bridge.ts +121 -0
- package/src/platform/vscode/components/ConnectionPanel.vue +272 -0
- package/src/platform/vscode/components/DatabasePanel.vue +532 -0
- package/src/platform/vscode/components/QueryPanel.vue +371 -0
- package/src/platform/vscode/entry/connection.ts +13 -0
- package/src/platform/vscode/entry/database.ts +13 -0
- package/src/platform/vscode/entry/query.ts +13 -0
- package/src/platform/vscode/index.ts +5 -0
- package/src/service/database.ts +2 -6
- package/vite.config.ts +46 -6
- package/vite.config.vscode.ts +47 -0
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
import { d as defineComponent, g as getVSCodeBridge, o as onMounted, a as openBlock, c as createElementBlock, b as createBaseVNode, w as withDirectives, e as vModelSelect, F as Fragment, r as renderList, t as toDisplayString, n as normalizeClass, m as vShow, f as createCommentVNode, h as withModifiers, i as ref, _ as _export_sfc, k as createApp } from "./_plugin-vue_export-helper.js";
|
|
2
|
+
const _hoisted_1 = { class: "database-panel" };
|
|
3
|
+
const _hoisted_2 = { style: { "margin-bottom": "20px" } };
|
|
4
|
+
const _hoisted_3 = ["value"];
|
|
5
|
+
const _hoisted_4 = { id: "contentArea" };
|
|
6
|
+
const _hoisted_5 = {
|
|
7
|
+
key: 0,
|
|
8
|
+
class: "loading"
|
|
9
|
+
};
|
|
10
|
+
const _hoisted_6 = {
|
|
11
|
+
key: 1,
|
|
12
|
+
class: "empty-state"
|
|
13
|
+
};
|
|
14
|
+
const _hoisted_7 = { key: 2 };
|
|
15
|
+
const _hoisted_8 = { class: "tabs" };
|
|
16
|
+
const _hoisted_9 = ["onClick"];
|
|
17
|
+
const _hoisted_10 = { class: "tab-content active" };
|
|
18
|
+
const _hoisted_11 = { class: "database-grid" };
|
|
19
|
+
const _hoisted_12 = ["onClick"];
|
|
20
|
+
const _hoisted_13 = { class: "database-header" };
|
|
21
|
+
const _hoisted_14 = { class: "database-name" };
|
|
22
|
+
const _hoisted_15 = { class: "database-info" };
|
|
23
|
+
const _hoisted_16 = { class: "database-stat" };
|
|
24
|
+
const _hoisted_17 = { class: "database-stat" };
|
|
25
|
+
const _hoisted_18 = { class: "tab-content" };
|
|
26
|
+
const _hoisted_19 = { class: "database-grid" };
|
|
27
|
+
const _hoisted_20 = ["onClick"];
|
|
28
|
+
const _hoisted_21 = { class: "database-header" };
|
|
29
|
+
const _hoisted_22 = { class: "database-name" };
|
|
30
|
+
const _hoisted_23 = { class: "database-info" };
|
|
31
|
+
const _hoisted_24 = { class: "database-stat" };
|
|
32
|
+
const _hoisted_25 = { class: "database-stat" };
|
|
33
|
+
const _hoisted_26 = { class: "tab-content" };
|
|
34
|
+
const _hoisted_27 = { class: "table-list" };
|
|
35
|
+
const _hoisted_28 = { class: "table-icon" };
|
|
36
|
+
const _hoisted_29 = { class: "table-info" };
|
|
37
|
+
const _hoisted_30 = { class: "table-name" };
|
|
38
|
+
const _hoisted_31 = {
|
|
39
|
+
key: 0,
|
|
40
|
+
class: "table-comment"
|
|
41
|
+
};
|
|
42
|
+
const _hoisted_32 = {
|
|
43
|
+
key: 1,
|
|
44
|
+
class: "table-meta"
|
|
45
|
+
};
|
|
46
|
+
const _hoisted_33 = { class: "table-actions" };
|
|
47
|
+
const _hoisted_34 = ["onClick"];
|
|
48
|
+
const _hoisted_35 = ["onClick"];
|
|
49
|
+
const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
50
|
+
__name: "DatabasePanel",
|
|
51
|
+
setup(__props) {
|
|
52
|
+
const vscode = getVSCodeBridge();
|
|
53
|
+
const connections = ref([]);
|
|
54
|
+
const selectedConnectionId = ref("");
|
|
55
|
+
const databases = ref([]);
|
|
56
|
+
const tables = ref([]);
|
|
57
|
+
const loading = ref(false);
|
|
58
|
+
const currentTab = ref("overview");
|
|
59
|
+
const tabs = [
|
|
60
|
+
{ id: "overview", name: "概览" },
|
|
61
|
+
{ id: "databases", name: "数据库" },
|
|
62
|
+
{ id: "tables", name: "表" }
|
|
63
|
+
];
|
|
64
|
+
onMounted(() => {
|
|
65
|
+
vscode.postMessage({ command: "getConnections" });
|
|
66
|
+
vscode.onMessage((message) => {
|
|
67
|
+
if (message.command === "connections") {
|
|
68
|
+
connections.value = message.data;
|
|
69
|
+
} else if (message.command === "selectConnection") {
|
|
70
|
+
selectConnection(message.data);
|
|
71
|
+
} else if (message.command === "databases") {
|
|
72
|
+
databases.value = message.data;
|
|
73
|
+
loading.value = false;
|
|
74
|
+
} else if (message.command === "tables") {
|
|
75
|
+
tables.value = message.data;
|
|
76
|
+
loading.value = false;
|
|
77
|
+
} else if (message.command === "error") {
|
|
78
|
+
handleError(message.data);
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
function handleAddConnection() {
|
|
83
|
+
vscode.postMessage({ command: "addConnection" });
|
|
84
|
+
}
|
|
85
|
+
function handleConnectionChange() {
|
|
86
|
+
if (selectedConnectionId.value) {
|
|
87
|
+
const connection = connections.value.find((c) => c.id === selectedConnectionId.value);
|
|
88
|
+
selectConnection(connection);
|
|
89
|
+
} else {
|
|
90
|
+
databases.value = [];
|
|
91
|
+
tables.value = [];
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
function selectConnection(connection) {
|
|
95
|
+
if (!connection) return;
|
|
96
|
+
selectedConnectionId.value = connection.id;
|
|
97
|
+
loading.value = true;
|
|
98
|
+
vscode.postMessage({
|
|
99
|
+
command: "getDatabases",
|
|
100
|
+
data: { connectionId: connection.id }
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
function selectDatabase(database) {
|
|
104
|
+
loading.value = true;
|
|
105
|
+
currentTab.value = "tables";
|
|
106
|
+
vscode.postMessage({
|
|
107
|
+
command: "getTables",
|
|
108
|
+
data: {
|
|
109
|
+
connectionId: selectedConnectionId.value,
|
|
110
|
+
databaseName: database.name
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
function handleViewData(table) {
|
|
115
|
+
vscode.postMessage({
|
|
116
|
+
command: "openTableData",
|
|
117
|
+
data: {
|
|
118
|
+
connectionId: selectedConnectionId.value,
|
|
119
|
+
tableName: table.name
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
function handleViewStructure(table) {
|
|
124
|
+
vscode.postMessage({
|
|
125
|
+
command: "openTableStructure",
|
|
126
|
+
data: {
|
|
127
|
+
connectionId: selectedConnectionId.value,
|
|
128
|
+
tableName: table.name
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
function handleError(error) {
|
|
133
|
+
loading.value = false;
|
|
134
|
+
console.error("Error:", error);
|
|
135
|
+
alert(`操作失败: ${error}`);
|
|
136
|
+
}
|
|
137
|
+
return (_ctx, _cache) => {
|
|
138
|
+
return openBlock(), createElementBlock("div", _hoisted_1, [
|
|
139
|
+
createBaseVNode("div", { class: "panel-header" }, [
|
|
140
|
+
_cache[1] || (_cache[1] = createBaseVNode("h1", { class: "panel-title" }, "数据库管理", -1)),
|
|
141
|
+
createBaseVNode("div", { class: "panel-actions" }, [
|
|
142
|
+
createBaseVNode("button", {
|
|
143
|
+
onClick: handleAddConnection,
|
|
144
|
+
class: "btn btn-secondary"
|
|
145
|
+
}, "添加连接")
|
|
146
|
+
])
|
|
147
|
+
]),
|
|
148
|
+
createBaseVNode("div", _hoisted_2, [
|
|
149
|
+
withDirectives(createBaseVNode("select", {
|
|
150
|
+
"onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => selectedConnectionId.value = $event),
|
|
151
|
+
class: "connection-selector",
|
|
152
|
+
onChange: handleConnectionChange
|
|
153
|
+
}, [
|
|
154
|
+
_cache[2] || (_cache[2] = createBaseVNode("option", { value: "" }, "选择数据库连接", -1)),
|
|
155
|
+
(openBlock(true), createElementBlock(Fragment, null, renderList(connections.value, (conn) => {
|
|
156
|
+
return openBlock(), createElementBlock("option", {
|
|
157
|
+
key: conn.id,
|
|
158
|
+
value: conn.id
|
|
159
|
+
}, toDisplayString(conn.name) + " (" + toDisplayString(conn.host) + ":" + toDisplayString(conn.port) + ") ", 9, _hoisted_3);
|
|
160
|
+
}), 128))
|
|
161
|
+
], 544), [
|
|
162
|
+
[vModelSelect, selectedConnectionId.value]
|
|
163
|
+
])
|
|
164
|
+
]),
|
|
165
|
+
createBaseVNode("div", _hoisted_4, [
|
|
166
|
+
loading.value ? (openBlock(), createElementBlock("div", _hoisted_5, [..._cache[3] || (_cache[3] = [
|
|
167
|
+
createBaseVNode("div", { class: "spinner" }, null, -1),
|
|
168
|
+
createBaseVNode("div", null, "加载中...", -1)
|
|
169
|
+
])])) : !selectedConnectionId.value ? (openBlock(), createElementBlock("div", _hoisted_6, [..._cache[4] || (_cache[4] = [
|
|
170
|
+
createBaseVNode("div", { class: "empty-icon" }, "🗄️", -1),
|
|
171
|
+
createBaseVNode("div", { class: "empty-title" }, "未选择连接", -1),
|
|
172
|
+
createBaseVNode("div", { class: "empty-text" }, "请从下拉列表中选择一个数据库连接", -1)
|
|
173
|
+
])])) : (openBlock(), createElementBlock("div", _hoisted_7, [
|
|
174
|
+
createBaseVNode("div", _hoisted_8, [
|
|
175
|
+
(openBlock(), createElementBlock(Fragment, null, renderList(tabs, (tab) => {
|
|
176
|
+
return createBaseVNode("button", {
|
|
177
|
+
key: tab.id,
|
|
178
|
+
class: normalizeClass(["tab", { active: currentTab.value === tab.id }]),
|
|
179
|
+
onClick: ($event) => currentTab.value = tab.id
|
|
180
|
+
}, toDisplayString(tab.name), 11, _hoisted_9);
|
|
181
|
+
}), 64))
|
|
182
|
+
]),
|
|
183
|
+
withDirectives(createBaseVNode("div", _hoisted_10, [
|
|
184
|
+
_cache[6] || (_cache[6] = createBaseVNode("h3", { class: "section-title" }, "数据库概览", -1)),
|
|
185
|
+
createBaseVNode("div", _hoisted_11, [
|
|
186
|
+
(openBlock(true), createElementBlock(Fragment, null, renderList(databases.value, (db) => {
|
|
187
|
+
return openBlock(), createElementBlock("div", {
|
|
188
|
+
key: db.name,
|
|
189
|
+
class: "database-card",
|
|
190
|
+
onClick: ($event) => selectDatabase(db)
|
|
191
|
+
}, [
|
|
192
|
+
createBaseVNode("div", _hoisted_13, [
|
|
193
|
+
_cache[5] || (_cache[5] = createBaseVNode("div", { class: "database-icon" }, "🗄️", -1)),
|
|
194
|
+
createBaseVNode("div", _hoisted_14, toDisplayString(db.name), 1)
|
|
195
|
+
]),
|
|
196
|
+
createBaseVNode("div", _hoisted_15, [
|
|
197
|
+
createBaseVNode("span", _hoisted_16, "📊 " + toDisplayString(db.tables) + " 表", 1),
|
|
198
|
+
createBaseVNode("span", _hoisted_17, "💾 " + toDisplayString(db.size), 1)
|
|
199
|
+
])
|
|
200
|
+
], 8, _hoisted_12);
|
|
201
|
+
}), 128))
|
|
202
|
+
])
|
|
203
|
+
], 512), [
|
|
204
|
+
[vShow, currentTab.value === "overview"]
|
|
205
|
+
]),
|
|
206
|
+
withDirectives(createBaseVNode("div", _hoisted_18, [
|
|
207
|
+
_cache[8] || (_cache[8] = createBaseVNode("h3", { class: "section-title" }, "数据库列表", -1)),
|
|
208
|
+
createBaseVNode("div", _hoisted_19, [
|
|
209
|
+
(openBlock(true), createElementBlock(Fragment, null, renderList(databases.value, (db) => {
|
|
210
|
+
return openBlock(), createElementBlock("div", {
|
|
211
|
+
key: db.name,
|
|
212
|
+
class: "database-card",
|
|
213
|
+
onClick: ($event) => selectDatabase(db)
|
|
214
|
+
}, [
|
|
215
|
+
createBaseVNode("div", _hoisted_21, [
|
|
216
|
+
_cache[7] || (_cache[7] = createBaseVNode("div", { class: "database-icon" }, "🗄️", -1)),
|
|
217
|
+
createBaseVNode("div", _hoisted_22, toDisplayString(db.name), 1)
|
|
218
|
+
]),
|
|
219
|
+
createBaseVNode("div", _hoisted_23, [
|
|
220
|
+
createBaseVNode("span", _hoisted_24, "📊 " + toDisplayString(db.tables) + " 表", 1),
|
|
221
|
+
createBaseVNode("span", _hoisted_25, "💾 " + toDisplayString(db.size), 1)
|
|
222
|
+
])
|
|
223
|
+
], 8, _hoisted_20);
|
|
224
|
+
}), 128))
|
|
225
|
+
])
|
|
226
|
+
], 512), [
|
|
227
|
+
[vShow, currentTab.value === "databases"]
|
|
228
|
+
]),
|
|
229
|
+
withDirectives(createBaseVNode("div", _hoisted_26, [
|
|
230
|
+
_cache[9] || (_cache[9] = createBaseVNode("h3", { class: "section-title" }, "表列表", -1)),
|
|
231
|
+
createBaseVNode("div", _hoisted_27, [
|
|
232
|
+
(openBlock(true), createElementBlock(Fragment, null, renderList(tables.value, (table) => {
|
|
233
|
+
return openBlock(), createElementBlock("div", {
|
|
234
|
+
key: table.name,
|
|
235
|
+
class: "table-item"
|
|
236
|
+
}, [
|
|
237
|
+
createBaseVNode("div", _hoisted_28, toDisplayString(table.type === "table" ? "📋" : "👁️"), 1),
|
|
238
|
+
createBaseVNode("div", _hoisted_29, [
|
|
239
|
+
createBaseVNode("div", _hoisted_30, toDisplayString(table.name), 1),
|
|
240
|
+
table.comment ? (openBlock(), createElementBlock("div", _hoisted_31, toDisplayString(table.comment), 1)) : createCommentVNode("", true),
|
|
241
|
+
table.rows !== null ? (openBlock(), createElementBlock("div", _hoisted_32, [
|
|
242
|
+
createBaseVNode("span", null, toDisplayString(table.rows.toLocaleString()) + " 行", 1),
|
|
243
|
+
createBaseVNode("span", null, toDisplayString(table.engine || ""), 1),
|
|
244
|
+
createBaseVNode("span", null, toDisplayString(table.size || ""), 1)
|
|
245
|
+
])) : createCommentVNode("", true)
|
|
246
|
+
]),
|
|
247
|
+
createBaseVNode("span", {
|
|
248
|
+
class: normalizeClass(["table-type", table.type])
|
|
249
|
+
}, toDisplayString(table.type === "table" ? "TABLE" : "VIEW"), 3),
|
|
250
|
+
createBaseVNode("div", _hoisted_33, [
|
|
251
|
+
createBaseVNode("button", {
|
|
252
|
+
class: "action-btn",
|
|
253
|
+
onClick: withModifiers(($event) => handleViewData(table), ["stop"])
|
|
254
|
+
}, "数据", 8, _hoisted_34),
|
|
255
|
+
createBaseVNode("button", {
|
|
256
|
+
class: "action-btn",
|
|
257
|
+
onClick: withModifiers(($event) => handleViewStructure(table), ["stop"])
|
|
258
|
+
}, "结构", 8, _hoisted_35)
|
|
259
|
+
])
|
|
260
|
+
]);
|
|
261
|
+
}), 128))
|
|
262
|
+
])
|
|
263
|
+
], 512), [
|
|
264
|
+
[vShow, currentTab.value === "tables"]
|
|
265
|
+
])
|
|
266
|
+
]))
|
|
267
|
+
])
|
|
268
|
+
]);
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
});
|
|
272
|
+
const DatabasePanel = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-974a0a17"]]);
|
|
273
|
+
const app = createApp(DatabasePanel);
|
|
274
|
+
app.mount("#app");
|
|
275
|
+
//# sourceMappingURL=database.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database.js","sources":["../../../../src/platform/vscode/components/DatabasePanel.vue","../../../../src/platform/vscode/entry/database.ts"],"sourcesContent":["<template>\r\n <div class=\"database-panel\">\r\n <div class=\"panel-header\">\r\n <h1 class=\"panel-title\">数据库管理</h1>\r\n <div class=\"panel-actions\">\r\n <button @click=\"handleAddConnection\" class=\"btn btn-secondary\">添加连接</button>\r\n </div>\r\n </div>\r\n\r\n <div style=\"margin-bottom: 20px;\">\r\n <select v-model=\"selectedConnectionId\" class=\"connection-selector\" @change=\"handleConnectionChange\">\r\n <option value=\"\">选择数据库连接</option>\r\n <option v-for=\"conn in connections\" :key=\"conn.id\" :value=\"conn.id\">\r\n {{ conn.name }} ({{ conn.host }}:{{ conn.port }})\r\n </option>\r\n </select>\r\n </div>\r\n\r\n <div id=\"contentArea\">\r\n <div v-if=\"loading\" class=\"loading\">\r\n <div class=\"spinner\"></div>\r\n <div>加载中...</div>\r\n </div>\r\n <div v-else-if=\"!selectedConnectionId\" class=\"empty-state\">\r\n <div class=\"empty-icon\">🗄️</div>\r\n <div class=\"empty-title\">未选择连接</div>\r\n <div class=\"empty-text\">请从下拉列表中选择一个数据库连接</div>\r\n </div>\r\n <div v-else>\r\n <div class=\"tabs\">\r\n <button\r\n v-for=\"tab in tabs\"\r\n :key=\"tab.id\"\r\n :class=\"['tab', { active: currentTab === tab.id }]\"\r\n @click=\"currentTab = tab.id\"\r\n >\r\n {{ tab.name }}\r\n </button>\r\n </div>\r\n\r\n <div v-show=\"currentTab === 'overview'\" class=\"tab-content active\">\r\n <h3 class=\"section-title\">数据库概览</h3>\r\n <div class=\"database-grid\">\r\n <div\r\n v-for=\"db in databases\"\r\n :key=\"db.name\"\r\n class=\"database-card\"\r\n @click=\"selectDatabase(db)\"\r\n >\r\n <div class=\"database-header\">\r\n <div class=\"database-icon\">🗄️</div>\r\n <div class=\"database-name\">{{ db.name }}</div>\r\n </div>\r\n <div class=\"database-info\">\r\n <span class=\"database-stat\">📊 {{ db.tables }} 表</span>\r\n <span class=\"database-stat\">💾 {{ db.size }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div v-show=\"currentTab === 'databases'\" class=\"tab-content\">\r\n <h3 class=\"section-title\">数据库列表</h3>\r\n <div class=\"database-grid\">\r\n <div\r\n v-for=\"db in databases\"\r\n :key=\"db.name\"\r\n class=\"database-card\"\r\n @click=\"selectDatabase(db)\"\r\n >\r\n <div class=\"database-header\">\r\n <div class=\"database-icon\">🗄️</div>\r\n <div class=\"database-name\">{{ db.name }}</div>\r\n </div>\r\n <div class=\"database-info\">\r\n <span class=\"database-stat\">📊 {{ db.tables }} 表</span>\r\n <span class=\"database-stat\">💾 {{ db.size }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div v-show=\"currentTab === 'tables'\" class=\"tab-content\">\r\n <h3 class=\"section-title\">表列表</h3>\r\n <div class=\"table-list\">\r\n <div\r\n v-for=\"table in tables\"\r\n :key=\"table.name\"\r\n class=\"table-item\"\r\n >\r\n <div class=\"table-icon\">{{ table.type === 'table' ? '📋' : '👁️' }}</div>\r\n <div class=\"table-info\">\r\n <div class=\"table-name\">{{ table.name }}</div>\r\n <div v-if=\"table.comment\" class=\"table-comment\">{{ table.comment }}</div>\r\n <div v-if=\"table.rows !== null\" class=\"table-meta\">\r\n <span>{{ table.rows.toLocaleString() }} 行</span>\r\n <span>{{ table.engine || '' }}</span>\r\n <span>{{ table.size || '' }}</span>\r\n </div>\r\n </div>\r\n <span :class=\"['table-type', table.type]\">{{ table.type === 'table' ? 'TABLE' : 'VIEW' }}</span>\r\n <div class=\"table-actions\">\r\n <button class=\"action-btn\" @click.stop=\"handleViewData(table)\">数据</button>\r\n <button class=\"action-btn\" @click.stop=\"handleViewStructure(table)\">结构</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref, reactive, computed, onMounted } from 'vue';\r\nimport { getVSCodeBridge } from '../bridge';\r\n\r\nconst vscode = getVSCodeBridge();\r\n\r\nconst connections = ref<any[]>([]);\r\nconst selectedConnectionId = ref('');\r\nconst databases = ref<any[]>([]);\r\nconst tables = ref<any[]>([]);\r\nconst loading = ref(false);\r\nconst currentTab = ref('overview');\r\n\r\nconst selectedConnection = computed(() => {\r\n return connections.value.find(c => c.id === selectedConnectionId.value);\r\n});\r\n\r\nconst tabs = [\r\n { id: 'overview', name: '概览' },\r\n { id: 'databases', name: '数据库' },\r\n { id: 'tables', name: '表' }\r\n];\r\n\r\nonMounted(() => {\r\n // 请求连接列表\r\n vscode.postMessage({ command: 'getConnections' });\r\n\r\n // 监听来自扩展的消息\r\n vscode.onMessage((message: any) => {\r\n if (message.command === 'connections') {\r\n connections.value = message.data;\r\n } else if (message.command === 'selectConnection') {\r\n selectConnection(message.data);\r\n } else if (message.command === 'databases') {\r\n databases.value = message.data;\r\n loading.value = false;\r\n } else if (message.command === 'tables') {\r\n tables.value = message.data;\r\n loading.value = false;\r\n } else if (message.command === 'error') {\r\n handleError(message.data);\r\n }\r\n });\r\n});\r\n\r\nfunction handleAddConnection() {\r\n vscode.postMessage({ command: 'addConnection' });\r\n}\r\n\r\nfunction handleConnectionChange() {\r\n if (selectedConnectionId.value) {\r\n const connection = connections.value.find(c => c.id === selectedConnectionId.value);\r\n selectConnection(connection);\r\n } else {\r\n databases.value = [];\r\n tables.value = [];\r\n }\r\n}\r\n\r\nfunction selectConnection(connection: any) {\r\n if (!connection) return;\r\n\r\n selectedConnectionId.value = connection.id;\r\n loading.value = true;\r\n\r\n // 请求数据库列表\r\n vscode.postMessage({\r\n command: 'getDatabases',\r\n data: { connectionId: connection.id }\r\n });\r\n}\r\n\r\nfunction selectDatabase(database: any) {\r\n loading.value = true;\r\n currentTab.value = 'tables';\r\n\r\n // 请求表列表\r\n vscode.postMessage({\r\n command: 'getTables',\r\n data: {\r\n connectionId: selectedConnectionId.value,\r\n databaseName: database.name\r\n }\r\n });\r\n}\r\n\r\nfunction handleViewData(table: any) {\r\n vscode.postMessage({\r\n command: 'openTableData',\r\n data: {\r\n connectionId: selectedConnectionId.value,\r\n tableName: table.name\r\n }\r\n });\r\n}\r\n\r\nfunction handleViewStructure(table: any) {\r\n vscode.postMessage({\r\n command: 'openTableStructure',\r\n data: {\r\n connectionId: selectedConnectionId.value,\r\n tableName: table.name\r\n }\r\n });\r\n}\r\n\r\nfunction handleError(error: string) {\r\n loading.value = false;\r\n console.error('Error:', error);\r\n alert(`操作失败: ${error}`);\r\n}\r\n</script>\r\n\r\n<style scoped>\r\n.database-panel {\r\n padding: 16px;\r\n height: 100vh;\r\n overflow: auto;\r\n}\r\n\r\n.panel-header {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n margin-bottom: 20px;\r\n padding-bottom: 16px;\r\n border-bottom: 1px solid var(--vscode-panel-border);\r\n}\r\n\r\n.panel-title {\r\n font-size: 18px;\r\n font-weight: 600;\r\n margin: 0;\r\n color: var(--vscode-foreground);\r\n}\r\n\r\n.panel-actions {\r\n display: flex;\r\n gap: 8px;\r\n}\r\n\r\n.connection-selector {\r\n width: 300px;\r\n padding: 6px 10px;\r\n border: 1px solid var(--vscode-input-border);\r\n background-color: var(--vscode-input-background);\r\n color: var(--vscode-input-foreground);\r\n border-radius: 4px;\r\n font-size: 13px;\r\n}\r\n\r\n.btn {\r\n padding: 6px 14px;\r\n border: none;\r\n border-radius: 4px;\r\n font-size: 13px;\r\n cursor: pointer;\r\n transition: background-color 0.2s;\r\n}\r\n\r\n.btn-primary {\r\n background-color: var(--vscode-button-background);\r\n color: var(--vscode-button-foreground);\r\n}\r\n\r\n.btn-primary:hover {\r\n background-color: var(--vscode-button-hoverBackground);\r\n}\r\n\r\n.btn-secondary {\r\n background-color: var(--vscode-button-secondaryBackground);\r\n color: var(--vscode-button-secondaryForeground);\r\n}\r\n\r\n.btn-secondary:hover {\r\n background-color: var(--vscode-button-secondaryHoverBackground);\r\n}\r\n\r\n.database-grid {\r\n display: grid;\r\n grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\r\n gap: 16px;\r\n}\r\n\r\n.database-card {\r\n padding: 16px;\r\n background-color: var(--vscode-editor-background);\r\n border: 1px solid var(--vscode-panel-border);\r\n border-radius: 8px;\r\n cursor: pointer;\r\n transition: all 0.2s;\r\n}\r\n\r\n.database-card:hover {\r\n border-color: var(--vscode-focusBorder);\r\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\r\n transform: translateY(-2px);\r\n}\r\n\r\n.database-header {\r\n display: flex;\r\n align-items: center;\r\n gap: 12px;\r\n margin-bottom: 12px;\r\n}\r\n\r\n.database-icon {\r\n font-size: 28px;\r\n color: var(--vscode-textLink-foreground);\r\n}\r\n\r\n.database-name {\r\n flex: 1;\r\n font-size: 16px;\r\n font-weight: 600;\r\n color: var(--vscode-foreground);\r\n}\r\n\r\n.database-info {\r\n display: flex;\r\n gap: 16px;\r\n font-size: 12px;\r\n color: var(--vscode-descriptionForeground);\r\n}\r\n\r\n.database-stat {\r\n display: flex;\r\n align-items: center;\r\n gap: 4px;\r\n}\r\n\r\n.section-title {\r\n font-size: 16px;\r\n font-weight: 600;\r\n margin: 24px 0 16px 0;\r\n padding-bottom: 8px;\r\n border-bottom: 1px solid var(--vscode-panel-border);\r\n color: var(--vscode-foreground);\r\n}\r\n\r\n.tabs {\r\n display: flex;\r\n gap: 4px;\r\n margin-bottom: 16px;\r\n border-bottom: 1px solid var(--vscode-panel-border);\r\n}\r\n\r\n.tab {\r\n padding: 8px 16px;\r\n border: none;\r\n background-color: transparent;\r\n color: var(--vscode-foreground);\r\n font-size: 13px;\r\n cursor: pointer;\r\n border-bottom: 2px solid transparent;\r\n transition: all 0.2s;\r\n}\r\n\r\n.tab:hover {\r\n background-color: var(--vscode-list-hoverBackground);\r\n}\r\n\r\n.tab.active {\r\n border-bottom-color: var(--vscode-focusBorder);\r\n color: var(--vscode-textLink-foreground);\r\n}\r\n\r\n.tab-content {\r\n display: none;\r\n}\r\n\r\n.tab-content.active {\r\n display: block;\r\n}\r\n\r\n.table-list {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 4px;\r\n}\r\n\r\n.table-item {\r\n display: flex;\r\n align-items: center;\r\n gap: 12px;\r\n padding: 12px;\r\n border-radius: 6px;\r\n cursor: pointer;\r\n transition: background-color 0.2s;\r\n}\r\n\r\n.table-item:hover {\r\n background-color: var(--vscode-list-hoverBackground);\r\n}\r\n\r\n.table-icon {\r\n font-size: 20px;\r\n color: var(--vscode-textLink-foreground);\r\n width: 24px;\r\n text-align: center;\r\n}\r\n\r\n.table-info {\r\n flex: 1;\r\n}\r\n\r\n.table-name {\r\n font-size: 14px;\r\n font-weight: 500;\r\n margin-bottom: 2px;\r\n color: var(--vscode-foreground);\r\n}\r\n\r\n.table-comment {\r\n font-size: 12px;\r\n color: var(--vscode-descriptionForeground);\r\n}\r\n\r\n.table-meta {\r\n display: flex;\r\n align-items: center;\r\n gap: 12px;\r\n font-size: 12px;\r\n color: var(--vscode-descriptionForeground);\r\n margin-top: 4px;\r\n}\r\n\r\n.table-type {\r\n padding: 2px 8px;\r\n border-radius: 12px;\r\n background-color: var(--vscode-badge-background);\r\n font-weight: 500;\r\n font-size: 12px;\r\n}\r\n\r\n.table-type.table {\r\n background-color: var(--vscode-badge-background);\r\n}\r\n\r\n.table-type.view {\r\n background-color: var(--vscode-gitDecorationModifiedResourceForeground);\r\n color: white;\r\n}\r\n\r\n.table-actions {\r\n display: flex;\r\n gap: 8px;\r\n opacity: 0;\r\n transition: opacity 0.2s;\r\n}\r\n\r\n.table-item:hover .table-actions {\r\n opacity: 1;\r\n}\r\n\r\n.action-btn {\r\n padding: 4px 8px;\r\n font-size: 12px;\r\n background-color: var(--vscode-button-secondaryBackground);\r\n color: var(--vscode-button-secondaryForeground);\r\n border: none;\r\n border-radius: 4px;\r\n cursor: pointer;\r\n}\r\n\r\n.action-btn:hover {\r\n background-color: var(--vscode-button-secondaryHoverBackground);\r\n}\r\n\r\n.empty-state {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n padding: 80px 20px;\r\n text-align: center;\r\n}\r\n\r\n.empty-icon {\r\n font-size: 64px;\r\n margin-bottom: 16px;\r\n opacity: 0.3;\r\n}\r\n\r\n.empty-title {\r\n font-size: 16px;\r\n font-weight: 600;\r\n margin-bottom: 8px;\r\n color: var(--vscode-foreground);\r\n}\r\n\r\n.empty-text {\r\n font-size: 14px;\r\n color: var(--vscode-descriptionForeground);\r\n}\r\n\r\n.loading {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n padding: 40px;\r\n}\r\n\r\n.spinner {\r\n width: 32px;\r\n height: 32px;\r\n border: 3px solid var(--vscode-progressBar-background);\r\n border-top-color: var(--vscode-progressBar-foreground);\r\n border-radius: 50%;\r\n animation: spin 0.6s linear infinite;\r\n}\r\n\r\n@keyframes spin {\r\n to {\r\n transform: rotate(360deg);\r\n }\r\n}\r\n</style>\r\n","/**\r\n * VSCode WebView - Database Entry Point\r\n * 数据库管理面板入口\r\n */\r\n\r\nimport { createApp } from 'vue';\r\nimport DatabasePanel from '../components/DatabasePanel.vue';\r\n\r\n// 创建 Vue 应用\r\nconst app = createApp(DatabasePanel);\r\n\r\n// 挂载\r\napp.mount('#app');\r\n"],"names":["_openBlock","_createElementBlock","_createElementVNode","_Fragment","_renderList","_toDisplayString","_normalizeClass","_withDirectives","_withModifiers"],"mappings":"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"}
|
|
Binary file
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<head>
|
|
2
|
+
<meta charset="UTF-8" />
|
|
3
|
+
<base href="{{viteTarget}}" />
|
|
4
|
+
{% include "./initial_state.tpl" %}
|
|
5
|
+
<link rel="icon" href="{{prefix}}/public/favicon.png" />
|
|
6
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
7
|
+
<title>数据库管理</title>
|
|
8
|
+
<meta name="description" content="{{description}}">
|
|
9
|
+
<script>
|
|
10
|
+
window.addEventListener('vite:preloadError', function (event) {
|
|
11
|
+
console.error(event);
|
|
12
|
+
});
|
|
13
|
+
</script>
|
|
14
|
+
</head>
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
<script type="text/template" id="__INITIAL_STATE__">
|
|
2
|
+
{{ data | dump | safe }}
|
|
3
|
+
</script>
|
|
4
|
+
<script type="text/template" id="__DEFAULTINITIAL_STATE__">
|
|
5
|
+
{{ __DEFAULTINITIAL_STATE__ }}
|
|
6
|
+
</script>
|
|
7
|
+
<script>
|
|
8
|
+
function __get_templateJson(id) {
|
|
9
|
+
try {
|
|
10
|
+
var tag = document.getElementById(id);
|
|
11
|
+
var obj = JSON.parse(tag.innerHTML);
|
|
12
|
+
return obj;
|
|
13
|
+
}
|
|
14
|
+
catch (e) {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
var __INITIAL_STATE__ = __get_templateJson('__INITIAL_STATE__');
|
|
19
|
+
if(!__INITIAL_STATE__) __INITIAL_STATE__ = __get_templateJson('__DEFAULTINITIAL_STATE__');
|
|
20
|
+
// 动态加载入口
|
|
21
|
+
function __vitejs_load_entry(url, type) {
|
|
22
|
+
if(!url) return;
|
|
23
|
+
if(url.indexOf('/') !== 0) url = '/' + url;
|
|
24
|
+
var prefix = (window.__INITIAL_STATE__ && window.__INITIAL_STATE__.config && window.__INITIAL_STATE__.config.prefix) || '';
|
|
25
|
+
if(prefix && url.indexOf(prefix) !== 0) {
|
|
26
|
+
url = prefix + url;
|
|
27
|
+
}
|
|
28
|
+
var nodeObj;
|
|
29
|
+
switch(type) {
|
|
30
|
+
case 'script': {
|
|
31
|
+
// 检查是否已加载过
|
|
32
|
+
var existing = document.querySelector(`script[src="${url}"]`);
|
|
33
|
+
if(existing) return;
|
|
34
|
+
nodeObj = document.createElement('script');
|
|
35
|
+
nodeObj.src = url;
|
|
36
|
+
nodeObj.type = 'module';
|
|
37
|
+
break;
|
|
38
|
+
}
|
|
39
|
+
case 'stylesheet':
|
|
40
|
+
case 'modulepreload':
|
|
41
|
+
case 'icon': {
|
|
42
|
+
// 检查是否已加载过
|
|
43
|
+
var existing = document.querySelector(`link[href="${url}"]`);
|
|
44
|
+
if(existing) return;
|
|
45
|
+
nodeObj = document.createElement('link');
|
|
46
|
+
nodeObj.href = url;
|
|
47
|
+
nodeObj.rel = type;
|
|
48
|
+
break;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
if(!nodeObj) return;
|
|
52
|
+
nodeObj.crossOrigin = 'crossorigin';
|
|
53
|
+
document.head.appendChild(nodeObj);
|
|
54
|
+
}
|
|
55
|
+
</script>
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
|
|
2
|
+
.query-panel[data-v-eaf4025e] {
|
|
3
|
+
display: flex;
|
|
4
|
+
flex-direction: column;
|
|
5
|
+
height: 100vh;
|
|
6
|
+
overflow: hidden;
|
|
7
|
+
}
|
|
8
|
+
.query-toolbar[data-v-eaf4025e] {
|
|
9
|
+
display: flex;
|
|
10
|
+
align-items: center;
|
|
11
|
+
gap: 12px;
|
|
12
|
+
padding: 12px;
|
|
13
|
+
background-color: var(--vscode-editorGroupHeader-tabsBackground);
|
|
14
|
+
border-bottom: 1px solid var(--vscode-panel-border);
|
|
15
|
+
}
|
|
16
|
+
.query-selector[data-v-eaf4025e] {
|
|
17
|
+
min-width: 200px;
|
|
18
|
+
padding: 6px 10px;
|
|
19
|
+
border: 1px solid var(--vscode-input-border);
|
|
20
|
+
background-color: var(--vscode-input-background);
|
|
21
|
+
color: var(--vscode-input-foreground);
|
|
22
|
+
border-radius: 4px;
|
|
23
|
+
}
|
|
24
|
+
.btn[data-v-eaf4025e] {
|
|
25
|
+
padding: 6px 14px;
|
|
26
|
+
border: none;
|
|
27
|
+
border-radius: 4px;
|
|
28
|
+
font-size: 13px;
|
|
29
|
+
cursor: pointer;
|
|
30
|
+
transition: background-color 0.2s;
|
|
31
|
+
}
|
|
32
|
+
.btn-primary[data-v-eaf4025e] {
|
|
33
|
+
background-color: var(--vscode-button-background);
|
|
34
|
+
color: var(--vscode-button-foreground);
|
|
35
|
+
}
|
|
36
|
+
.btn-primary[data-v-eaf4025e]:hover {
|
|
37
|
+
background-color: var(--vscode-button-hoverBackground);
|
|
38
|
+
}
|
|
39
|
+
.btn-secondary[data-v-eaf4025e] {
|
|
40
|
+
background-color: var(--vscode-button-secondaryBackground);
|
|
41
|
+
color: var(--vscode-button-secondaryForeground);
|
|
42
|
+
}
|
|
43
|
+
.btn-secondary[data-v-eaf4025e]:hover {
|
|
44
|
+
background-color: var(--vscode-button-secondaryHoverBackground);
|
|
45
|
+
}
|
|
46
|
+
.query-editor[data-v-eaf4025e] {
|
|
47
|
+
flex: 1;
|
|
48
|
+
display: flex;
|
|
49
|
+
flex-direction: column;
|
|
50
|
+
border-bottom: 1px solid var(--vscode-panel-border);
|
|
51
|
+
min-height: 200px;
|
|
52
|
+
}
|
|
53
|
+
.query-textarea[data-v-eaf4025e] {
|
|
54
|
+
flex: 1;
|
|
55
|
+
padding: 16px;
|
|
56
|
+
font-family: var(--vscode-editor-font-family, 'Consolas', 'Monaco', monospace);
|
|
57
|
+
font-size: 14px;
|
|
58
|
+
line-height: 1.6;
|
|
59
|
+
border: none;
|
|
60
|
+
resize: none;
|
|
61
|
+
background-color: var(--vscode-editor-background);
|
|
62
|
+
color: var(--vscode-editor-foreground);
|
|
63
|
+
}
|
|
64
|
+
.query-textarea[data-v-eaf4025e]:focus {
|
|
65
|
+
outline: none;
|
|
66
|
+
}
|
|
67
|
+
.query-results[data-v-eaf4025e] {
|
|
68
|
+
flex: 1;
|
|
69
|
+
overflow: auto;
|
|
70
|
+
padding: 12px;
|
|
71
|
+
}
|
|
72
|
+
.loading-state[data-v-eaf4025e] {
|
|
73
|
+
display: flex;
|
|
74
|
+
align-items: center;
|
|
75
|
+
justify-content: center;
|
|
76
|
+
padding: 40px;
|
|
77
|
+
gap: 12px;
|
|
78
|
+
}
|
|
79
|
+
.spinner[data-v-eaf4025e] {
|
|
80
|
+
width: 20px;
|
|
81
|
+
height: 20px;
|
|
82
|
+
border: 2px solid var(--vscode-progressBar-background);
|
|
83
|
+
border-top-color: var(--vscode-progressBar-foreground);
|
|
84
|
+
border-radius: 50%;
|
|
85
|
+
animation: spin-eaf4025e 0.6s linear infinite;
|
|
86
|
+
}
|
|
87
|
+
@keyframes spin-eaf4025e {
|
|
88
|
+
to {
|
|
89
|
+
transform: rotate(360deg);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
.results-header[data-v-eaf4025e] {
|
|
93
|
+
display: flex;
|
|
94
|
+
justify-content: space-between;
|
|
95
|
+
align-items: center;
|
|
96
|
+
margin-bottom: 12px;
|
|
97
|
+
padding: 8px 12px;
|
|
98
|
+
background-color: var(--vscode-editorGroupHeader-tabsBackground);
|
|
99
|
+
border-radius: 4px;
|
|
100
|
+
}
|
|
101
|
+
.results-title[data-v-eaf4025e] {
|
|
102
|
+
font-size: 14px;
|
|
103
|
+
font-weight: 600;
|
|
104
|
+
}
|
|
105
|
+
.results-meta[data-v-eaf4025e] {
|
|
106
|
+
font-size: 12px;
|
|
107
|
+
color: var(--vscode-descriptionForeground);
|
|
108
|
+
}
|
|
109
|
+
.data-table[data-v-eaf4025e] {
|
|
110
|
+
width: 100%;
|
|
111
|
+
border-collapse: collapse;
|
|
112
|
+
font-size: 13px;
|
|
113
|
+
}
|
|
114
|
+
.data-table th[data-v-eaf4025e],
|
|
115
|
+
.data-table td[data-v-eaf4025e] {
|
|
116
|
+
padding: 8px 12px;
|
|
117
|
+
text-align: left;
|
|
118
|
+
border-bottom: 1px solid var(--vscode-panel-border);
|
|
119
|
+
}
|
|
120
|
+
.data-table th[data-v-eaf4025e] {
|
|
121
|
+
background-color: var(--vscode-editorGroupHeader-tabsBackground);
|
|
122
|
+
font-weight: 600;
|
|
123
|
+
position: sticky;
|
|
124
|
+
top: 0;
|
|
125
|
+
}
|
|
126
|
+
.data-table tbody tr[data-v-eaf4025e]:hover {
|
|
127
|
+
background-color: var(--vscode-list-hoverBackground);
|
|
128
|
+
}
|
|
129
|
+
.empty-state[data-v-eaf4025e] {
|
|
130
|
+
display: flex;
|
|
131
|
+
flex-direction: column;
|
|
132
|
+
align-items: center;
|
|
133
|
+
justify-content: center;
|
|
134
|
+
padding: 60px 20px;
|
|
135
|
+
text-align: center;
|
|
136
|
+
}
|
|
137
|
+
.empty-icon[data-v-eaf4025e] {
|
|
138
|
+
font-size: 48px;
|
|
139
|
+
margin-bottom: 16px;
|
|
140
|
+
opacity: 0.5;
|
|
141
|
+
}
|
|
142
|
+
.empty-text[data-v-eaf4025e] {
|
|
143
|
+
font-size: 14px;
|
|
144
|
+
color: var(--vscode-descriptionForeground);
|
|
145
|
+
}
|
|
146
|
+
.status-bar[data-v-eaf4025e] {
|
|
147
|
+
display: flex;
|
|
148
|
+
justify-content: space-between;
|
|
149
|
+
align-items: center;
|
|
150
|
+
padding: 8px 12px;
|
|
151
|
+
background-color: var(--vscode-statusBar-background);
|
|
152
|
+
color: var(--vscode-statusBar-foreground);
|
|
153
|
+
font-size: 12px;
|
|
154
|
+
}
|
|
155
|
+
.status-item[data-v-eaf4025e] {
|
|
156
|
+
display: flex;
|
|
157
|
+
align-items: center;
|
|
158
|
+
gap: 8px;
|
|
159
|
+
}
|
|
160
|
+
.status-icon[data-v-eaf4025e] {
|
|
161
|
+
color: var(--vscode-textLink-foreground);
|
|
162
|
+
}
|