Skip to content

Commit 2424b76

Browse files
committed
feat: Optimize code editor intelli sense
1 parent 6520425 commit 2424b76

5 files changed

Lines changed: 149 additions & 88 deletions

File tree

chat2db-client/src/components/TabsNew/index.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ export default memo<IProps>((props) => {
3737
const [internalTabs, setInternalTabs] = useState<ITabItem[]>([]);
3838
const [internalActiveTab, setInternalActiveTab] = useState<number | string | undefined>();
3939
const [editingTab, setEditingTab] = useState<ITabItem['key'] | undefined>();
40-
console.log('items', items);
4140

4241
useEffect(() => {
4342
if (activeKey !== null && activeKey !== undefined) {

chat2db-client/src/pages/main/workspace/components/WorkspaceRight/index.tsx

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,11 @@ import { handleLocalStorageSavedConsole } from '@/utils';
1717
import { useUpdateEffect } from '@/hooks/useUpdateEffect';
1818
import { v4 as uuidV4 } from 'uuid';
1919
import { IWorkspaceTab } from '@/typings';
20-
import { registerIntelliSenseField, registerIntelliSenseKeyword, registerIntelliSenseTable } from '@/utils/IntelliSense';
20+
import {
21+
registerIntelliSenseField,
22+
registerIntelliSenseKeyword,
23+
registerIntelliSenseTable,
24+
} from '@/utils/IntelliSense';
2125

2226
interface IProps {
2327
className?: string;
@@ -305,18 +309,16 @@ const WorkspaceRight = memo<IProps>((props: IProps) => {
305309
useEffect(() => {
306310
const { dataSourceId, databaseName, schemaName, databaseType } = curWorkspaceParams;
307311
if (databaseName) {
308-
fetch(
309-
`/api/rdb/table/table_list?dataSourceId=${dataSourceId}&databaseName=${databaseName}`,
310-
// `/api/rdb/table/table_list?dataSourceId=${dataSourceId}&databaseName=${databaseName}&schemaName=${schemaName}`,
311-
{},
312-
)
313-
.then((res) => {
314-
return res.json();
312+
sqlService
313+
.getAllTableList({
314+
dataSourceId,
315+
databaseName,
316+
schemaName,
315317
})
316318
.then((data) => {
317-
console.log('databaseName', data.data);
318-
tableList.current = (data.data || []).map((item: any) => item.name);
319-
registerIntelliSenseTable(data.data, databaseName, databaseType);
319+
console.log('databaseName', data);
320+
tableList.current = (data || []).map((item: any) => item.name);
321+
registerIntelliSenseTable(data, databaseName, databaseType);
320322
registerIntelliSenseField(tableList.current, dataSourceId, databaseName, schemaName);
321323
});
322324
}

chat2db-client/src/service/sql.ts

Lines changed: 115 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
11
import createRequest from './base';
2-
import { IPageResponse, IPageParams, IUniversalTableParams, IManageResultData, IRoutines, IDatabaseSupportField, IEditTableInfo } from '@/typings';
2+
import {
3+
IPageResponse,
4+
IPageParams,
5+
IUniversalTableParams,
6+
IManageResultData,
7+
IRoutines,
8+
IDatabaseSupportField,
9+
IEditTableInfo,
10+
} from '@/typings';
311
import { DatabaseTypeCode } from '@/constants';
412
import { ExportSizeEnum, ExportTypeEnum } from '@/typings/resultTable';
513

@@ -133,71 +141,112 @@ export interface IExportParams extends IExecuteSqlParams {
133141
const getViewList = createRequest<IGetListParams, IPageResponse<IRoutines>>('/api/rdb/view/list', { method: 'get' });
134142

135143
/** 获取函数列表 */
136-
const getFunctionList = createRequest<IGetListParams, IPageResponse<IRoutines>>('/api/rdb/function/list', { method: 'get' });
144+
const getFunctionList = createRequest<IGetListParams, IPageResponse<IRoutines>>('/api/rdb/function/list', {
145+
method: 'get',
146+
});
137147

138148
/** 获取触发器列表 */
139-
const getTriggerList = createRequest<IGetListParams, IPageResponse<IRoutines>>('/api/rdb/trigger/list', { method: 'get' });
149+
const getTriggerList = createRequest<IGetListParams, IPageResponse<IRoutines>>('/api/rdb/trigger/list', {
150+
method: 'get',
151+
});
140152

141153
/** 获取过程列表 */
142-
const getProcedureList = createRequest<IGetListParams, IPageResponse<IRoutines>>('/api/rdb/procedure/list', { method: 'get' });
154+
const getProcedureList = createRequest<IGetListParams, IPageResponse<IRoutines>>('/api/rdb/procedure/list', {
155+
method: 'get',
156+
});
143157

144158
/** 获取视图列列表 */
145-
const getViewColumnList = createRequest<IGetListParams, IPageResponse<IRoutines>>('/api/rdb/view/column_list', { method: 'get' });
159+
const getViewColumnList = createRequest<IGetListParams, IPageResponse<IRoutines>>('/api/rdb/view/column_list', {
160+
method: 'get',
161+
});
146162

147163
/** 获取视图详情 */
148-
const getViewDetail = createRequest<{
149-
dataSourceId: number;
150-
databaseName: string;
151-
schemaName?: string;
152-
tableName: string
153-
}, {ddl: string}>('/api/rdb/view/detail', { method: 'get' });
164+
const getViewDetail = createRequest<
165+
{
166+
dataSourceId: number;
167+
databaseName: string;
168+
schemaName?: string;
169+
tableName: string;
170+
},
171+
{ ddl: string }
172+
>('/api/rdb/view/detail', { method: 'get' });
154173

155174
/** 获取触发器详情 */
156-
const getTriggerDetail = createRequest<{
157-
dataSourceId: number;
158-
databaseName: string;
159-
schemaName?: string;
160-
triggerName: string
161-
}, {triggerBody: string}>('/api/rdb/trigger/detail', { method: 'get' });
175+
const getTriggerDetail = createRequest<
176+
{
177+
dataSourceId: number;
178+
databaseName: string;
179+
schemaName?: string;
180+
triggerName: string;
181+
},
182+
{ triggerBody: string }
183+
>('/api/rdb/trigger/detail', { method: 'get' });
162184

163185
/** 获取函数详情 */
164-
const getFunctionDetail = createRequest<{
165-
dataSourceId: number;
166-
databaseName: string;
167-
schemaName?: string;
168-
functionName: string
169-
}, {functionBody: string}>('/api/rdb/function/detail', { method: 'get' });
186+
const getFunctionDetail = createRequest<
187+
{
188+
dataSourceId: number;
189+
databaseName: string;
190+
schemaName?: string;
191+
functionName: string;
192+
},
193+
{ functionBody: string }
194+
>('/api/rdb/function/detail', { method: 'get' });
170195

171196
/** 获取过程详情 */
172-
const getProcedureDetail = createRequest<{
173-
dataSourceId: number;
174-
databaseName: string;
175-
schemaName?: string;
176-
procedureName: string
177-
}, { procedureBody: string }>('/api/rdb/procedure/detail', { method: 'get' });
197+
const getProcedureDetail = createRequest<
198+
{
199+
dataSourceId: number;
200+
databaseName: string;
201+
schemaName?: string;
202+
procedureName: string;
203+
},
204+
{ procedureBody: string }
205+
>('/api/rdb/procedure/detail', { method: 'get' });
178206

179207
/** 格式化sql */
180-
const sqlFormat = createRequest<{
181-
sql: string;
182-
dbType: DatabaseTypeCode;
183-
}, string>('/api/sql/format', { method: 'get' });
184-
185-
/** 数据库支持的数据类型 */
186-
const getDatabaseFieldTypeList = createRequest<{
187-
dataSourceId: number;
188-
databaseName: string;
189-
}, IDatabaseSupportField>('/api/rdb/table/table_meta', { method: 'get' });
190-
191-
/** 获取表的详情 */
192-
const getTableDetails = createRequest<{
193-
dataSourceId: number;
194-
databaseName: string;
195-
schemaName?: string | null;
196-
tableName: string;
197-
refresh: boolean;
198-
}, IEditTableInfo>('/api/rdb/table/query', { method: 'get' });
199-
200-
export interface IModifyTableSqlParams {
208+
const sqlFormat = createRequest<
209+
{
210+
sql: string;
211+
dbType: DatabaseTypeCode;
212+
},
213+
string
214+
>('/api/sql/format', { method: 'get' });
215+
216+
/** 数据库支持的数据类型 */
217+
const getDatabaseFieldTypeList = createRequest<
218+
{
219+
dataSourceId: number;
220+
databaseName: string;
221+
},
222+
IDatabaseSupportField
223+
>('/api/rdb/table/table_meta', { method: 'get' });
224+
225+
/** 获取表的详情 */
226+
const getTableDetails = createRequest<
227+
{
228+
dataSourceId: number;
229+
databaseName: string;
230+
schemaName?: string | null;
231+
tableName: string;
232+
refresh: boolean;
233+
},
234+
IEditTableInfo
235+
>('/api/rdb/table/query', { method: 'get' });
236+
237+
/** 获取库的所有表 */
238+
const getAllTableList = createRequest<
239+
{ dataSourceId: number; databaseName: string; schemaName?: string | null },
240+
Array<{ name: string; comment: string }>
241+
>('/api/rdb/table/table_list', { method: 'get' });
242+
243+
/** 获取表的所有字段 */
244+
const getAllFieldByTable = createRequest<
245+
{ dataSourceId: number; databaseName: string; schemaName?: string | null; tableName: string },
246+
Array<{ name: string; tableName: string }>
247+
>('/api/rdb/table/column_list', { method: 'get' });
248+
249+
export interface IModifyTableSqlParams {
201250
dataSourceId: number;
202251
databaseName: string;
203252
schemaName?: string | null;
@@ -207,16 +256,24 @@ export interface IModifyTableSqlParams {
207256
refresh: boolean;
208257
}
209258

210-
/** 获取修改表的sql */
211-
const getModifyTableSql = createRequest<IModifyTableSqlParams, { sql: string }[]>('/api/rdb/table/modify/sql', { method: 'post' });
259+
/** 获取修改表的sql */
260+
const getModifyTableSql = createRequest<IModifyTableSqlParams, { sql: string }[]>('/api/rdb/table/modify/sql', {
261+
method: 'post',
262+
});
212263

213-
/** 执行编辑表的sql, 专为编辑表而生 */
214-
const executeDDL = createRequest<IExecuteSqlParams, { success: boolean, message: string, originalSql: string }>('/api/rdb/dml/execute_ddl', { method: 'post' });
264+
/** 执行编辑表的sql, 专为编辑表而生 */
265+
const executeDDL = createRequest<IExecuteSqlParams, { success: boolean; message: string; originalSql: string }>(
266+
'/api/rdb/dml/execute_ddl',
267+
{ method: 'post' },
268+
);
215269

216270
// 执行修改表数据的sql
217-
const executeUpdateDataSql = createRequest<IExecuteSqlParams, { success: boolean, message: string, sql:string }>('/api/rdb/dml/execute_update', { method: 'post' });
271+
const executeUpdateDataSql = createRequest<IExecuteSqlParams, { success: boolean; message: string; sql: string }>(
272+
'/api/rdb/dml/execute_update',
273+
{ method: 'post' },
274+
);
218275

219-
/** 获取修改表数据的接口 */
276+
/** 获取修改表数据的接口 */
220277
const getExecuteUpdateSql = createRequest<any, string>('/api/rdb/dml/get_update_sql', { method: 'post' });
221278

222279
export default {
@@ -253,6 +310,6 @@ export default {
253310
deleteTablePin,
254311
getDMLCount,
255312
// exportResultTable
313+
getAllTableList,
314+
getAllFieldByTable
256315
};
257-
258-

chat2db-client/src/utils/IntelliSense/field.ts

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import * as monaco from 'monaco-editor/esm/vs/editor/editor.api';
2+
import sqlService from '@/service/sql';
23

3-
let fieldList: Record<string, string[]> = {};
4+
let fieldList: Record<string, Array<{ name: string; tableName: string }>> = {};
45

56
/** 当前库下的表 */
67
let intelliSenseField = monaco.languages.registerCompletionItemProvider('sql', {
@@ -15,9 +16,8 @@ const registerIntelliSenseField = (tableList: string[], dataSourceId, databaseNa
1516
intelliSenseField.dispose();
1617
fieldList = {};
1718
intelliSenseField = monaco.languages.registerCompletionItemProvider('sql', {
18-
triggerCharacters: [' ', '.'],
19+
triggerCharacters: [' ', '.', '`', "'", '"'],
1920
provideCompletionItems: async (model, position) => {
20-
console.log('registerIntelliSenseField start');
2121
// 获取到当前行文本
2222
const textUntilPosition = model.getValueInRange({
2323
startLineNumber: position.lineNumber,
@@ -26,24 +26,26 @@ const registerIntelliSenseField = (tableList: string[], dataSourceId, databaseNa
2626
endColumn: position.column,
2727
});
2828

29-
// 查找最后一个单词,这里通过正则获取空格或句号之前的最后一个单词
30-
const match = textUntilPosition.match(/([\w]+)[\s\.]$/);
29+
const match = textUntilPosition.match(/(\b\w+\b)[^\w]*$/);
30+
let word;
31+
if (match) {
32+
word = match[1];
33+
console.log(word); // 输出: text
34+
}
3135

32-
if (!match) {
36+
console.log('registerIntelliSenseField start', textUntilPosition, word);
37+
if (!word) {
3338
return; // 如果没有匹配到,直接返回
3439
}
35-
36-
const word = match[1]; // 获取匹配到的单词
37-
3840
if (word && tableList.includes(word) && !fieldList[word]) {
3941
console.log('registerIntelliSenseField start word');
40-
const response = await fetch(
41-
`/api/rdb/table/column_list?dataSourceId=${dataSourceId}&databaseName=${databaseName}&tableName=${word}`,
42-
{},
43-
);
44-
const data = await response.json();
45-
46-
fieldList[word] = data.data;
42+
const data = await sqlService.getAllFieldByTable({
43+
dataSourceId,
44+
databaseName,
45+
schemaName,
46+
tableName: word,
47+
});
48+
fieldList[word] = data;
4749
}
4850

4951
const suggestions = Object.keys(fieldList).reduce((acc, cur) => {

chat2db-client/src/utils/IntelliSense/table.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,13 @@ const registerIntelliSenseTable = (
1717
) => {
1818
intelliSenseTable.dispose();
1919
intelliSenseTable = monaco.languages.registerCompletionItemProvider('sql', {
20+
triggerCharacters: [' '],
2021
provideCompletionItems: (model, position) => {
2122
const handleInsertText = (text) => {
2223
if (databaseCode === DatabaseTypeCode.POSTGRESQL) {
23-
return `"${text}"`;
24+
return `${text}`;
2425
} else {
25-
return `\`${text}\``;
26+
return `${text}`;
2627
}
2728
};
2829
return {

0 commit comments

Comments
 (0)