feat: Update CellData.sql with new SELECT and DROP statements; enhance ScriptPanel.vue with collapsible log section and SQL completion support
This commit is contained in:
+15
-1
@@ -1 +1,15 @@
|
|||||||
# demo
|
SELECT * FROM `cellinfo`;
|
||||||
|
DROP TABLE IF EXISTS `4G`;
|
||||||
|
DROP TABLE IF EXISTS `5G`;
|
||||||
|
DROP TABLE IF EXISTS `4G_Date`;
|
||||||
|
DROP TABLE IF EXISTS `4G_MAX`;
|
||||||
|
DROP TABLE IF EXISTS `CCE_MAX`;
|
||||||
|
DROP TABLE IF EXISTS `ULPRB_MAX`;
|
||||||
|
DROP TABLE IF EXISTS `DLPRB_MAX`;
|
||||||
|
DROP TABLE IF EXISTS `4G_MAX_IDX`;
|
||||||
|
DROP TABLE IF EXISTS `CCE_MAX_IDX`;
|
||||||
|
DROP TABLE IF EXISTS `ULPRB_MAX_IDX`;
|
||||||
|
DROP TABLE IF EXISTS `DLPRB_MAX_IDX`;
|
||||||
|
DROP TABLE IF EXISTS `日流量`;
|
||||||
|
DROP TABLE IF EXISTS `4G日均流量`;
|
||||||
|
DROP TABLE IF EXISTS `4G_结果表`;
|
||||||
|
|||||||
@@ -5,17 +5,15 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div v-if="taskStatus || taskId" class="script-process-section">
|
<div v-if="taskStatus || taskId" class="script-process-section">
|
||||||
<div class="upload-process-card script-process-card">
|
<n-collapse>
|
||||||
<div class="card-header">
|
<n-collapse-item name="log">
|
||||||
<div class="card-header-left">
|
<template #header>
|
||||||
<span class="card-title">脚本执行进度</span>
|
<span class="card-title">脚本执行进度</span>
|
||||||
<span class="process-status" :class="statusClass">{{ statusText }}</span>
|
<span class="process-status" :class="statusClass" style="margin-left:8px">{{ statusText }}</span>
|
||||||
</div>
|
</template>
|
||||||
<div class="card-header-right">
|
<template #header-extra>
|
||||||
<n-button size="small" tertiary :disabled="!taskId" @click="refreshStatus">刷新</n-button>
|
<n-button size="tiny" quaternary :disabled="!taskId" @click.stop="refreshStatus">刷新</n-button>
|
||||||
</div>
|
</template>
|
||||||
</div>
|
|
||||||
<div class="card-body">
|
|
||||||
<div class="colored-log-panel script-log" role="log" aria-label="脚本执行日志">
|
<div class="colored-log-panel script-log" role="log" aria-label="脚本执行日志">
|
||||||
<pre class="colored-log-content"><span
|
<pre class="colored-log-content"><span
|
||||||
v-for="(line, index) in logLines"
|
v-for="(line, index) in logLines"
|
||||||
@@ -24,8 +22,8 @@
|
|||||||
:class="`log-level-${line.level}`"
|
:class="`log-level-${line.level}`"
|
||||||
>{{ line.text }}</span></pre>
|
>{{ line.text }}</span></pre>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</n-collapse-item>
|
||||||
</div>
|
</n-collapse>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="script-status-bar">
|
<div class="script-status-bar">
|
||||||
@@ -48,6 +46,7 @@ import {
|
|||||||
import * as monaco from 'monaco-editor/esm/vs/editor/editor.api.js';
|
import * as monaco from 'monaco-editor/esm/vs/editor/editor.api.js';
|
||||||
import editorWorker from 'monaco-editor/esm/vs/editor/editor.worker?worker';
|
import editorWorker from 'monaco-editor/esm/vs/editor/editor.worker?worker';
|
||||||
import 'monaco-editor/esm/vs/basic-languages/sql/sql.contribution';
|
import 'monaco-editor/esm/vs/basic-languages/sql/sql.contribution';
|
||||||
|
import { language as mysqlLanguage } from 'monaco-editor/esm/vs/basic-languages/mysql/mysql.js';
|
||||||
|
|
||||||
import { apiPost } from '../api/client';
|
import { apiPost } from '../api/client';
|
||||||
import type { ApiMessage, ScriptContent, TaskStatus } from '../types';
|
import type { ApiMessage, ScriptContent, TaskStatus } from '../types';
|
||||||
@@ -220,6 +219,42 @@ function createEditor() {
|
|||||||
void saveScript();
|
void saveScript();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const completionItems: Array<{ label: string; kind: monaco.languages.CompletionItemKind }> = [];
|
||||||
|
const seen = new Set<string>();
|
||||||
|
const add = (list: string[] | undefined, kind: monaco.languages.CompletionItemKind) => {
|
||||||
|
for (const item of list || []) {
|
||||||
|
const upper = item.toUpperCase();
|
||||||
|
if (!seen.has(upper)) {
|
||||||
|
seen.add(upper);
|
||||||
|
completionItems.push({ label: upper, kind });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
add(mysqlLanguage.keywords as string[], monaco.languages.CompletionItemKind.Keyword);
|
||||||
|
add(mysqlLanguage.operators as string[], monaco.languages.CompletionItemKind.Operator);
|
||||||
|
add(mysqlLanguage.builtinFunctions as string[], monaco.languages.CompletionItemKind.Function);
|
||||||
|
disposables.push(
|
||||||
|
monaco.languages.registerCompletionItemProvider('sql', {
|
||||||
|
provideCompletionItems(model, position) {
|
||||||
|
const word = model.getWordUntilPosition(position);
|
||||||
|
const range = {
|
||||||
|
startLineNumber: position.lineNumber,
|
||||||
|
endLineNumber: position.lineNumber,
|
||||||
|
startColumn: word.startColumn,
|
||||||
|
endColumn: word.endColumn,
|
||||||
|
};
|
||||||
|
return {
|
||||||
|
suggestions: completionItems.map(item => ({
|
||||||
|
label: item.label,
|
||||||
|
kind: item.kind,
|
||||||
|
insertText: item.label,
|
||||||
|
range,
|
||||||
|
})),
|
||||||
|
};
|
||||||
|
},
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
updateCursor();
|
updateCursor();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+4
-19
@@ -2248,28 +2248,13 @@ select {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.script-process-section {
|
.script-process-section {
|
||||||
flex: 0 1 clamp(168px, 26vh, 280px);
|
flex: 0 0 auto;
|
||||||
min-height: 148px;
|
|
||||||
margin: 8px 16px 0;
|
margin: 8px 16px 0;
|
||||||
overflow: hidden;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.script-process-card {
|
.script-process-section .script-log {
|
||||||
display: flex;
|
max-height: clamp(140px, 22vh, 240px);
|
||||||
height: 100%;
|
overflow: auto;
|
||||||
min-height: 0;
|
|
||||||
flex-direction: column;
|
|
||||||
}
|
|
||||||
|
|
||||||
.script-process-section .card-body {
|
|
||||||
flex: 1;
|
|
||||||
min-height: 0;
|
|
||||||
padding: 12px 16px 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.script-log {
|
|
||||||
height: 100%;
|
|
||||||
min-height: 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ==================== Responsive ==================== */
|
/* ==================== Responsive ==================== */
|
||||||
|
|||||||
Reference in New Issue
Block a user