feat: sql执行改为选中鼠标右击显示执行按钮等

This commit is contained in:
meilin.huang
2022-04-12 17:14:44 +08:00
parent 6e38ad320e
commit a9d6c5f7ee
3 changed files with 49 additions and 36 deletions

View File

@@ -41,7 +41,7 @@ const service = Axios.create({
// request interceptor // request interceptor
service.interceptors.request.use( service.interceptors.request.use(
config => { (config: any) => {
// do something before request is sent // do something before request is sent
const token = getSession("token") const token = getSession("token")
if (token) { if (token) {
@@ -99,7 +99,7 @@ service.interceptors.response.use(
* @param {Object} uri uri * @param {Object} uri uri
* @param {Object} params 参数 * @param {Object} params 参数
*/ */
function request(method: string, url: string, params: any, headers: any, options: any): Promise<any> { function request(method: string, url: string, params: any = null, headers: any = null, options: any = null): Promise<any> {
if (!url) if (!url)
throw new Error('请求url不能为空'); throw new Error('请求url不能为空');
// 简单判断该url是否是restful风格 // 简单判断该url是否是restful风格

View File

@@ -1,5 +1,9 @@
<template> <template>
<div> <div>
<el-button-group :style="btnStyle">
<el-button @click="onRunSql" type="success" icon="video-play" size="small" plain>执行</el-button>
<el-button @click="formatSql" type="primary" icon="magic-stick" size="small" plain>格式化</el-button>
</el-button-group>
<div class="toolbar"> <div class="toolbar">
<el-row type="flex" justify="space-between"> <el-row type="flex" justify="space-between">
<el-col :span="24"> <el-col :span="24">
@@ -82,12 +86,8 @@
</div> </div>
</div> </div>
<div class="mt5 sqlEditor" @mousemove="listenMouse"> <div @click="closeExecBtns" class="mt5 sqlEditor" @contextmenu="showExecBtns">
<textarea ref="codeTextarea"></textarea> <textarea ref="codeTextarea"></textarea>
<el-button-group :style="btnStyle">
<el-button @click="onRunSql" type="success" icon="video-play" size="small" plain>执行</el-button>
<el-button @click="formatSql" type="primary" icon="magic-stick" size="small" plain>格式化</el-button>
</el-button-group>
</div> </div>
<div class="mt5"> <div class="mt5">
@@ -189,7 +189,6 @@
<script lang="ts"> <script lang="ts">
import { onMounted, toRefs, reactive, defineComponent, ref } from 'vue'; import { onMounted, toRefs, reactive, defineComponent, ref } from 'vue';
import { dbApi } from './api'; import { dbApi } from './api';
import _ from 'lodash';
import 'codemirror/addon/hint/show-hint.css'; import 'codemirror/addon/hint/show-hint.css';
// import base style // import base style
@@ -297,15 +296,27 @@ export default defineComponent({
// 将sql提示去除 // 将sql提示去除
changeObj.text[0] = text.split(' ')[0]; changeObj.text[0] = text.split(' ')[0];
}); });
// 默认300px
codemirror.setSize('auto', `${window.innerHeight - 538}px`);
}; };
onMounted(() => { onMounted(() => {
initCodemirror(); initCodemirror();
state.dataTabsTableHeight = window.innerHeight - 258; setHeight();
// 监听浏览器窗口大小变化,更新对应组件高度
window.onresize = () => (() => {
setHeight();
})();
}); });
/**
* 设置codemirror高度和数据表高度
*/
const setHeight = () => {
// 默认300px
codemirror.setSize('auto', `${window.innerHeight - 538}px`);
state.dataTabsTableHeight = window.innerHeight - 258;
}
/** /**
* 项目及环境更改后的回调事件 * 项目及环境更改后的回调事件
*/ */
@@ -332,7 +343,7 @@ export default defineComponent({
notBlank(state.dbId, '请先选择数据库'); notBlank(state.dbId, '请先选择数据库');
// 没有选中的文本,则为全部文本 // 没有选中的文本,则为全部文本
let sql = getSql(); let sql = getSql();
notBlank(sql.trim(), 'sql内容不能为空'); isTrue(sql && sql.trim(), '请选中需要执行的sql');
state.queryTab.loading = true; state.queryTab.loading = true;
// 即只有以该字符串开头的sql才可修改表数据内容 // 即只有以该字符串开头的sql才可修改表数据内容
@@ -360,6 +371,7 @@ export default defineComponent({
} catch (e: any) { } catch (e: any) {
state.queryTab.loading = false; state.queryTab.loading = false;
} }
closeExecBtns();
}; };
/** /**
@@ -499,7 +511,7 @@ export default defineComponent({
const getSql = () => { const getSql = () => {
// 没有选中的文本,则为全部文本 // 没有选中的文本,则为全部文本
let selectSql = codemirror.getSelection(); let selectSql = codemirror.getSelection();
if (selectSql == '') { if (!selectSql) {
selectSql = getCodermirrorValue(); selectSql = getCodermirrorValue();
} }
return selectSql; return selectSql;
@@ -649,7 +661,7 @@ export default defineComponent({
if (res) { if (res) {
setCodermirrorValue(res.sql); setCodermirrorValue(res.sql);
} else { } else {
setCodermirrorValue(''); setCodermirrorValue('');
} }
}); });
}; };
@@ -730,6 +742,7 @@ export default defineComponent({
state.queryTab.execRes.tableColumn = []; state.queryTab.execRes.tableColumn = [];
state.cmOptions.hintOptions.tables = []; state.cmOptions.hintOptions.tables = [];
tableMap.clear(); tableMap.clear();
closeExecBtns();
}; };
const onDataSelectionChange = (datas: []) => { const onDataSelectionChange = (datas: []) => {
@@ -872,13 +885,9 @@ export default defineComponent({
*/ */
const formatSql = () => { const formatSql = () => {
let selectSql = codemirror.getSelection(); let selectSql = codemirror.getSelection();
// 有选中sql则只格式化选中部分否则格式化全部 isTrue(selectSql, '请选中需要格式化的sql');
if (selectSql != '') { codemirror.replaceSelection(sqlFormatter(selectSql));
codemirror.replaceSelection(sqlFormatter(selectSql)); closeExecBtns();
} else {
/* 将sql内容进行格式后放入编辑器中*/
setCodermirrorValue(sqlFormatter(getCodermirrorValue()));
}
}; };
const search = async () => { const search = async () => {
@@ -887,25 +896,28 @@ export default defineComponent({
}; };
/** /**
* 获取选择文字,显示隐藏按钮,防抖 * 显示执行sql和格式化按钮
*/ */
const getSelection = _.debounce((e: any) => { const showExecBtns = (event: any) => {
let temp = codemirror.getSelection(); if (event.preventDefault) {
if (temp) { event.preventDefault();
state.btnStyle.display = 'block';
if (!state.btnStyle.left) {
state.btnStyle.left = e.target.getBoundingClientRect().left;
state.btnStyle.top = e.target.getBoundingClientRect().top - 160 + 'px';
}
} else { } else {
event.returnValue = false;
}
state.btnStyle.display = 'inline';
state.btnStyle.left = event.offsetX + 15 + 'px';
state.btnStyle.top = event.clientY - 80 + 'px';
};
/**
* 关闭执行sql和格式化按钮
*/
const closeExecBtns = () => {
if (state.btnStyle.left) {
state.btnStyle.display = 'none'; state.btnStyle.display = 'none';
state.btnStyle.left = ''; state.btnStyle.left = '';
state.btnStyle.top = ''; state.btnStyle.top = '';
} }
}, 100);
const listenMouse = (e: any) => {
getSelection(e);
}; };
return { return {
@@ -929,7 +941,6 @@ export default defineComponent({
clearDb, clearDb,
formatSql, formatSql,
onBeforeChange, onBeforeChange,
listenMouse,
onRefresh, onRefresh,
selectByCondition, selectByCondition,
onCommit, onCommit,
@@ -937,6 +948,8 @@ export default defineComponent({
onDataSelectionChange, onDataSelectionChange,
onDeleteData, onDeleteData,
onTableSortChange, onTableSortChange,
showExecBtns,
closeExecBtns,
}; };
}, },
}); });

View File

@@ -189,7 +189,7 @@ import { recommendList } from './mock.ts';
import { useStore } from '@/store/index.ts'; import { useStore } from '@/store/index.ts';
import { personApi } from './api'; import { personApi } from './api';
export default { export default {
name: 'personal', name: 'PersonalPage',
setup() { setup() {
const store = useStore(); const store = useStore();
const state = reactive({ const state = reactive({