fix: 前端树形按钮变更为右击显示,后端修复协程panic导致进程退出

This commit is contained in:
meilin.huang
2021-12-02 10:35:48 +08:00
parent d762d346e0
commit fb0fc274b4
10 changed files with 230 additions and 166 deletions

View File

@@ -96,7 +96,6 @@
import { toRefs, reactive, computed, defineComponent, ref } from 'vue';
import { dbApi } from './api';
import 'codemirror/theme/ambiance.css';
import 'codemirror/addon/hint/show-hint.css';
// import base style
import 'codemirror/lib/codemirror.css';
@@ -210,7 +209,13 @@ export default defineComponent({
// 没有选中的文本,则为全部文本
let sql = getSql();
notNull(sql, '内容不能为空');
runSqlStr(sql);
};
/**
* 执行sql str
*/
const runSqlStr = async (sql: string) => {
state.execRes.tableColumn = [];
state.execRes.data = [];
state.execRes.emptyResText = '查询中...';
@@ -336,7 +341,7 @@ export default defineComponent({
// 赋值第一个表信息
if (state.tableMetadata.length > 0) {
state.tableName = state.tableMetadata[0]['tableName'];
changeTable(state.tableName);
changeTable(state.tableName, false);
}
});
@@ -367,14 +372,22 @@ export default defineComponent({
};
// 选择表事件
const changeTable = async (tableName: string) => {
const changeTable = (tableName: string, execSelectSql: boolean = true) => {
if (tableName == '') {
return;
}
state.columnMetadata = await dbApi.columnMetadata.request({
id: state.dbId,
tableName: tableName,
});
dbApi.columnMetadata
.request({
id: state.dbId,
tableName: tableName,
})
.then((res) => {
state.columnMetadata = res;
});
if (execSelectSql) {
runSqlStr(`SELECT * FROM ${tableName} ORDER BY create_time DESC LIMIT 25`);
}
};
/**

View File

@@ -51,78 +51,89 @@
<el-dialog :title="tree.title" v-model="tree.visible" :close-on-click-modal="false" width="680px">
<div style="height: 45vh; overflow: auto">
<el-tree v-if="tree.visible" ref="fileTree" :load="loadNode" :props="props" lazy node-key="id" :expand-on-click-node="false">
<el-tree v-if="tree.visible" ref="fileTree" :load="loadNode" :props="props" lazy node-key="id" :expand-on-click-node="true">
<template #default="{ node, data }">
<span class="custom-tree-node">
<span v-if="data.type == 'd' && !node.expanded">
<i class="el-icon-folder"></i>
</span>
<span v-if="data.type == 'd' && node.expanded">
<i class="el-icon-folder-opened"></i>
</span>
<span v-if="data.type == '-'">
<i class="el-icon-document"></i>
</span>
<el-dropdown size="small" trigger="contextmenu">
<span class="el-dropdown-link">
<span v-if="data.type == 'd' && !node.expanded">
<i class="el-icon-folder"></i>
</span>
<span v-if="data.type == 'd' && node.expanded">
<i class="el-icon-folder-opened"></i>
</span>
<span v-if="data.type == '-'">
<i class="el-icon-document"></i>
</span>
<span style="display: inline-block; width: 430px">
{{ node.label }}
<span style="color: #67c23a" v-if="data.type == '-'">&nbsp;&nbsp;[{{ formatFileSize(data.size) }}]</span>
</span>
<span style="display: inline-block">
{{ node.label }}
<span style="color: #67c23a" v-if="data.type == '-'">&nbsp;&nbsp;[{{ formatFileSize(data.size) }}]</span>
</span>
</span>
<span>
<el-link
@click.prevent="getFileContent(tree.folder.id, data.path)"
v-if="data.type == '-' && data.size < 1 * 1024 * 1024"
type="info"
icon="el-icon-view"
:underline="false"
/>
<el-upload
:before-upload="beforeUpload"
:on-success="uploadSuccess"
:headers="{ token }"
:data="{
fileId: tree.folder.id,
path: data.path,
machineId: machineId,
}"
:action="getUploadFile({ path: data.path })"
:show-file-list="false"
name="file"
multiple
:limit="100"
style="display: inline-block; margin-left: 2px"
>
<el-link
v-auth="'machine:file:upload'"
v-if="data.type == 'd'"
@click.prevent
icon="el-icon-upload"
:underline="false"
/>
</el-upload>
<el-link
v-auth="'machine:file:write'"
v-if="data.type == '-'"
@click.prevent="downloadFile(node, data)"
type="danger"
icon="el-icon-download"
:underline="false"
style="margin-left: 2px"
/>
<el-link
v-auth="'machine:file:rm'"
v-if="!dontOperate(data)"
@click.prevent="deleteFile(node, data)"
type="danger"
icon="el-icon-delete"
:underline="false"
style="margin-left: 2px"
/>
</span>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item>
<el-link
@click.prevent="getFileContent(tree.folder.id, data.path)"
v-if="data.type == '-' && data.size < 1 * 1024 * 1024"
type="info"
icon="el-icon-view"
:underline="false"
>
查看
</el-link>
</el-dropdown-item>
<el-dropdown-item v-if="data.type == 'd'">
<el-upload
:before-upload="beforeUpload"
:on-success="uploadSuccess"
:headers="{ token }"
:data="{
fileId: tree.folder.id,
path: data.path,
machineId: machineId,
}"
:action="getUploadFile({ path: data.path })"
:show-file-list="false"
name="file"
multiple
:limit="100"
style="display: inline-block; margin-left: 2px"
>
<el-link v-auth="'machine:file:upload'" @click.prevent icon="el-icon-upload" :underline="false">
上传
</el-link>
</el-upload>
</el-dropdown-item>
<el-dropdown-item>
<el-link
v-auth="'machine:file:write'"
v-if="data.type == '-'"
@click.prevent="downloadFile(node, data)"
type="primary"
icon="el-icon-download"
:underline="false"
style="margin-left: 2px"
>下载</el-link
>
</el-dropdown-item>
<el-dropdown-item>
<el-link
v-auth="'machine:file:rm'"
v-if="!dontOperate(data)"
@click.prevent="deleteFile(node, data)"
type="danger"
icon="el-icon-delete"
:underline="false"
style="margin-left: 2px"
>删除
</el-link>
</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</span>
</template>
</el-tree>
@@ -458,8 +469,8 @@ export default defineComponent({
};
const beforeUpload = (file: File) => {
ElMessage.success(`'${file.name}' 上传中,请关注结果通知`)
}
ElMessage.success(`'${file.name}' 上传中,请关注结果通知`);
};
const dontOperate = (data: any) => {
const path = data.path;

View File

@@ -48,19 +48,19 @@
</el-radio>
</template>
</el-table-column>
<el-table-column prop="name" label="名称" width></el-table-column>
<el-table-column prop="ip" label="ip:port" min-width="160">
<el-table-column prop="name" label="名称" min-width="130"></el-table-column>
<el-table-column prop="ip" label="ip:port" min-width="130">
<template #default="scope">
{{ `${scope.row.ip}:${scope.row.port}` }}
</template>
</el-table-column>
<el-table-column prop="ip" label="hasCli" min-width="60">
<el-table-column prop="ip" label="hasCli" width="70">
<template #default="scope">
{{ `${scope.row.hasCli ? '是' : '否'}` }}
</template>
</el-table-column>
<el-table-column prop="username" label="用户名" :min-width="55"></el-table-column>
<el-table-column prop="createTime" label="创建时间" min-width="160">
<el-table-column prop="username" label="用户名" min-width="75"></el-table-column>
<el-table-column prop="createTime" label="创建时间" width="160">
<template #default="scope">
{{ $filters.dateFormat(scope.row.createTime) }}
</template>
@@ -72,9 +72,8 @@
</template>
</el-table-column>
<el-table-column prop="modifier" label="修改者" :min-width="55"></el-table-column> -->
<el-table-column label="操作" min-width="260">
<el-table-column label="操作" min-width="260" fixed="right">
<template #default="scope">
<!-- <el-button type="primary" @click="monitor(scope.row.id)" icom="el-icon-tickets" size="mini" plain>监控</el-button> -->
<el-button type="success" @click="serviceManager(scope.row)" size="mini" plain>脚本</el-button>
<el-button v-auth="'machine:terminal'" type="primary" @click="showTerminal(scope.row)" size="mini" plain>终端</el-button>
<el-button :disabled="!scope.row.hasCli" type="danger" @click="closeCli(scope.row)" size="mini" plain>关闭连接</el-button>

View File

@@ -4,6 +4,7 @@ export const machineApi = {
// 获取权限列表
list: Api.create("/machines", 'get'),
info: Api.create("/machines/{id}/sysinfo", 'get'),
stats: Api.create("/machines/{id}/stats", 'get'),
closeCli: Api.create("/machines/{id}/close-cli", 'delete'),
// 保存按钮
saveMachine: Api.create("/machines", 'post'),

View File

@@ -126,7 +126,7 @@
:data="showResourceDialog.resources"
node-key="id"
:props="showResourceDialog.defaultProps"
:expand-on-click-node="false"
:expand-on-click-node="true"
>
<template #default="{ node, data }">
<span class="custom-tree-node">

View File

@@ -2,7 +2,7 @@
<div class="menu">
<div class="toolbar">
<div>
<span style="font-size: 14px"> <i class="el-icon-info"></i>红色字体表示禁用状态 </span>
<span style="font-size: 14px"> <i class="el-icon-info"></i>红色字体表示禁用状态,右击鼠标显示操作 </span>
</div>
<el-button v-auth="'resource:add'" type="primary" icon="el-icon-plus" size="mini" @click="addResource(false)">添加</el-button>
</div>
@@ -15,74 +15,93 @@
@node-expand="handleNodeExpand"
@node-collapse="handleNodeCollapse"
:default-expanded-keys="defaultExpandedKeys"
:expand-on-click-node="false"
:expand-on-click-node="true"
>
<template #default="{ data }">
<span class="custom-tree-node">
<span style="font-size: 13px" v-if="data.type === enums.ResourceTypeEnum.MENU.value">
<span style="color: #3c8dbc"></span>
{{ data.name }}
<span style="color: #3c8dbc"></span>
<el-tag v-if="data.children !== null" size="mini">{{ data.children.length }}</el-tag>
</span>
<span style="font-size: 13px" v-if="data.type === enums.ResourceTypeEnum.PERMISSION.value">
<span style="color: #3c8dbc"></span>
<span :style="data.status == 1 ? 'color: #67c23a;' : 'color: #f67c6c;'">{{ data.name }}</span>
<span style="color: #3c8dbc"></span>
</span>
<el-link @click.prevent="info(data)" style="margin-left: 25px" icon="el-icon-view" type="info" :underline="false" />
<el-link
v-auth="'resource:update'"
@click.prevent="editResource(data)"
class="ml5"
type="primary"
icon="el-icon-edit"
:underline="false"
/>
<el-link
v-auth="'resource:add'"
@click.prevent="addResource(data)"
v-if="data.type === enums.ResourceTypeEnum.MENU.value"
icon="el-icon-circle-plus-outline"
:underline="false"
type="success"
class="ml5"
/>
<el-link
v-auth="'resource:changeStatus'"
@click.prevent="changeStatus(data, -1)"
v-if="data.status === 1 && data.type === enums.ResourceTypeEnum.PERMISSION.value"
icon="el-icon-circle-close"
:underline="false"
type="warning"
class="ml5"
/>
<el-link
v-auth="'resource:changeStatus'"
@click.prevent="changeStatus(data, 1)"
v-if="data.status === -1 && data.type === enums.ResourceTypeEnum.PERMISSION.value"
type="success"
icon="el-icon-circle-check"
:underline="false"
plain
class="ml5"
/>
<el-link
v-auth="'resource:del'"
v-if="data.children == null && data.name !== '首页'"
@click.prevent="deleteMenu(data)"
type="danger"
icon="el-icon-remove-outline"
:underline="false"
plain
class="ml5"
/>
<el-dropdown size="mini" trigger="contextmenu">
<span class="el-dropdown-link">
<span style="font-size: 13px" v-if="data.type === enums.ResourceTypeEnum.MENU.value">
<span style="color: #3c8dbc"></span>
{{ data.name }}
<span style="color: #3c8dbc"></span>
<el-tag v-if="data.children !== null" size="mini">{{ data.children.length }}</el-tag>
</span>
<span style="font-size: 13px" v-if="data.type === enums.ResourceTypeEnum.PERMISSION.value">
<span style="color: #3c8dbc"></span>
<span :style="data.status == 1 ? 'color: #67c23a;' : 'color: #f67c6c;'">{{ data.name }}</span>
<span style="color: #3c8dbc"></span>
</span>
</span>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item>
<el-link @click.prevent="info(data)" icon="el-icon-view" type="info" :underline="false">查看</el-link>
</el-dropdown-item>
<el-dropdown-item>
<el-link
v-auth="'resource:update'"
@click.prevent="editResource(data)"
type="primary"
icon="el-icon-edit"
:underline="false"
>
修改
</el-link>
</el-dropdown-item>
<el-dropdown-item>
<el-link
v-auth="'resource:add'"
@click.prevent="addResource(data)"
v-if="data.type === enums.ResourceTypeEnum.MENU.value"
icon="el-icon-circle-plus-outline"
:underline="false"
type="success"
>
新增
</el-link></el-dropdown-item
>
<el-dropdown-item>
<el-link
v-auth="'resource:changeStatus'"
@click.prevent="changeStatus(data, -1)"
v-if="data.status === 1 && data.type === enums.ResourceTypeEnum.PERMISSION.value"
icon="el-icon-circle-close"
:underline="false"
type="warning"
>
禁用
</el-link>
</el-dropdown-item>
<el-dropdown-item>
<el-link
v-auth="'resource:changeStatus'"
@click.prevent="changeStatus(data, 1)"
v-if="data.status === -1 && data.type === enums.ResourceTypeEnum.PERMISSION.value"
type="success"
icon="el-icon-circle-check"
:underline="false"
plain
>
启用
</el-link>
</el-dropdown-item>
<el-dropdown-item>
<el-link
v-auth="'resource:del'"
v-if="data.children == null && data.name !== '首页'"
@click.prevent="deleteMenu(data)"
type="danger"
icon="el-icon-remove-outline"
:underline="false"
plain
>
删除
</el-link>
</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</span>
</template>
</el-tree>
@@ -201,7 +220,7 @@ export default defineComponent({
id: data.id,
})
.then((res) => {
console.log(res)
console.log(res);
ElMessage.success('删除成功!');
search();
});