mirror of
https://gitee.com/dromara/mayfly-go
synced 2025-11-04 00:10:25 +08:00
fix: 前端树形按钮变更为右击显示,后端修复协程panic导致进程退出
This commit is contained in:
@@ -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`);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
@@ -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 == '-'"> [{{ formatFileSize(data.size) }}]</span>
|
||||
</span>
|
||||
<span style="display: inline-block">
|
||||
{{ node.label }}
|
||||
<span style="color: #67c23a" v-if="data.type == '-'"> [{{ 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;
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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'),
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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();
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user