refactor: 列表字段精简

This commit is contained in:
meilin.huang
2022-11-21 19:49:50 +08:00
parent 70c8b25a67
commit 86aac2bf08
12 changed files with 271 additions and 147 deletions

View File

@@ -7,13 +7,13 @@
"lint-fix": "eslint --fix --ext .js --ext .jsx --ext .vue src/" "lint-fix": "eslint --fix --ext .js --ext .jsx --ext .vue src/"
}, },
"dependencies": { "dependencies": {
"@element-plus/icons-vue": "^2.0.9", "@element-plus/icons-vue": "^2.0.10",
"asciinema-player": "^3.0.1", "asciinema-player": "^3.0.1",
"axios": "^1.1.2", "axios": "^1.1.2",
"countup.js": "^2.0.7", "countup.js": "^2.0.7",
"cropperjs": "^1.5.11", "cropperjs": "^1.5.11",
"echarts": "^5.3.3", "echarts": "^5.3.3",
"element-plus": "^2.2.20", "element-plus": "^2.2.22",
"jsencrypt": "^3.2.1", "jsencrypt": "^3.2.1",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"mitt": "^3.0.0", "mitt": "^3.0.0",
@@ -24,7 +24,7 @@
"screenfull": "^6.0.2", "screenfull": "^6.0.2",
"sortablejs": "^1.13.0", "sortablejs": "^1.13.0",
"sql-formatter": "^9.2.0", "sql-formatter": "^9.2.0",
"vue": "^3.2.41", "vue": "^3.2.45",
"vue-clipboard3": "^1.0.1", "vue-clipboard3": "^1.0.1",
"vue-router": "^4.1.6", "vue-router": "^4.1.6",
"vuex": "^4.0.2", "vuex": "^4.0.2",

View File

@@ -83,7 +83,7 @@ export default defineComponent({
() => route.path, () => route.path,
() => { () => {
initCurrentRouteMeta(route.meta); initCurrentRouteMeta(route.meta);
proxy.$refs.layoutScrollbarRef.wrap$.scrollTop = 0; proxy.$refs.layoutScrollbarRef.wrapRef.scrollTop = 0;
} }
); );
return { return {

View File

@@ -234,7 +234,7 @@ export default {
}; };
// 鼠标滚轮滚动 // 鼠标滚轮滚动
const onHandleScroll = (e: any) => { const onHandleScroll = (e: any) => {
proxy.$refs.scrollbarRef.$refs.wrap.scrollLeft += e.wheelDelta / 4; proxy.$refs.scrollbarRef.$refs.wrapRef.scrollLeft += e.wheelDelta / 4;
}; };
// tagsView 横向滚动 // tagsView 横向滚动
const tagsViewmoveToCurrentTag = () => { const tagsViewmoveToCurrentTag = () => {
@@ -251,7 +251,7 @@ export default {
// 最后 li // 最后 li
let liLast: any = tagsRefs.value[tagsRefs.value.length - 1]; let liLast: any = tagsRefs.value[tagsRefs.value.length - 1];
// 当前滚动条的值 // 当前滚动条的值
let scrollRefs = proxy.$refs.scrollbarRef.$refs.wrap$; let scrollRefs = proxy.$refs.scrollbarRef.$refs.wrapRef;
// 当前滚动条滚动宽度 // 当前滚动条滚动宽度
let scrollS = scrollRefs.scrollWidth; let scrollS = scrollRefs.scrollWidth;
// 当前滚动条偏移宽度 // 当前滚动条偏移宽度

View File

@@ -57,16 +57,13 @@
<el-table-column prop="username" label="用户名" min-width="100"></el-table-column> <el-table-column prop="username" label="用户名" min-width="100"></el-table-column>
<el-table-column prop="remark" label="备注" min-width="150" show-overflow-tooltip></el-table-column> <el-table-column prop="remark" label="备注" min-width="150" show-overflow-tooltip></el-table-column>
<el-table-column min-width="115" prop="creator" label="创建账号"></el-table-column> <el-table-column label="操作" min-width="160" fixed="right">
<el-table-column min-width="160" prop="createTime" label="创建时间" show-overflow-tooltip>
<template #default="scope"> <template #default="scope">
{{ dateFormat(scope.row.createTime) }} <el-link plain size="small" :underline="false" @click="showInfo(scope.row)">
</template> 详情</el-link>
</el-table-column> <el-divider direction="vertical" border-style="dashed" />
<el-link class="ml5" type="primary" plain size="small" :underline="false"
<el-table-column label="操作" min-width="120" fixed="right"> @click="onShowSqlExec(scope.row)">
<template #default="scope">
<el-link type="primary" plain size="small" :underline="false" @click="onShowSqlExec(scope.row)">
SQL执行记录</el-link> SQL执行记录</el-link>
</template> </template>
</el-table-column> </el-table-column>
@@ -144,9 +141,9 @@
<template #default="scope"> <template #default="scope">
<el-link @click.prevent="showColumns(scope.row)" type="primary">字段</el-link> <el-link @click.prevent="showColumns(scope.row)" type="primary">字段</el-link>
<el-link class="ml5" @click.prevent="showTableIndex(scope.row)" type="success">索引</el-link> <el-link class="ml5" @click.prevent="showTableIndex(scope.row)" type="success">索引</el-link>
<el-link class="ml5" <el-link class="ml5"
v-if="tableCreateDialog.enableEditTypes.indexOf(tableCreateDialog.type) > -1" v-if="tableCreateDialog.enableEditTypes.indexOf(tableCreateDialog.type) > -1"
@click.prevent="openEditTable(scope.row)" type="warning">编辑表</el-link> @click.prevent="openEditTable(scope.row)" type="warning">编辑表</el-link>
<el-link class="ml5" @click.prevent="showCreateDdl(scope.row)" type="info">DDL</el-link> <el-link class="ml5" @click.prevent="showCreateDdl(scope.row)" type="info">DDL</el-link>
</template> </template>
</el-table-column> </el-table-column>
@@ -242,15 +239,41 @@
size="small"> </el-input> size="small"> </el-input>
</el-dialog> </el-dialog>
<el-dialog v-model="infoDialog.visible">
<el-descriptions title="详情" :column="3" border>
<el-descriptions-item :span="1.5" label="id">{{ infoDialog.data.id }}</el-descriptions-item>
<el-descriptions-item :span="1.5" label="名称">{{ infoDialog.data.name }}</el-descriptions-item>
<el-descriptions-item :span="3" label="标签路径">{{ infoDialog.data.tagPath }}</el-descriptions-item>
<el-descriptions-item :span="2" label="主机">{{ infoDialog.data.host }}</el-descriptions-item>
<el-descriptions-item :span="1" label="端口">{{ infoDialog.data.port }}</el-descriptions-item>
<el-descriptions-item :span="2" label="用户名">{{ infoDialog.data.username }}</el-descriptions-item>
<el-descriptions-item :span="1" label="类型">{{ infoDialog.data.type }}</el-descriptions-item>
<el-descriptions-item :span="3" label="连接参数">{{ infoDialog.data.params }}</el-descriptions-item>
<el-descriptions-item :span="3" label="备注">{{ infoDialog.data.remark }}</el-descriptions-item>
<el-descriptions-item :span="3" label="数据库">{{ infoDialog.data.database }}</el-descriptions-item>
<el-descriptions-item :span="3" label="SSH隧道">{{ infoDialog.data.enableSshTunnel == 1 ? '是' : '否' }}
</el-descriptions-item>
<el-descriptions-item :span="2" label="创建时间">{{ dateFormat(infoDialog.data.createTime) }}
</el-descriptions-item>
<el-descriptions-item :span="1" label="创建者">{{ infoDialog.data.creator }}</el-descriptions-item>
<el-descriptions-item :span="2" label="更新时间">{{ dateFormat(infoDialog.data.updateTime) }}
</el-descriptions-item>
<el-descriptions-item :span="1" label="修改者">{{ infoDialog.data.modifier }}</el-descriptions-item>
</el-descriptions>
</el-dialog>
<db-edit @val-change="valChange" :title="dbEditDialog.title" v-model:visible="dbEditDialog.visible" <db-edit @val-change="valChange" :title="dbEditDialog.title" v-model:visible="dbEditDialog.visible"
v-model:db="dbEditDialog.data"></db-edit> v-model:db="dbEditDialog.data"></db-edit>
<create-table :title="tableCreateDialog.title" <create-table :title="tableCreateDialog.title" :active-name="tableCreateDialog.activeName" :dbId="dbId" :db="db"
:active-name="tableCreateDialog.activeName" :data="tableCreateDialog.data" v-model:visible="tableCreateDialog.visible" @submit-sql="onSubmitSql">
:dbId="dbId" :db="db" </create-table>
:data="tableCreateDialog.data"
v-model:visible="tableCreateDialog.visible"
@submit-sql="onSubmitSql"
></create-table>
</div> </div>
</template> </template>
@@ -298,6 +321,10 @@ const state = reactive({
}, },
datas: [], datas: [],
total: 0, total: 0,
infoDialog: {
visible: false,
data: null as any,
},
showDumpInfo: false, showDumpInfo: false,
dumpInfo: { dumpInfo: {
id: 0, id: 0,
@@ -355,7 +382,7 @@ const state = reactive({
visible: false, visible: false,
activeName: '1', activeName: '1',
type: '', type: '',
enableEditTypes:['mysql'], // 支持"编辑表"的数据库类型 enableEditTypes: ['mysql'], // 支持"编辑表"的数据库类型
data: { // 修改表时,传递修改数据 data: { // 修改表时,传递修改数据
edit: false, edit: false,
row: {}, row: {},
@@ -378,6 +405,7 @@ const {
query, query,
datas, datas,
total, total,
infoDialog,
showDumpInfo, showDumpInfo,
dumpInfo, dumpInfo,
sqlExecLogDialog, sqlExecLogDialog,
@@ -441,6 +469,11 @@ const handlePageChange = (curPage: number) => {
search(); search();
}; };
const showInfo = (info: any) => {
state.infoDialog.data = info;
state.infoDialog.visible = true;
}
const getTags = async () => { const getTags = async () => {
state.tags = await tagApi.getAccountTags.request(null); state.tags = await tagApi.getAccountTags.request(null);
}; };
@@ -589,7 +622,7 @@ const showTableInfo = async (row: any, db: string) => {
} }
}; };
const onSubmitSql = async (row: {tableName: string}) => { const onSubmitSql = async (row: { tableName: string }) => {
await openEditTable(row) await openEditTable(row)
state.tableInfoDialog.infos = await dbApi.tableInfos.request({ id: state.dbId, db: state.db }); state.tableInfoDialog.infos = await dbApi.tableInfos.request({ id: state.dbId, db: state.db });
} }

View File

@@ -246,7 +246,7 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import {onMounted, computed, toRefs, reactive, ref, watch} from 'vue'; import { onMounted, computed, toRefs, reactive, ref, watch } from 'vue';
import { dbApi } from './api'; import { dbApi } from './api';
import { format as sqlFormatter } from 'sql-formatter'; import { format as sqlFormatter } from 'sql-formatter';
@@ -408,7 +408,7 @@ const initMonacoEditor = () => {
// chord // chord
monaco.KeyMod.chord( monaco.KeyMod.chord(
monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyR monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyR
, 0) , 0)
], ],
contextMenuGroupId: 'navigation', contextMenuGroupId: 'navigation',
contextMenuOrder: 1.5, contextMenuOrder: 1.5,
@@ -436,7 +436,7 @@ const initMonacoEditor = () => {
// chord // chord
monaco.KeyMod.chord( monaco.KeyMod.chord(
monaco.KeyMod.CtrlCmd | monaco.KeyMod.Shift | monaco.KeyCode.KeyF monaco.KeyMod.CtrlCmd | monaco.KeyMod.Shift | monaco.KeyCode.KeyF
,0) , 0)
], ],
contextMenuGroupId: 'navigation', contextMenuGroupId: 'navigation',
contextMenuOrder: 2, contextMenuOrder: 2,
@@ -515,7 +515,7 @@ const initMonacoEditor = () => {
const { tableName, tableComment } = item const { tableName, tableComment } = item
suggestions.push({ suggestions.push({
label: { label: {
label: tableName + ( tableComment ? ' - ' + tableComment :'' ), label: tableName + (tableComment ? ' - ' + tableComment : ''),
description: 'table' description: 'table'
}, },
kind: monaco.languages.CompletionItemKind.File, kind: monaco.languages.CompletionItemKind.File,
@@ -569,7 +569,7 @@ const initMonacoEditor = () => {
sqlLanguage.keywords.forEach((item: any) => { sqlLanguage.keywords.forEach((item: any) => {
suggestions.push({ suggestions.push({
label: { label: {
label:item, label: item,
description: 'keyword' description: 'keyword'
}, },
kind: monaco.languages.CompletionItemKind.Keyword, kind: monaco.languages.CompletionItemKind.Keyword,
@@ -581,7 +581,7 @@ const initMonacoEditor = () => {
sqlLanguage.operators.forEach((item: any) => { sqlLanguage.operators.forEach((item: any) => {
suggestions.push({ suggestions.push({
label: { label: {
label:item, label: item,
description: 'opt' description: 'opt'
}, },
kind: monaco.languages.CompletionItemKind.Operator, kind: monaco.languages.CompletionItemKind.Operator,
@@ -593,7 +593,7 @@ const initMonacoEditor = () => {
sqlLanguage.builtinFunctions.forEach((item: any) => { sqlLanguage.builtinFunctions.forEach((item: any) => {
suggestions.push({ suggestions.push({
label: { label: {
label:item, label: item,
description: 'func' description: 'func'
}, },
kind: monaco.languages.CompletionItemKind.Function, kind: monaco.languages.CompletionItemKind.Function,
@@ -605,7 +605,7 @@ const initMonacoEditor = () => {
sqlLanguage.builtinVariables.forEach((item: string) => { sqlLanguage.builtinVariables.forEach((item: string) => {
suggestions.push({ suggestions.push({
label: { label: {
label:item, label: item,
description: 'var' description: 'var'
}, },
kind: monaco.languages.CompletionItemKind.Variable, kind: monaco.languages.CompletionItemKind.Variable,
@@ -632,7 +632,7 @@ const initMonacoEditor = () => {
const { tableName, tableComment } = tableMeta const { tableName, tableComment } = tableMeta
suggestions.push({ suggestions.push({
label: { label: {
label: tableName + ' - ' + tableComment, label: tableName + ' - ' + tableComment,
description: 'table' description: 'table'
}, },
kind: monaco.languages.CompletionItemKind.File, kind: monaco.languages.CompletionItemKind.File,
@@ -699,7 +699,7 @@ select * from invisit v where`.match(/(join|from)\s+(\w*-?\w*\.?\w+)\s*(as)?\s*(
} }
onMounted(() => { onMounted(() => {
self.completionItemProvider?.dispose() self.completionItemProvider?.dispose()
setHeight(); setHeight();
initMonacoEditor(); initMonacoEditor();
// 监听浏览器窗口大小变化,更新对应组件高度 // 监听浏览器窗口大小变化,更新对应组件高度
@@ -1513,8 +1513,8 @@ const addRow = async () => {
*/ */
const formatSql = () => { const formatSql = () => {
let selection = monacoEditor.getSelection() let selection = monacoEditor.getSelection()
if(!selection){ if (!selection) {
return; return;
} }
let sql = monacoEditor.getModel()?.getValueInRange(selection) let sql = monacoEditor.getModel()?.getValueInRange(selection)
// 有选中sql则格式化并替换选中sql, 否则格式化编辑器所有内容 // 有选中sql则格式化并替换选中sql, 否则格式化编辑器所有内容
@@ -1530,8 +1530,8 @@ const formatSql = () => {
*/ */
const replaceSelection = (str: string, selection: any) => { const replaceSelection = (str: string, selection: any) => {
const model = monacoEditor.getModel(); const model = monacoEditor.getModel();
if(!model){ if (!model) {
return; return;
} }
if (!selection) { if (!selection) {
model.setValue(str); model.setValue(str);

View File

@@ -49,12 +49,7 @@
</el-table-column> </el-table-column>
<el-table-column prop="username" label="用户名" min-width="90"></el-table-column> <el-table-column prop="username" label="用户名" min-width="90"></el-table-column>
<el-table-column prop="remark" label="备注" min-width="250" show-overflow-tooltip></el-table-column> <el-table-column prop="remark" label="备注" min-width="250" show-overflow-tooltip></el-table-column>
<el-table-column prop="createTime" label="创建时间" min-width="165">
<template #default="scope">
{{ dateFormat(scope.row.createTime) }}
</template>
</el-table-column>
<el-table-column prop="creator" label="创建者" min-width="80"></el-table-column>
<el-table-column label="操作" min-width="235" fixed="right"> <el-table-column label="操作" min-width="235" fixed="right">
<template #default="scope"> <template #default="scope">
<span v-auth="'machine:terminal'"> <span v-auth="'machine:terminal'">
@@ -82,6 +77,11 @@
</span> </span>
<template #dropdown> <template #dropdown>
<el-dropdown-menu> <el-dropdown-menu>
<el-dropdown-item>
<el-link @click="showInfo(scope.row)" plain :underline="false" size="small">详情
</el-link>
</el-dropdown-item>
<el-dropdown-item> <el-dropdown-item>
<el-link @click="showProcess(scope.row)" :disabled="scope.row.status == -1" <el-link @click="showProcess(scope.row)" :disabled="scope.row.status == -1"
plain :underline="false" size="small">进程</el-link> plain :underline="false" size="small">进程</el-link>
@@ -110,6 +110,40 @@
</el-row> </el-row>
</el-card> </el-card>
<el-dialog v-model="infoDialog.visible">
<el-descriptions title="详情" :column="3" border>
<el-descriptions-item :span="1.5" label="机器id">{{ infoDialog.data.id }}</el-descriptions-item>
<el-descriptions-item :span="1.5" label="名称">{{ infoDialog.data.name }}</el-descriptions-item>
<el-descriptions-item :span="3" label="标签路径">{{ infoDialog.data.tagPath }}</el-descriptions-item>
<el-descriptions-item :span="2" label="IP">{{ infoDialog.data.ip }}</el-descriptions-item>
<el-descriptions-item :span="1" label="端口">{{ infoDialog.data.port }}</el-descriptions-item>
<el-descriptions-item :span="2" label="用户名">{{ infoDialog.data.username }}</el-descriptions-item>
<el-descriptions-item :span="1" label="认证方式">{{ infoDialog.data.authMethod == 1 ? 'Password' :
'PublicKey'
}}</el-descriptions-item>
<el-descriptions-item :span="3" label="备注">{{ infoDialog.data.remark }}</el-descriptions-item>
<el-descriptions-item :span="1.5" label="SSH隧道">{{ infoDialog.data.enableSshTunnel == 1 ? '是' : '否' }}
</el-descriptions-item>
<el-descriptions-item :span="1.5" label="终端回放">{{ infoDialog.data.enableRecorder == 1 ? '是' : '否' }}
</el-descriptions-item>
<el-descriptions-item :span="2" label="创建时间">{{ dateFormat(infoDialog.data.createTime) }}
</el-descriptions-item>
<el-descriptions-item :span="1" label="创建者">{{ infoDialog.data.creator }}</el-descriptions-item>
<el-descriptions-item :span="2" label="更新时间">{{ dateFormat(infoDialog.data.updateTime) }}
</el-descriptions-item>
<el-descriptions-item :span="1" label="修改者">{{ infoDialog.data.modifier }}</el-descriptions-item>
</el-descriptions>
</el-dialog>
<machine-edit :title="machineEditDialog.title" v-model:visible="machineEditDialog.visible" <machine-edit :title="machineEditDialog.title" v-model:visible="machineEditDialog.visible"
v-model:machine="machineEditDialog.data" @valChange="submitSuccess"></machine-edit> v-model:machine="machineEditDialog.data" @valChange="submitSuccess"></machine-edit>
@@ -158,6 +192,10 @@ const state = reactive({
list: [], list: [],
total: 10, total: 10,
}, },
infoDialog: {
visible: false,
data: null as any,
},
// 当前选中数据id // 当前选中数据id
currentId: 0, currentId: 0,
currentData: null, currentData: null,
@@ -197,6 +235,7 @@ const {
tags, tags,
params, params,
data, data,
infoDialog,
currentId, currentId,
currentData, currentData,
serviceDialog, serviceDialog,
@@ -318,6 +357,11 @@ const handlePageChange = (curPage: number) => {
search(); search();
}; };
const showInfo = (info: any) => {
state.infoDialog.data = info;
state.infoDialog.visible = true;
}
const showProcess = (row: any) => { const showProcess = (row: any) => {
state.processDialog.machineId = row.id; state.processDialog.machineId = row.id;
state.processDialog.visible = true; state.processDialog.visible = true;

View File

@@ -25,19 +25,18 @@
<el-table-column prop="host" label="host:port" min-width="150" show-overflow-tooltip> </el-table-column> <el-table-column prop="host" label="host:port" min-width="150" show-overflow-tooltip> </el-table-column>
<el-table-column prop="mode" label="mode" min-width="100"></el-table-column> <el-table-column prop="mode" label="mode" min-width="100"></el-table-column>
<el-table-column prop="remark" label="备注" min-width="120" show-overflow-tooltip></el-table-column> <el-table-column prop="remark" label="备注" min-width="120" show-overflow-tooltip></el-table-column>
<el-table-column prop="createTime" label="创建时间" min-width="160">
<template #default="scope">
{{ dateFormat(scope.row.createTime) }}
</template>
</el-table-column>
<el-table-column prop="creator" label="创建人" min-width="100"></el-table-column>
<el-table-column label="更多" min-width="155" fixed="right"> <el-table-column label="更多" min-width="155" fixed="right">
<template #default="scope"> <template #default="scope">
<el-link @click="showDetail(scope.row)" :underline="false">详情</el-link>
<el-divider direction="vertical" border-style="dashed" />
<el-link v-if="scope.row.mode === 'standalone' || scope.row.mode === 'sentinel'" type="primary" <el-link v-if="scope.row.mode === 'standalone' || scope.row.mode === 'sentinel'" type="primary"
@click="showInfoDialog(scope.row)" :underline="false">单机信息</el-link> @click="showInfoDialog(scope.row)" :underline="false">单机信息</el-link>
<el-link @click="onShowClusterInfo(scope.row)" v-if="scope.row.mode === 'cluster'" <el-link @click="onShowClusterInfo(scope.row)" v-if="scope.row.mode === 'cluster'"
type="success" :underline="false">集群信息</el-link> type="primary" :underline="false">集群信息</el-link>
<el-divider direction="vertical" border-style="dashed" /> <el-divider direction="vertical" border-style="dashed" />
<el-link @click="openDataOpt(scope.row)" type="success" :underline="false">数据操作</el-link> <el-link @click="openDataOpt(scope.row)" type="success" :underline="false">数据操作</el-link>
</template> </template>
</el-table-column> </el-table-column>
@@ -78,8 +77,9 @@
</el-tooltip> </el-tooltip>
</template> </template>
<template #default="scope"> <template #default="scope">
<el-tag @click="showInfoDialog({ id: clusterInfoDialog.redisId, ip: scope.row.ip })" effect="plain" <el-tag @click="showInfoDialog({ id: clusterInfoDialog.redisId, ip: scope.row.ip })"
type="success" size="small" style="cursor: pointer">{{ scope.row.ip }}</el-tag> effect="plain" type="success" size="small" style="cursor: pointer">{{ scope.row.ip }}
</el-tag>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="flags" label="flags" min-width="110"></el-table-column> <el-table-column prop="flags" label="flags" min-width="110"></el-table-column>
@@ -121,6 +121,31 @@
</el-table> </el-table>
</el-dialog> </el-dialog>
<el-dialog v-model="detailDialog.visible">
<el-descriptions title="详情" :column="3" border>
<el-descriptions-item :span="1.5" label="id">{{ detailDialog.data.id }}</el-descriptions-item>
<el-descriptions-item :span="1.5" label="名称">{{ detailDialog.data.name }}</el-descriptions-item>
<el-descriptions-item :span="3" label="标签路径">{{ detailDialog.data.tagPath }}</el-descriptions-item>
<el-descriptions-item :span="3" label="主机">{{ detailDialog.data.host }}</el-descriptions-item>
<el-descriptions-item :span="3" label="库">{{ detailDialog.data.db }}</el-descriptions-item>
<el-descriptions-item :span="3" label="备注">{{ detailDialog.data.remark }}</el-descriptions-item>
<el-descriptions-item :span="3" label="SSH隧道">{{ detailDialog.data.enableSshTunnel == 1 ? '是' : '否' }}
</el-descriptions-item>
<el-descriptions-item :span="2" label="创建时间">{{ dateFormat(detailDialog.data.createTime) }}
</el-descriptions-item>
<el-descriptions-item :span="1" label="创建者">{{ detailDialog.data.creator }}</el-descriptions-item>
<el-descriptions-item :span="2" label="更新时间">{{ dateFormat(detailDialog.data.updateTime) }}
</el-descriptions-item>
<el-descriptions-item :span="1" label="修改者">{{ detailDialog.data.modifier }}</el-descriptions-item>
</el-descriptions>
</el-dialog>
<redis-edit @val-change="valChange" :tags="tags" :title="redisEditDialog.title" <redis-edit @val-change="valChange" :tags="tags" :title="redisEditDialog.title"
v-model:visible="redisEditDialog.visible" v-model:redis="redisEditDialog.data"></redis-edit> v-model:visible="redisEditDialog.visible" v-model:redis="redisEditDialog.data"></redis-edit>
</div> </div>
@@ -149,6 +174,10 @@ const state = reactive({
pageSize: 10, pageSize: 10,
clusterId: null, clusterId: null,
}, },
detailDialog: {
visible: false,
data: null as any,
},
clusterInfoDialog: { clusterInfoDialog: {
visible: false, visible: false,
redisId: 0, redisId: 0,
@@ -179,6 +208,7 @@ const {
total, total,
currentId, currentId,
query, query,
detailDialog,
clusterInfoDialog, clusterInfoDialog,
infoDialog, infoDialog,
redisEditDialog, redisEditDialog,
@@ -193,6 +223,11 @@ const handlePageChange = (curPage: number) => {
search(); search();
}; };
const showDetail = (detail: any) => {
state.detailDialog.data = detail;
state.detailDialog.visible = true;
}
const choose = (item: any) => { const choose = (item: any) => {
if (!item) { if (!item) {
return; return;

View File

@@ -372,23 +372,23 @@ const saveTags = async () => {
closeTagDialog(); closeTagDialog();
}; };
const tagTreeNodeCheck = (data: any, checkInfo: any) => { const tagTreeNodeCheck = () => {
const node = tagTreeRef.value.getNode(data.id); // const node = tagTreeRef.value.getNode(data.id);
console.log(node); // console.log(node);
// state.showTagDialog.tagTreeTeams = [16] // // state.showTagDialog.tagTreeTeams = [16]
if (node.checked) { // if (node.checked) {
if (node.parent) { // if (node.parent) {
console.log(node.parent); // console.log(node.parent);
// removeCheckedTagId(node.parent.key); // // removeCheckedTagId(node.parent.key);
tagTreeRef.value.setChecked(node.parent, false, false); // tagTreeRef.value.setChecked(node.parent, false, false);
} // }
// // parentNode = node.parent // // // parentNode = node.parent
// for (let parentNode of node.parent) { // // for (let parentNode of node.parent) {
// parentNode.setChecked(false); // // parentNode.setChecked(false);
// } // // }
} // }
console.log(data); // console.log(data);
console.log(checkInfo); // console.log(checkInfo);
}; };
// function removeCheckedTagId(id: any) { // function removeCheckedTagId(id: any) {

View File

@@ -19,7 +19,12 @@
resolved "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-3.4.1.tgz" resolved "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-3.4.1.tgz"
integrity sha512-ej5oVy6lykXsvieQtqZxCOaLT+xD4+QNarq78cIYISHmZXshCvROLudpQN3lfL8G0NL7plMSSK+zlyvCaIJ4Iw== integrity sha512-ej5oVy6lykXsvieQtqZxCOaLT+xD4+QNarq78cIYISHmZXshCvROLudpQN3lfL8G0NL7plMSSK+zlyvCaIJ4Iw==
"@element-plus/icons-vue@^2.0.6", "@element-plus/icons-vue@^2.0.9": "@element-plus/icons-vue@^2.0.10":
version "2.0.10"
resolved "https://registry.npmmirror.com/@element-plus/icons-vue/-/icons-vue-2.0.10.tgz#60808d613c3dbdad025577022be8a972739ade21"
integrity sha512-ygEZ1mwPjcPo/OulhzLE7mtDrQBWI8vZzEWSNB2W/RNCRjoQGwbaK4N8lV4rid7Ts4qvySU3njMN7YCiSlSaTQ==
"@element-plus/icons-vue@^2.0.6":
version "2.0.9" version "2.0.9"
resolved "https://registry.npmmirror.com/@element-plus/icons-vue/-/icons-vue-2.0.9.tgz" resolved "https://registry.npmmirror.com/@element-plus/icons-vue/-/icons-vue-2.0.9.tgz"
integrity sha512-okdrwiVeKBmW41Hkl0eMrXDjzJwhQMuKiBOu17rOszqM+LS/yBYpNQNV5Jvoh06Wc+89fMmb/uhzf8NZuDuUaQ== integrity sha512-okdrwiVeKBmW41Hkl0eMrXDjzJwhQMuKiBOu17rOszqM+LS/yBYpNQNV5Jvoh06Wc+89fMmb/uhzf8NZuDuUaQ==
@@ -223,13 +228,13 @@
estree-walker "^2.0.2" estree-walker "^2.0.2"
source-map "^0.6.1" source-map "^0.6.1"
"@vue/compiler-core@3.2.41": "@vue/compiler-core@3.2.45":
version "3.2.41" version "3.2.45"
resolved "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.2.41.tgz" resolved "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.2.45.tgz#d9311207d96f6ebd5f4660be129fb99f01ddb41b"
integrity sha512-oA4mH6SA78DT+96/nsi4p9DX97PHcNROxs51lYk7gb9Z4BPKQ3Mh+BLn6CQZBw857Iuhu28BfMSRHAlPvD4vlw== integrity sha512-rcMj7H+PYe5wBV3iYeUgbCglC+pbpN8hBLTJvRiK2eKQiWqu+fG9F+8sW99JdL4LQi7Re178UOxn09puSXvn4A==
dependencies: dependencies:
"@babel/parser" "^7.16.4" "@babel/parser" "^7.16.4"
"@vue/shared" "3.2.41" "@vue/shared" "3.2.45"
estree-walker "^2.0.2" estree-walker "^2.0.2"
source-map "^0.6.1" source-map "^0.6.1"
@@ -241,25 +246,25 @@
"@vue/compiler-core" "3.2.39" "@vue/compiler-core" "3.2.39"
"@vue/shared" "3.2.39" "@vue/shared" "3.2.39"
"@vue/compiler-dom@3.2.41": "@vue/compiler-dom@3.2.45":
version "3.2.41" version "3.2.45"
resolved "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.2.41.tgz" resolved "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.2.45.tgz#c43cc15e50da62ecc16a42f2622d25dc5fd97dce"
integrity sha512-xe5TbbIsonjENxJsYRbDJvthzqxLNk+tb3d/c47zgREDa/PCp6/Y4gC/skM4H6PIuX5DAxm7fFJdbjjUH2QTMw== integrity sha512-tyYeUEuKqqZO137WrZkpwfPCdiiIeXYCcJ8L4gWz9vqaxzIQRccTSwSWZ/Axx5YR2z+LvpUbmPNXxuBU45lyRw==
dependencies: dependencies:
"@vue/compiler-core" "3.2.41" "@vue/compiler-core" "3.2.45"
"@vue/shared" "3.2.41" "@vue/shared" "3.2.45"
"@vue/compiler-sfc@3.2.41": "@vue/compiler-sfc@3.2.45":
version "3.2.41" version "3.2.45"
resolved "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.2.41.tgz" resolved "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.2.45.tgz#7f7989cc04ec9e7c55acd406827a2c4e96872c70"
integrity sha512-+1P2m5kxOeaxVmJNXnBskAn3BenbTmbxBxWOtBq3mQTCokIreuMULFantBUclP0+KnzNCMOvcnKinqQZmiOF8w== integrity sha512-1jXDuWah1ggsnSAOGsec8cFjT/K6TMZ0sPL3o3d84Ft2AYZi2jWJgRMjw4iaK0rBfA89L5gw427H4n1RZQBu6Q==
dependencies: dependencies:
"@babel/parser" "^7.16.4" "@babel/parser" "^7.16.4"
"@vue/compiler-core" "3.2.41" "@vue/compiler-core" "3.2.45"
"@vue/compiler-dom" "3.2.41" "@vue/compiler-dom" "3.2.45"
"@vue/compiler-ssr" "3.2.41" "@vue/compiler-ssr" "3.2.45"
"@vue/reactivity-transform" "3.2.41" "@vue/reactivity-transform" "3.2.45"
"@vue/shared" "3.2.41" "@vue/shared" "3.2.45"
estree-walker "^2.0.2" estree-walker "^2.0.2"
magic-string "^0.25.7" magic-string "^0.25.7"
postcss "^8.1.10" postcss "^8.1.10"
@@ -289,13 +294,13 @@
"@vue/compiler-dom" "3.2.39" "@vue/compiler-dom" "3.2.39"
"@vue/shared" "3.2.39" "@vue/shared" "3.2.39"
"@vue/compiler-ssr@3.2.41": "@vue/compiler-ssr@3.2.45":
version "3.2.41" version "3.2.45"
resolved "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.2.41.tgz" resolved "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.2.45.tgz#bd20604b6e64ea15344d5b6278c4141191c983b2"
integrity sha512-Y5wPiNIiaMz/sps8+DmhaKfDm1xgj6GrH99z4gq2LQenfVQcYXmHIOBcs5qPwl7jaW3SUQWjkAPKMfQemEQZwQ== integrity sha512-6BRaggEGqhWht3lt24CrIbQSRD5O07MTmd+LjAn5fJj568+R9eUD2F7wMQJjX859seSlrYog7sUtrZSd7feqrQ==
dependencies: dependencies:
"@vue/compiler-dom" "3.2.41" "@vue/compiler-dom" "3.2.45"
"@vue/shared" "3.2.41" "@vue/shared" "3.2.45"
"@vue/devtools-api@^6.0.0-beta.11": "@vue/devtools-api@^6.0.0-beta.11":
version "6.0.0-beta.20.1" version "6.0.0-beta.20.1"
@@ -318,58 +323,58 @@
estree-walker "^2.0.2" estree-walker "^2.0.2"
magic-string "^0.25.7" magic-string "^0.25.7"
"@vue/reactivity-transform@3.2.41": "@vue/reactivity-transform@3.2.45":
version "3.2.41" version "3.2.45"
resolved "https://registry.npmmirror.com/@vue/reactivity-transform/-/reactivity-transform-3.2.41.tgz" resolved "https://registry.npmmirror.com/@vue/reactivity-transform/-/reactivity-transform-3.2.45.tgz#07ac83b8138550c83dfb50db43cde1e0e5e8124d"
integrity sha512-mK5+BNMsL4hHi+IR3Ft/ho6Za+L3FA5j8WvreJ7XzHrqkPq8jtF/SMo7tuc9gHjLDwKZX1nP1JQOKo9IEAn54A== integrity sha512-BHVmzYAvM7vcU5WmuYqXpwaBHjsS8T63jlKGWVtHxAHIoMIlmaMyurUSEs1Zcg46M4AYT5MtB1U274/2aNzjJQ==
dependencies: dependencies:
"@babel/parser" "^7.16.4" "@babel/parser" "^7.16.4"
"@vue/compiler-core" "3.2.41" "@vue/compiler-core" "3.2.45"
"@vue/shared" "3.2.41" "@vue/shared" "3.2.45"
estree-walker "^2.0.2" estree-walker "^2.0.2"
magic-string "^0.25.7" magic-string "^0.25.7"
"@vue/reactivity@3.2.41": "@vue/reactivity@3.2.45":
version "3.2.41" version "3.2.45"
resolved "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.2.41.tgz" resolved "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.2.45.tgz#412a45b574de601be5a4a5d9a8cbd4dee4662ff0"
integrity sha512-9JvCnlj8uc5xRiQGZ28MKGjuCoPhhTwcoAdv3o31+cfGgonwdPNuvqAXLhlzu4zwqavFEG5tvaoINQEfxz+l6g== integrity sha512-PRvhCcQcyEVohW0P8iQ7HDcIOXRjZfAsOds3N99X/Dzewy8TVhTCT4uXpAHfoKjVTJRA0O0K+6QNkDIZAxNi3A==
dependencies: dependencies:
"@vue/shared" "3.2.41" "@vue/shared" "3.2.45"
"@vue/runtime-core@3.2.41": "@vue/runtime-core@3.2.45":
version "3.2.41" version "3.2.45"
resolved "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.2.41.tgz" resolved "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.2.45.tgz#7ad7ef9b2519d41062a30c6fa001ec43ac549c7f"
integrity sha512-0LBBRwqnI0p4FgIkO9q2aJBBTKDSjzhnxrxHYengkAF6dMOjeAIZFDADAlcf2h3GDALWnblbeprYYpItiulSVQ== integrity sha512-gzJiTA3f74cgARptqzYswmoQx0fIA+gGYBfokYVhF8YSXjWTUA2SngRzZRku2HbGbjzB6LBYSbKGIaK8IW+s0A==
dependencies: dependencies:
"@vue/reactivity" "3.2.41" "@vue/reactivity" "3.2.45"
"@vue/shared" "3.2.41" "@vue/shared" "3.2.45"
"@vue/runtime-dom@3.2.41": "@vue/runtime-dom@3.2.45":
version "3.2.41" version "3.2.45"
resolved "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.2.41.tgz" resolved "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.2.45.tgz#1a2ef6ee2ad876206fbbe2a884554bba2d0faf59"
integrity sha512-U7zYuR1NVIP8BL6jmOqmapRAHovEFp7CSw4pR2FacqewXNGqZaRfHoNLQsqQvVQ8yuZNZtxSZy0FFyC70YXPpA== integrity sha512-cy88YpfP5Ue2bDBbj75Cb4bIEZUMM/mAkDMfqDTpUYVgTf/kuQ2VQ8LebuZ8k6EudgH8pYhsGWHlY0lcxlvTwA==
dependencies: dependencies:
"@vue/runtime-core" "3.2.41" "@vue/runtime-core" "3.2.45"
"@vue/shared" "3.2.41" "@vue/shared" "3.2.45"
csstype "^2.6.8" csstype "^2.6.8"
"@vue/server-renderer@3.2.41": "@vue/server-renderer@3.2.45":
version "3.2.41" version "3.2.45"
resolved "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.2.41.tgz" resolved "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.2.45.tgz#ca9306a0c12b0530a1a250e44f4a0abac6b81f3f"
integrity sha512-7YHLkfJdTlsZTV0ae5sPwl9Gn/EGr2hrlbcS/8naXm2CDpnKUwC68i1wGlrYAfIgYWL7vUZwk2GkYLQH5CvFig== integrity sha512-ebiMq7q24WBU1D6uhPK//2OTR1iRIyxjF5iVq/1a5I1SDMDyDu4Ts6fJaMnjrvD3MqnaiFkKQj+LKAgz5WIK3g==
dependencies: dependencies:
"@vue/compiler-ssr" "3.2.41" "@vue/compiler-ssr" "3.2.45"
"@vue/shared" "3.2.41" "@vue/shared" "3.2.45"
"@vue/shared@3.2.39": "@vue/shared@3.2.39":
version "3.2.39" version "3.2.39"
resolved "https://registry.npmmirror.com/@vue/shared/-/shared-3.2.39.tgz" resolved "https://registry.npmmirror.com/@vue/shared/-/shared-3.2.39.tgz"
integrity sha512-D3dl2ZB9qE6mTuWPk9RlhDeP1dgNRUKC3NJxji74A4yL8M2MwlhLKUC/49WHjrNzSPug58fWx/yFbaTzGAQSBw== integrity sha512-D3dl2ZB9qE6mTuWPk9RlhDeP1dgNRUKC3NJxji74A4yL8M2MwlhLKUC/49WHjrNzSPug58fWx/yFbaTzGAQSBw==
"@vue/shared@3.2.41": "@vue/shared@3.2.45":
version "3.2.41" version "3.2.45"
resolved "https://registry.npmmirror.com/@vue/shared/-/shared-3.2.41.tgz" resolved "https://registry.npmmirror.com/@vue/shared/-/shared-3.2.45.tgz#a3fffa7489eafff38d984e23d0236e230c818bc2"
integrity sha512-W9mfWLHmJhkfAmV+7gDjcHeAWALQtgGT3JErxULl0oz6R6+3ug91I7IErs93eCFhPCZPHBs4QJS7YWEV7A3sxw== integrity sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg==
"@vueuse/core@^9.1.0": "@vueuse/core@^9.1.0":
version "9.2.0" version "9.2.0"
@@ -657,10 +662,10 @@ echarts@^5.3.3:
tslib "2.3.0" tslib "2.3.0"
zrender "5.3.2" zrender "5.3.2"
element-plus@^2.2.20: element-plus@^2.2.22:
version "2.2.20" version "2.2.22"
resolved "https://registry.npmmirror.com/element-plus/-/element-plus-2.2.20.tgz" resolved "https://registry.npmmirror.com/element-plus/-/element-plus-2.2.22.tgz#6374a263ecdcf0a820c3d2e926bb28102542e254"
integrity sha512-ludShd3f5kNRY4FLzeoNitLcwZ4qs2M/zwKeyeE7rUzZJAQ0BZtcT3SvZoEoBLmgxw9jHoonl4WIwon4UzhyRA== integrity sha512-gg2g2WOMNpWf0wGesymUvTV0VZDF/4khQKroSNeCV/vWJ/cqssPYdtqfGxTiFRt/f+JpyFkV7O1mo0yzMCzrBg==
dependencies: dependencies:
"@ctrl/tinycolor" "^3.4.1" "@ctrl/tinycolor" "^3.4.1"
"@element-plus/icons-vue" "^2.0.6" "@element-plus/icons-vue" "^2.0.6"
@@ -1751,16 +1756,16 @@ vue-router@^4.1.6:
dependencies: dependencies:
"@vue/devtools-api" "^6.4.5" "@vue/devtools-api" "^6.4.5"
vue@^3.2.41: vue@^3.2.45:
version "3.2.41" version "3.2.45"
resolved "https://registry.npmmirror.com/vue/-/vue-3.2.41.tgz" resolved "https://registry.npmmirror.com/vue/-/vue-3.2.45.tgz#94a116784447eb7dbd892167784619fef379b3c8"
integrity sha512-uuuvnrDXEeZ9VUPljgHkqB5IaVO8SxhPpqF2eWOukVrBnRBx2THPSGQBnVRt0GrIG1gvCmFXMGbd7FqcT1ixNQ== integrity sha512-9Nx/Mg2b2xWlXykmCwiTUCWHbWIj53bnkizBxKai1g61f2Xit700A1ljowpTIM11e3uipOeiPcSqnmBg6gyiaA==
dependencies: dependencies:
"@vue/compiler-dom" "3.2.41" "@vue/compiler-dom" "3.2.45"
"@vue/compiler-sfc" "3.2.41" "@vue/compiler-sfc" "3.2.45"
"@vue/runtime-dom" "3.2.41" "@vue/runtime-dom" "3.2.45"
"@vue/server-renderer" "3.2.41" "@vue/server-renderer" "3.2.45"
"@vue/shared" "3.2.41" "@vue/shared" "3.2.45"
vuex@^4.0.2: vuex@^4.0.2:
version "4.0.2" version "4.0.2"

View File

@@ -128,7 +128,7 @@ func (d *Db) ExecSql(rc *ctx.ReqCtx) {
dbInstance := d.DbApp.GetDbInstance(id, db) dbInstance := d.DbApp.GetDbInstance(id, db)
biz.ErrIsNilAppendErr(d.TagApp.CanAccess(rc.LoginAccount.Id, dbInstance.Info.TagPath), "%s") biz.ErrIsNilAppendErr(d.TagApp.CanAccess(rc.LoginAccount.Id, dbInstance.Info.TagPath), "%s")
rc.ReqParam = fmt.Sprintf("%s -> sql: %s", dbInstance.Info.GetLogDesc(), form.Sql) rc.ReqParam = fmt.Sprintf("%s -> %s", dbInstance.Info.GetLogDesc(), form.Sql)
biz.NotEmpty(form.Sql, "sql不能为空") biz.NotEmpty(form.Sql, "sql不能为空")
// 去除前后空格及换行符 // 去除前后空格及换行符

View File

@@ -19,6 +19,10 @@ type SelectDataDbVO struct {
Creator *string `json:"creator"` Creator *string `json:"creator"`
CreatorId *int64 `json:"creatorId"` CreatorId *int64 `json:"creatorId"`
UpdateTime *time.Time `json:"updateTime"`
Modifier *string `json:"modifier"`
ModifierId *int64 `json:"modifierId"`
EnableSshTunnel *int8 `json:"enableSshTunnel"` EnableSshTunnel *int8 `json:"enableSshTunnel"`
SshTunnelMachineId *uint64 `json:"sshTunnelMachineId"` SshTunnelMachineId *uint64 `json:"sshTunnelMachineId"`
} }

View File

@@ -18,6 +18,9 @@ type Redis struct {
CreateTime *time.Time `json:"createTime"` CreateTime *time.Time `json:"createTime"`
Creator *string `json:"creator"` Creator *string `json:"creator"`
CreatorId *int64 `json:"creatorId"` CreatorId *int64 `json:"creatorId"`
UpdateTime *time.Time `json:"updateTime"`
Modifier *string `json:"modifier"`
ModifierId *int64 `json:"modifierId"`
} }
type Keys struct { type Keys struct {