mirror of
https://gitee.com/dromara/mayfly-go
synced 2025-11-03 16:00:25 +08:00
feat: 新增pgsql数据操作&redis集群操作
This commit is contained in:
@@ -13,7 +13,7 @@
|
||||
"countup.js": "^2.0.7",
|
||||
"cropperjs": "^1.5.11",
|
||||
"echarts": "^5.3.3",
|
||||
"element-plus": "^2.2.8",
|
||||
"element-plus": "^2.2.9",
|
||||
"jsoneditor": "^9.9.0",
|
||||
"lodash": "^4.17.21",
|
||||
"mitt": "^3.0.0",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<template>
|
||||
<div>
|
||||
<el-dialog :title="title" v-model="dialogVisible" :before-close="cancel" :close-on-click-modal="false" :destroy-on-close="true" width="35%">
|
||||
<el-form :model="form" ref="dbForm" :rules="rules" label-width="85px">
|
||||
<el-dialog :title="title" v-model="dialogVisible" :before-close="cancel" :close-on-click-modal="false" :destroy-on-close="true" width="38%">
|
||||
<el-form :model="form" ref="dbForm" :rules="rules" label-width="95px">
|
||||
<el-form-item prop="projectId" label="项目:" required>
|
||||
<el-select style="width: 100%" v-model="form.projectId" placeholder="请选择项目" @change="changeProject" filterable>
|
||||
<el-option v-for="item in projects" :key="item.id" :label="`${item.name} [${item.remark}]`" :value="item.id"> </el-option>
|
||||
@@ -19,6 +19,7 @@
|
||||
<el-form-item prop="type" label="类型:" required>
|
||||
<el-select style="width: 100%" v-model="form.type" placeholder="请选择数据库类型">
|
||||
<el-option key="item.id" label="mysql" value="mysql"> </el-option>
|
||||
<el-option key="item.id" label="postgres" value="postgres"> </el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item prop="host" label="host:" required>
|
||||
@@ -39,6 +40,9 @@
|
||||
autocomplete="new-password"
|
||||
></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item prop="params" label="连接参数:">
|
||||
<el-input v-model="form.params" placeholder="其他连接参数,形如: key1=value1&key2=value2"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item prop="database" label="数据库名:" required>
|
||||
<el-tag
|
||||
v-for="db in databaseList"
|
||||
@@ -116,6 +120,7 @@ export default defineComponent({
|
||||
port: 3306,
|
||||
username: null,
|
||||
password: null,
|
||||
params: null,
|
||||
database: '',
|
||||
project: null,
|
||||
projectId: null,
|
||||
@@ -173,13 +178,6 @@ export default defineComponent({
|
||||
trigger: ['change', 'blur'],
|
||||
},
|
||||
],
|
||||
// password: [
|
||||
// {
|
||||
// required: true,
|
||||
// message: '请输入密码',
|
||||
// trigger: ['change', 'blur'],
|
||||
// },
|
||||
// ],
|
||||
database: [
|
||||
{
|
||||
required: true,
|
||||
|
||||
@@ -20,15 +20,15 @@
|
||||
</el-radio>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="project" label="项目" min-width="100"></el-table-column>
|
||||
<el-table-column prop="project" label="项目" min-width="100" show-overflow-tooltip></el-table-column>
|
||||
<el-table-column prop="env" label="环境" min-width="100"></el-table-column>
|
||||
<el-table-column prop="name" label="名称" min-width="200"></el-table-column>
|
||||
<el-table-column min-width="160" label="host:port">
|
||||
<el-table-column prop="name" label="名称" min-width="160" show-overflow-tooltip></el-table-column>
|
||||
<el-table-column min-width="170" label="host:port" show-overflow-tooltip>
|
||||
<template #default="scope">
|
||||
{{ `${scope.row.host}:${scope.row.port}` }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="type" label="类型" min-width="80"></el-table-column>
|
||||
<el-table-column prop="type" label="类型" min-width="90"></el-table-column>
|
||||
<el-table-column prop="database" label="数据库" min-width="160">
|
||||
<template #default="scope">
|
||||
<el-tag
|
||||
@@ -224,6 +224,7 @@
|
||||
<el-table-column prop="columnName" label="列名" show-overflow-tooltip> </el-table-column>
|
||||
<el-table-column prop="seqInIndex" label="列序列号" show-overflow-tooltip> </el-table-column>
|
||||
<el-table-column prop="indexType" label="类型"> </el-table-column>
|
||||
<el-table-column prop="indexComment" label="备注" min-width="230" show-overflow-tooltip> </el-table-column>
|
||||
</el-table>
|
||||
</el-dialog>
|
||||
|
||||
|
||||
@@ -276,6 +276,7 @@ export default defineComponent({
|
||||
dbs: [], // 数据库实例列表
|
||||
databaseList: [], // 数据库实例拥有的数据库列表,1数据库实例 -> 多数据库
|
||||
db: '', // 当前操作的数据库
|
||||
dbType: '',
|
||||
tables: [],
|
||||
dbId: null, // 当前选中操作的数据库实例
|
||||
tableName: '',
|
||||
@@ -622,7 +623,9 @@ export default defineComponent({
|
||||
*/
|
||||
const changeDbInstance = (dbId: any) => {
|
||||
state.db = '';
|
||||
state.databaseList = (state.dbs.find((e: any) => e.id == dbId) as any).database.split(' ');
|
||||
const dbInfo = state.dbs.find((e: any) => e.id == dbId) as any;
|
||||
state.dbType = dbInfo.type;
|
||||
state.databaseList = dbInfo.database.split(' ');
|
||||
clearDb();
|
||||
};
|
||||
|
||||
@@ -788,16 +791,21 @@ export default defineComponent({
|
||||
* 获取默认查询语句
|
||||
*/
|
||||
const getDefaultSelectSql = (tableName: string, where: string = '', orderBy: string = '', pageNum: number = 1) => {
|
||||
return `SELECT * FROM \`${tableName}\` ${where ? 'WHERE ' + where : ''} ${orderBy ? orderBy : ''} LIMIT ${
|
||||
(pageNum - 1) * state.defalutLimit
|
||||
}, ${state.defalutLimit}`;
|
||||
const baseSql = `SELECT * FROM ${tableName} ${where ? 'WHERE ' + where : ''} ${orderBy ? orderBy : ''}`;
|
||||
if (state.dbType == 'mysql') {
|
||||
return `${baseSql} LIMIT ${(pageNum - 1) * state.defalutLimit}, ${state.defalutLimit};`
|
||||
}
|
||||
if (state.dbType == 'postgres') {
|
||||
return `${baseSql} OFFSET ${(pageNum - 1) * state.defalutLimit} LIMIT ${state.defalutLimit};`
|
||||
}
|
||||
return baseSql;
|
||||
};
|
||||
|
||||
/**
|
||||
* 获取默认查询统计语句
|
||||
*/
|
||||
const getDefaultCountSql = (tableName: string, where: string = '') => {
|
||||
return `SELECT COUNT(*) count FROM \`${tableName}\` ${where ? 'WHERE ' + where : ''}`;
|
||||
return `SELECT COUNT(*) count FROM ${tableName} ${where ? 'WHERE ' + where : ''}`;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -819,7 +827,7 @@ export default defineComponent({
|
||||
const tableName = state.activeName;
|
||||
const sortType = sort.order == 'descending' ? 'DESC' : 'ASC';
|
||||
|
||||
const orderBy = `ORDER BY \`${sort.prop}\` ${sortType}`;
|
||||
const orderBy = `ORDER BY ${sort.prop} ${sortType}`;
|
||||
state.dataTabs[state.activeName].orderBy = orderBy;
|
||||
|
||||
onRefresh(tableName);
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item prop="params" label="参数">
|
||||
<el-input v-model.trim="form.params" placeholder="参数数组json,若无可不填"></el-input>
|
||||
<el-input v-model="form.params" placeholder="参数数组json,若无可不填"></el-input>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item prop="script" label="内容" id="content">
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="count" label-width="60px">
|
||||
<el-input placeholder="count" style="width: 62px" v-model="scanParam.count"></el-input>
|
||||
<el-input placeholder="count" style="width: 62px" v-model.number="scanParam.count"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button @click="searchKey()" type="success" icon="search" plain></el-button>
|
||||
@@ -92,7 +92,7 @@ import { toRefs, reactive, defineComponent } from 'vue';
|
||||
import { ElMessage, ElMessageBox } from 'element-plus';
|
||||
import ProjectEnvSelect from '../component/ProjectEnvSelect.vue';
|
||||
import DataEdit from './DataEdit.vue';
|
||||
import { isTrue, notNull } from '@/common/assert';
|
||||
import { isTrue, notBlank, notNull } from '@/common/assert';
|
||||
|
||||
export default defineComponent({
|
||||
name: 'DataOperation',
|
||||
@@ -103,18 +103,15 @@ export default defineComponent({
|
||||
setup() {
|
||||
const state = reactive({
|
||||
loading: false,
|
||||
cluster: 0,
|
||||
redisList: [],
|
||||
query: {
|
||||
envId: 0,
|
||||
},
|
||||
scanParam: {
|
||||
id: null,
|
||||
cluster: 0,
|
||||
match: null,
|
||||
count: 10,
|
||||
cursor: 0,
|
||||
prevCursor: null,
|
||||
cursor: {},
|
||||
},
|
||||
valueDialog: {
|
||||
visible: false,
|
||||
@@ -151,31 +148,33 @@ export default defineComponent({
|
||||
}
|
||||
};
|
||||
|
||||
const changeRedis = () => {
|
||||
resetScanParam();
|
||||
const changeRedis = (id: number) => {
|
||||
resetScanParam(id);
|
||||
state.keys = [];
|
||||
state.dbsize = 0;
|
||||
searchKey();
|
||||
};
|
||||
|
||||
const scan = () => {
|
||||
const scan = async () => {
|
||||
isTrue(state.scanParam.id != null, '请先选择redis');
|
||||
notBlank(state.scanParam.count, 'count不能为空');
|
||||
isTrue(state.scanParam.count < 20001, 'count不能超过20000');
|
||||
|
||||
state.loading = true;
|
||||
state.scanParam.cluster = state.cluster == 0 ? 0 : 1;
|
||||
|
||||
redisApi.scan.request(state.scanParam).then((res) => {
|
||||
try {
|
||||
const res = await redisApi.scan.request(state.scanParam);
|
||||
state.keys = res.keys;
|
||||
state.dbsize = res.dbSize;
|
||||
state.scanParam.cursor = res.cursor;
|
||||
} finally {
|
||||
state.loading = false;
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
const searchKey = () => {
|
||||
state.scanParam.cursor = 0;
|
||||
scan();
|
||||
const searchKey = async () => {
|
||||
state.scanParam.cursor = {};
|
||||
await scan();
|
||||
};
|
||||
|
||||
const clearRedis = () => {
|
||||
@@ -193,10 +192,17 @@ export default defineComponent({
|
||||
}
|
||||
};
|
||||
|
||||
const resetScanParam = () => {
|
||||
state.scanParam.match = null;
|
||||
state.scanParam.cursor = 0;
|
||||
const resetScanParam = (id: number = 0) => {
|
||||
state.scanParam.count = 10;
|
||||
if (id != 0) {
|
||||
const redis: any = state.redisList.find((x: any) => x.id == id);
|
||||
// 集群模式count设小点,因为后端会从所有master节点scan一遍然后合并结果
|
||||
if (redis && redis.mode == 'cluster') {
|
||||
state.scanParam.count = 5;
|
||||
}
|
||||
}
|
||||
state.scanParam.match = null;
|
||||
state.scanParam.cursor = {};
|
||||
};
|
||||
|
||||
const getValue = async (row: any) => {
|
||||
@@ -204,11 +210,9 @@ export default defineComponent({
|
||||
const key = row.key;
|
||||
|
||||
let res: any;
|
||||
const id = state.cluster == 0 ? state.scanParam.id : state.cluster;
|
||||
const reqParam = {
|
||||
cluster: state.cluster,
|
||||
key: row.key,
|
||||
id,
|
||||
id: state.scanParam.id,
|
||||
};
|
||||
switch (type) {
|
||||
case 'string':
|
||||
@@ -260,29 +264,27 @@ export default defineComponent({
|
||||
};
|
||||
|
||||
const del = (key: string) => {
|
||||
ElMessageBox.confirm(`此操作将删除对应的key , 是否继续?`, '提示', {
|
||||
ElMessageBox.confirm(`确定删除[ ${key} ] 该key?`, '提示', {
|
||||
confirmButtonText: '确定',
|
||||
cancelButtonText: '取消',
|
||||
type: 'warning',
|
||||
})
|
||||
.then(() => {
|
||||
let id = state.cluster == 0 ? state.scanParam.id : state.cluster;
|
||||
redisApi.delKey
|
||||
.request({
|
||||
cluster: state.cluster,
|
||||
key,
|
||||
id,
|
||||
id: state.scanParam.id,
|
||||
})
|
||||
.then(() => {
|
||||
ElMessage.success('删除成功!');
|
||||
scan();
|
||||
searchKey();
|
||||
});
|
||||
})
|
||||
.catch(() => {});
|
||||
};
|
||||
|
||||
const ttlConveter = (ttl: any) => {
|
||||
if (ttl == -1) {
|
||||
if (ttl == -1 || ttl == 0) {
|
||||
return '永久';
|
||||
}
|
||||
if (!ttl) {
|
||||
|
||||
@@ -13,8 +13,14 @@
|
||||
<el-option v-for="item in envs" :key="item.id" :label="`${item.name} [${item.remark}]`" :value="item.id"> </el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item prop="mode" label="mode:" required>
|
||||
<el-select style="width: 100%" v-model="form.mode" placeholder="请选择模式">
|
||||
<el-option label="standalone" value="standalone"> </el-option>
|
||||
<el-option label="cluster" value="cluster"> </el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item prop="host" label="host:" required>
|
||||
<el-input v-model.trim="form.host" placeholder="请输入host:port" auto-complete="off"></el-input>
|
||||
<el-input v-model.trim="form.host" placeholder="请输入host:port,集群模式用','分割" auto-complete="off" type="textarea"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item prop="password" label="密码:">
|
||||
<el-input
|
||||
@@ -28,6 +34,9 @@
|
||||
<el-form-item prop="db" label="库号:" required>
|
||||
<el-input v-model.number="form.db" placeholder="请输入库号"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item prop="remark" label="备注:">
|
||||
<el-input v-model.trim="form.remark" auto-complete="off" type="textarea"></el-input>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<template #footer>
|
||||
@@ -71,12 +80,14 @@ export default defineComponent({
|
||||
form: {
|
||||
id: null,
|
||||
name: null,
|
||||
mode: "standalone",
|
||||
host: null,
|
||||
password: null,
|
||||
project: null,
|
||||
projectId: null,
|
||||
envId: null,
|
||||
env: null,
|
||||
remark: "",
|
||||
},
|
||||
btnLoading: false,
|
||||
rules: {
|
||||
@@ -108,6 +119,13 @@ export default defineComponent({
|
||||
trigger: ['change', 'blur'],
|
||||
},
|
||||
],
|
||||
mode: [
|
||||
{
|
||||
required: true,
|
||||
message: '请输入模式',
|
||||
trigger: ['change', 'blur'],
|
||||
},
|
||||
],
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
@@ -5,16 +5,12 @@
|
||||
<el-button type="primary" icon="edit" :disabled="currentId == null" @click="editRedis(false)" plain>编辑</el-button>
|
||||
<el-button type="danger" icon="delete" :disabled="currentId == null" @click="deleteRedis" plain>删除</el-button>
|
||||
<div style="float: right">
|
||||
<!-- <el-input placeholder="host" style="width: 140px" v-model="query.host" @clear="search" plain clearable></el-input>
|
||||
<el-select v-model="params.clusterId" clearable placeholder="集群选择">
|
||||
<el-option v-for="item in clusters" :key="item.id" :value="item.id" :label="item.name"></el-option>
|
||||
</el-select> -->
|
||||
<el-select v-model="query.projectId" placeholder="请选择项目" filterable clearable>
|
||||
<el-option v-for="item in projects" :key="item.id" :label="`${item.name} [${item.remark}]`" :value="item.id"> </el-option>
|
||||
</el-select>
|
||||
<el-button class="ml5" @click="search" type="success" icon="search"></el-button>
|
||||
</div>
|
||||
<el-table :data="redisTable" style="width: 100%" @current-change="choose" stripe>
|
||||
<el-table :data="redisTable" @current-change="choose" stripe>
|
||||
<el-table-column label="选择" width="60px">
|
||||
<template #default="scope">
|
||||
<el-radio v-model="currentId" :label="scope.row.id">
|
||||
@@ -22,19 +18,23 @@
|
||||
</el-radio>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="project" label="项目" width></el-table-column>
|
||||
<el-table-column prop="env" label="环境" width></el-table-column>
|
||||
<el-table-column prop="host" label="host:port" width></el-table-column>
|
||||
<el-table-column prop="createTime" label="创建时间">
|
||||
<el-table-column prop="project" label="项目" min-width="100"></el-table-column>
|
||||
<el-table-column prop="env" label="环境" min-width="100"></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="remark" label="备注" min-width="100"></el-table-column>
|
||||
<el-table-column prop="createTime" label="创建时间" min-width="160">
|
||||
<template #default="scope">
|
||||
{{ $filters.dateFormat(scope.row.createTime) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="creator" label="创建人"></el-table-column>
|
||||
<el-table-column label="操作" width>
|
||||
<el-table-column prop="creator" label="创建人" min-width="100"></el-table-column>
|
||||
<el-table-column label="更多" min-width="130" fixed="right">
|
||||
<template #default="scope">
|
||||
<el-button type="primary" @click="info(scope.row)" icon="tickets" plain size="small">info</el-button>
|
||||
<!-- <el-button type="success" @click="manage(scope.row)" :ref="scope.row" plain>数据管理</el-button> -->
|
||||
<el-link v-if="scope.row.mode == 'standalone'" type="primary" @click="info(scope.row)" :underline="false">单机信息</el-link>
|
||||
<el-link @click="onShowClusterInfo(scope.row)" v-if="scope.row.mode == 'cluster'" type="success" :underline="false"
|
||||
>集群信息</el-link
|
||||
>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
@@ -52,6 +52,84 @@
|
||||
|
||||
<info v-model:visible="infoDialog.visible" :title="infoDialog.title" :info="infoDialog.info"></info>
|
||||
|
||||
<el-dialog width="1000px" title="集群信息" v-model="clusterInfoDialog.visible">
|
||||
<el-input type="textarea" :autosize="{ minRows: 12, maxRows: 12 }" v-model="clusterInfoDialog.info"> </el-input>
|
||||
|
||||
<el-divider content-position="left">节点信息</el-divider>
|
||||
<el-table :data="clusterInfoDialog.nodes" stripe size="small" border>
|
||||
<el-table-column prop="nodeId" label="nodeId" min-width="300">
|
||||
<template #header>
|
||||
nodeId
|
||||
<el-tooltip class="box-item" effect="dark" content="节点id" placement="top">
|
||||
<el-icon><question-filled /></el-icon>
|
||||
</el-tooltip>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="ip" label="ip" min-width="180">
|
||||
<template #header>
|
||||
ip
|
||||
<el-tooltip
|
||||
class="box-item"
|
||||
effect="dark"
|
||||
content="ip:port1@port2:port1指redis服务器与客户端通信的端口,port2则是集群内部节点间通信的端口"
|
||||
placement="top"
|
||||
>
|
||||
<el-icon><question-filled /></el-icon>
|
||||
</el-tooltip>
|
||||
</template>
|
||||
<template #default="scope">
|
||||
<el-tag
|
||||
@click="info({ id: clusterInfoDialog.redisId, ip: scope.row.ip })"
|
||||
effect="plain"
|
||||
type="success"
|
||||
size="small"
|
||||
style="cursor: pointer"
|
||||
>{{ scope.row.ip }}</el-tag
|
||||
>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="flags" label="flags" min-width="110"></el-table-column>
|
||||
<el-table-column prop="masterSlaveRelation" label="masterSlaveRelation" min-width="300">
|
||||
<template #header>
|
||||
masterSlaveRelation
|
||||
<el-tooltip
|
||||
class="box-item"
|
||||
effect="dark"
|
||||
content="如果节点是slave,并且已知master节点,则为master节点ID;否则为符号'-'"
|
||||
placement="top"
|
||||
>
|
||||
<el-icon><question-filled /></el-icon>
|
||||
</el-tooltip>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="pingSent" label="pingSent" min-width="130" show-overflow-tooltip>
|
||||
<template #default="scope">
|
||||
{{ scope.row.pingSent == 0 ? 0 : new Date(parseInt(scope.row.pingSent)).toLocaleString() }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="pongRecv" label="pongRecv" min-width="130" show-overflow-tooltip>
|
||||
<template #default="scope">
|
||||
{{ scope.row.pongRecv == 0 ? 0 : new Date(parseInt(scope.row.pongRecv)).toLocaleString() }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="configEpoch" label="configEpoch" min-width="130">
|
||||
<template #header>
|
||||
configEpoch
|
||||
<el-tooltip
|
||||
class="box-item"
|
||||
effect="dark"
|
||||
content="节点的epoch值(如果该节点是从节点,则为其主节点的epoch值)。每当节点发生失败切换时,都会创建一个新的,独特的,递增的epoch。"
|
||||
placement="top"
|
||||
>
|
||||
<el-icon><question-filled /></el-icon>
|
||||
</el-tooltip>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="linkState" label="linkState" min-width="100"></el-table-column>
|
||||
<el-table-column prop="slot" label="slot" min-width="100"></el-table-column>
|
||||
</el-table>
|
||||
</el-dialog>
|
||||
|
||||
<redis-edit
|
||||
@val-change="valChange"
|
||||
:projects="projects"
|
||||
@@ -92,6 +170,12 @@ export default defineComponent({
|
||||
redisInfo: {
|
||||
url: '',
|
||||
},
|
||||
clusterInfoDialog: {
|
||||
visible: false,
|
||||
redisId: 0,
|
||||
info: '',
|
||||
nodes: [],
|
||||
},
|
||||
clusters: [
|
||||
{
|
||||
id: 0,
|
||||
@@ -134,12 +218,6 @@ export default defineComponent({
|
||||
state.currentData = item;
|
||||
};
|
||||
|
||||
// connect() {
|
||||
// Req.post('/open/redis/connect', this.form, res => {
|
||||
// this.redisInfo = res
|
||||
// })
|
||||
// }
|
||||
|
||||
const deleteRedis = async () => {
|
||||
try {
|
||||
await ElMessageBox.confirm(`确定删除该redis?`, '提示', {
|
||||
@@ -155,12 +233,23 @@ export default defineComponent({
|
||||
} catch (err) {}
|
||||
};
|
||||
|
||||
const info = (redis: any) => {
|
||||
redisApi.redisInfo.request({ id: redis.id }).then((res: any) => {
|
||||
state.infoDialog.info = res;
|
||||
state.infoDialog.title = `'${redis.host}' info`;
|
||||
state.infoDialog.visible = true;
|
||||
});
|
||||
const info = async (redis: any) => {
|
||||
var host = redis.host;
|
||||
if (redis.ip) {
|
||||
host = redis.ip.split('@')[0];
|
||||
}
|
||||
const res = await redisApi.redisInfo.request({ id: redis.id, host });
|
||||
state.infoDialog.info = res;
|
||||
state.infoDialog.title = `'${host}' info`;
|
||||
state.infoDialog.visible = true;
|
||||
};
|
||||
|
||||
const onShowClusterInfo = async (redis: any) => {
|
||||
const ci = await redisApi.clusterInfo.request({ id: redis.id });
|
||||
state.clusterInfoDialog.info = ci.clusterInfo;
|
||||
state.clusterInfoDialog.nodes = ci.clusterNodes;
|
||||
state.clusterInfoDialog.redisId = redis.id;
|
||||
state.clusterInfoDialog.visible = true;
|
||||
};
|
||||
|
||||
const search = async () => {
|
||||
@@ -192,6 +281,7 @@ export default defineComponent({
|
||||
handlePageChange,
|
||||
choose,
|
||||
info,
|
||||
onShowClusterInfo,
|
||||
deleteRedis,
|
||||
editRedis,
|
||||
valChange,
|
||||
|
||||
@@ -3,10 +3,11 @@ import Api from '@/common/Api';
|
||||
export const redisApi = {
|
||||
redisList : Api.create("/redis", 'get'),
|
||||
redisInfo: Api.create("/redis/{id}/info", 'get'),
|
||||
clusterInfo: Api.create("/redis/{id}/cluster-info", 'get'),
|
||||
saveRedis: Api.create("/redis", 'post'),
|
||||
delRedis: Api.create("/redis/{id}", 'delete'),
|
||||
// 获取权限列表
|
||||
scan: Api.create("/redis/{id}/scan/{cursor}/{count}", 'get'),
|
||||
scan: Api.create("/redis/{id}/scan", 'post'),
|
||||
getStringValue: Api.create("/redis/{id}/string-value", 'get'),
|
||||
saveStringValue: Api.create("/redis/{id}/string-value", 'post'),
|
||||
getHashValue: Api.create("/redis/{id}/hash-value", 'get'),
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<el-dialog :title="title" v-model="dialogVisible" :before-close="cancel" :show-close="false" width="35%" :destroy-on-close="true">
|
||||
<el-form :model="form" ref="accountForm" :rules="rules" label-width="85px">
|
||||
<el-form-item prop="username" label="用户名:" required>
|
||||
<el-input :disabled="edit" v-model.trim="form.username" placeholder="请输入账号用户名" auto-complete="off"></el-input>
|
||||
<el-input :disabled="edit" v-model.trim="form.username" placeholder="请输入账号用户名,密码默认与账号名一致" auto-complete="off"></el-input>
|
||||
</el-form-item>
|
||||
<!-- <el-form-item prop="password" label="密码:" required>
|
||||
<el-input type="password" v-model.trim="form.password" placeholder="请输入密码" autocomplete="new-password"></el-input>
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<div class="role-list">
|
||||
<el-card>
|
||||
<el-button v-auth="'account:add'" type="primary" icon="plus" @click="editAccount(true)">添加</el-button>
|
||||
<el-button v-auth="'account:update'" :disabled="chooseId == null" @click="editAccount(false)" type="primary" icon="edit">编辑</el-button>
|
||||
<!-- <el-button v-auth="'account:update'" :disabled="chooseId == null" @click="editAccount(false)" type="primary" icon="edit">编辑</el-button> -->
|
||||
<el-button v-auth="'account:saveRoles'" :disabled="chooseId == null" @click="roleEdit()" type="success" icon="setting"
|
||||
>角色分配</el-button
|
||||
>
|
||||
|
||||
@@ -633,10 +633,10 @@ echarts@^5.3.3:
|
||||
tslib "2.3.0"
|
||||
zrender "5.3.2"
|
||||
|
||||
element-plus@^2.2.8:
|
||||
version "2.2.8"
|
||||
resolved "https://registry.npmmirror.com/element-plus/-/element-plus-2.2.8.tgz#6bba6285c20d8bea42247977d8f605611fc2da93"
|
||||
integrity sha512-+cubFh1rgeGcc2LeBm7hv/1BKFJre/LIIdRntm9OLaIhysCxigjEwcxk9gbVT4KsbcjmoqZUr4/mwhIhQV6mvw==
|
||||
element-plus@^2.2.9:
|
||||
version "2.2.9"
|
||||
resolved "https://registry.npmmirror.com/element-plus/-/element-plus-2.2.9.tgz#f0366dfb2048d614813926274cb443f17e5fdef2"
|
||||
integrity sha512-jYbL0JkCdv95rkT6trZJjCAizLPySa0qcd2cgq+57SKQnCZAcNDDq4GbTuFRnNavdoeCJnuM3HIficTIUpsMOQ==
|
||||
dependencies:
|
||||
"@ctrl/tinycolor" "^3.4.1"
|
||||
"@element-plus/icons-vue" "^2.0.6"
|
||||
|
||||
Reference in New Issue
Block a user