feat: 小问题修复

This commit is contained in:
meilin.huang
2022-04-01 11:23:22 +08:00
parent a475818967
commit d3c842ca92
10 changed files with 16 additions and 677 deletions

3
.gitignore vendored
View File

@@ -11,4 +11,5 @@
# Output of the go coverage tool, specifically when used with LiteIDE
*.out
*/node_modules/
*/node_modules/
**/vendor/

View File

@@ -4,13 +4,18 @@ export const imports = {
'RouterParent': RouterParent,
"Home": () => import('@/views/home/index.vue'),
'Personal': () => import('@/views/personal/index.vue'),
// machine
"MachineList": () => import('@/views/ops/machine'),
// sys
"ResourceList": () => import('@/views/system/resource'),
"RoleList": () => import('@/views/system/role'),
"AccountList": () => import('@/views/system/account'),
// project
"ProjectList": () => import('@/views/ops/project/ProjectList.vue'),
// db
"DbList": () => import('@/views/ops/db/DbList.vue'),
"SqlExec": () => import('@/views/ops/db'),
// redis
"RedisList": () => import('@/views/ops/redis'),
"DataOperation": () => import('@/views/ops/redis/DataOperation.vue'),
}

View File

@@ -1,15 +0,0 @@
import Api from '@/common/Api';
export const serviceApi = {
services: Api.create("/gw/services", 'get'),
saveService: Api.create("/gw/services", 'post'),
syncService: Api.create("/gw/services/{id}/sync", 'post'),
// 获取服务下的api信息
serviceApis: Api.create("/gw/services/{serviceId}/apis", 'get'),
saveServiceApi: Api.create("/gw/services/{serviceId}/apis", 'post'),
syncServiceApi: Api.create("/gw/services/{id}/apis/{apiId}/sync", 'post'),
// 获取项目下的成员信息
projectMems: Api.create("/gw/projects/{projectId}/members", 'get'),
saveProjectMem: Api.create("/gw/projects/{projectId}/members", 'post'),
deleteProjectMem: Api.create("/gw/projects/{projectId}/members/{accountId}", 'delete'),
}

View File

@@ -1,192 +0,0 @@
<template>
<div>
<el-dialog :title="title" v-model="dialogVisible" :show-close="false" :before-close="cancel" width="65%">
<el-form :model="form" ref="apiForm" :rules="rules" label-width="85px" size="small">
<el-form-item prop="serviceId" label="服务:" required>
<el-select style="width: 100%" v-model="form.serviceId" placeholder="请选择服务" @change="changeService" filterable>
<el-option v-for="item in services" :key="item.id" :label="`${item.name}`" :value="item.id"> </el-option>
</el-select>
</el-form-item>
<el-form-item prop="name" label="名称:" required>
<el-input v-model.trim="form.name" placeholder="请输入api名称" auto-complete="off"></el-input>
</el-form-item>
<el-form-item prop="code" label="code:" required>
<el-input :disabled="form.id" v-model.trim="form.code" placeholder="请输入code" auto-complete="off"></el-input>
</el-form-item>
<el-form-item prop="method" label="method:" required>
<el-select style="width: 100%" v-model="form.method" placeholder="请选择请求方法" @change="changeService" filterable>
<el-option key="get" label="GET" value="GET"> </el-option>
<el-option key="post" label="POST" value="POST"> </el-option>
<el-option key="put" label="PUT" value="PUT"> </el-option>
<el-option key="delete" label="DELETE" value="DELETE"> </el-option>
</el-select>
</el-form-item>
<el-form-item prop="uri" label="uri:" required>
<el-input v-model.trim="form.uri" placeholder="请输入method:uri格式"></el-input>
</el-form-item>
<el-form-item label="schema:">
<!-- <vue3-json-editor v-model="jsonschema" @json-change="schemaChange" :show-btns="false" :expandedOnStart="true" /> -->
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" :loading="btnLoading" @click="btnOk" size="mini"> </el-button>
<el-button @click="cancel()" size="mini"> </el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script lang="ts">
import { toRefs, reactive, watch, defineComponent, ref } from 'vue';
import { serviceApi } from '../api';
import { ElMessage } from 'element-plus';
// import { Vue3JsonEditor } from 'vue3-json-editor';
export default defineComponent({
name: 'RedisEdit',
components: {
// Vue3JsonEditor,
},
props: {
visible: {
type: Boolean,
},
services: {
type: Array,
},
api: {
type: [Boolean, Object],
},
title: {
type: String,
},
},
setup(props: any, { emit }) {
const apiForm: any = ref(null);
const state = reactive({
dialogVisible: false,
services: [],
form: {
id: null,
name: null,
code: null,
uri: null,
serviceName: null,
serviceId: null,
schema: null,
},
jsonschema: {},
btnLoading: false,
rules: {
serviceId: [
{
required: true,
message: '请选择服务',
trigger: ['change', 'blur'],
},
],
name: [
{
required: true,
message: '请输入api名称',
trigger: ['change', 'blur'],
},
],
method: [
{
required: true,
message: '请输入请求method',
trigger: ['change', 'blur'],
},
],
uri: [
{
required: true,
message: '请输入请求uri',
trigger: ['change', 'blur'],
},
],
code: [
{
required: true,
message: '请输入code',
trigger: ['change', 'blur'],
},
],
},
});
watch(props, async (newValue) => {
state.services = newValue.services;
if (newValue.api) {
state.form = { ...newValue.api };
console.log(state.form)
if (state.form.schema) {
state.jsonschema = JSON.parse(state.form.schema as any);
}
} else {
state.form = { } as any;
}
state.dialogVisible = newValue.visible;
});
const changeService = (serviceId: number) => {
for (let p of state.services as any) {
if (p.id == serviceId) {
state.form.serviceName = p.name;
}
}
};
const schemaChange = (jsonValue: any) => {
state.form.schema = JSON.stringify(jsonValue) as any;
};
const btnOk = async () => {
apiForm.value.validate((valid: boolean) => {
if (valid) {
serviceApi.saveServiceApi.request(state.form).then(() => {
ElMessage.success('保存成功');
emit('val-change', state.form);
state.btnLoading = true;
setTimeout(() => {
state.btnLoading = false;
}, 1000);
cancel();
});
} else {
ElMessage.error('请正确填写信息');
return false;
}
});
};
const cancel = () => {
emit('update:visible', false);
emit('cancel');
setTimeout(() => {
apiForm.value.resetFields();
// 重置对象属性为null
state.form = {} as any;
state.jsonschema = {};
}, 200);
};
return {
...toRefs(state),
schemaChange,
apiForm,
changeService,
btnOk,
cancel,
};
},
});
</script>
<style lang="scss">
</style>

View File

@@ -1,239 +0,0 @@
<template>
<div>
<div class="toolbar">
<el-button @click="showSaveApiDialog" v-auth="permissions.saveProject" type="primary" icon="el-icon-plus" size="mini">添加</el-button>
<el-button
@click="showSaveApiDialog(chooseData)"
v-auth="permissions.saveProject"
:disabled="chooseId == null"
type="primary"
icon="el-icon-edit"
size="mini"
>编辑</el-button
>
<el-button v-auth="'role:del'" :disabled="chooseId == null" type="danger" icon="el-icon-delete" size="mini">删除</el-button>
<div style="float: right">
<el-select v-model="query.serviceId" @change="changeService" placeholder="请选择服务" filterable size="small">
<el-option v-for="item in services" :key="item.id" :label="`${item.name}`" :value="item.id"> </el-option>
</el-select>
<el-input
class="mr2 ml2"
placeholder="请输入服务名!"
size="small"
style="width: 140px"
v-model="query.name"
@clear="search"
clearable
></el-input>
<el-button @click="search" type="success" icon="el-icon-search" size="mini"></el-button>
</div>
</div>
<el-table :data="apis" @current-change="choose" border ref="table" style="width: 100%">
<el-table-column label="选择" width="50px">
<template #default="scope">
<el-radio v-model="chooseId" :label="scope.row.id">
<i></i>
</el-radio>
</template>
</el-table-column>
<el-table-column prop="serviceName" label="服务"></el-table-column>
<el-table-column prop="name" label="名称" show-overflow-tooltip></el-table-column>
<el-table-column prop="code" label="code" show-overflow-tooltip> </el-table-column>
<el-table-column prop="method" label="method" min-width="45" show-overflow-tooltip> </el-table-column>
<el-table-column prop="uri" label="uri" show-overflow-tooltip> </el-table-column>
<el-table-column prop="createTime" label="创建时间">
<template #default="scope">
{{ $filters.dateFormat(scope.row.createTime) }}
</template>
</el-table-column>
<el-table-column prop="creator" label="创建者" min-width="50"> </el-table-column>
<el-table-column label="操作" min-width="50">
<template #default="scope">
<el-button
@click="syncServiceApi(scope.row)"
type="success"
icom="el-icon-tickets"
size="mini"
plain
:disabled="scope.row.canSync == -1"
>同步</el-button
>
</template>
</el-table-column>
<!-- <el-table-column label="查看更多" min-width="80px">
<template #default="scope">
<el-link @click.prevent="showMembers(scope.row)" type="success">成员</el-link>
<el-link class="ml5" @click.prevent="showEnv(scope.row)" type="info">环境</el-link>
</template>
</el-table-column> -->
</el-table>
<el-pagination
@current-change="handlePageChange"
style="text-align: center"
background
layout="prev, pager, next, total, jumper"
:total="total"
v-model:current-page="query.pageNum"
:page-size="query.pageSize"
/>
<api-edit :services="services" v-model:visible="saveApiDialog.visible" :api="saveApiDialog.form" @val-change="valChange"/>
<!-- <el-dialog width="400px" title="服务编辑" :before-close="cancelAddService" v-model="addServiceDialog.visible">
<el-form :model="addServiceDialog.form" size="small" label-width="70px">
<el-form-item label="服务名:" required>
<el-input :disabled="addServiceDialog.form.id ? true : false" v-model="addServiceDialog.form.name" auto-complete="off"></el-input>
</el-form-item>
<el-form-item label="描述:" required>
<el-input v-model="addServiceDialog.form.remark" auto-complete="off"></el-input>
</el-form-item>
<el-form-item label="地址:">
<el-input v-model="addServiceDialog.form.urls" auto-complete="off" placeholder="不填则注册中心获取"></el-input>
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button @click="saveService" type="primary" size="small"> </el-button>
<el-button @click="cancelAddService()" size="small"> </el-button>
</div>
</template>
</el-dialog> -->
</div>
</template>
<script lang="ts">
import { toRefs, reactive, onMounted, defineComponent } from 'vue';
import { serviceApi } from '../api';
import { ElMessage } from 'element-plus';
import { notEmpty } from '@/common/assert';
import ApiEdit from './ApiEdit.vue'
export default defineComponent({
name: 'ServiceList',
components: {
ApiEdit
},
setup() {
const state = reactive({
permissions: {
saveProject: 'project:save',
saveMember: 'project:member:add',
delMember: 'project:member:del',
saveEnv: 'project:env:add',
},
query: {
pageNum: 1,
pageSize: 10,
name: null,
},
total: 0,
apis: [],
services: [],
btnLoading: false,
chooseId: null as any,
chooseData: null as any,
saveApiDialog: {
title: '新增api',
visible: false,
form: { name: '', remark: '' },
},
});
onMounted(() => {
getServices();
// search();
});
const search = async () => {
let res = await serviceApi.serviceApis.request(state.query);
state.apis = res.list;
state.total = res.total;
};
const getServices = async () => {
let res = await serviceApi.services.request({ pateNum: 1, pageSize: 100 });
state.services = res.list;
};
const changeService = async () => {
search()
}
const handlePageChange = (curPage: number) => {
state.query.pageNum = curPage;
search();
};
const showSaveApiDialog = (data: any) => {
if (data) {
state.saveApiDialog.form = { ...data };
} else {
state.saveApiDialog.form = {} as any;
}
state.saveApiDialog.visible = true;
};
const cancelAddApi = () => {
state.saveApiDialog.visible = false;
state.saveApiDialog.form = {} as any;
};
const saveService = async () => {
const form = state.saveApiDialog.form as any;
notEmpty(form.name, '服务名不能为空');
notEmpty(form.remark, '服务描述不能为空');
await serviceApi.saveService.request(form);
ElMessage.success('保存成功');
search();
cancelAddApi();
};
const choose = (item: any) => {
if (!item) {
return;
}
state.chooseId = item.id;
state.chooseData = item;
};
const syncServiceApi = async (item: any) => {
await serviceApi.syncServiceApi.request({apiId: item.id, id: item.serviceId})
ElMessage.success("同步成功")
item.canSync = -1
}
const valChange = () => {
search();
}
// const addEnv = async () => {
// const envForm = state.showEnvDialog.envForm;
// envForm.projectId = state.chooseData.id;
// await projectApi.saveProjectEnv.request(envForm);
// ElMessage.success('保存成功');
// state.showEnvDialog.envs = await projectApi.projectEnvs.request({ projectId: envForm.projectId });
// cancelAddEnv();
// };
return {
...toRefs(state),
search,
changeService,
handlePageChange,
choose,
showSaveApiDialog,
saveService,
syncServiceApi,
cancelAddApi,
valChange,
};
},
});
</script>
<style lang="scss">
</style>

View File

@@ -1,223 +0,0 @@
<template>
<div>
<div class="toolbar">
<el-button @click="showAddServiceDialog" v-auth="permissions.saveProject" type="primary" icon="el-icon-plus" size="mini">添加</el-button>
<el-button
@click="showAddServiceDialog(chooseData)"
v-auth="permissions.saveProject"
:disabled="chooseId == null"
type="primary"
icon="el-icon-edit"
size="mini"
>编辑</el-button
>
<el-button v-auth="'role:del'" :disabled="chooseId == null" type="danger" icon="el-icon-delete" size="mini">删除</el-button>
<div style="float: right">
<el-input
class="mr2"
placeholder="请输入项目名!"
size="small"
style="width: 140px"
v-model="query.name"
@clear="search"
clearable
></el-input>
<el-button @click="search" type="success" icon="el-icon-search" size="mini"></el-button>
</div>
</div>
<el-table :data="services" @current-change="choose" border ref="table" style="width: 100%">
<el-table-column label="选择" width="50px">
<template #default="scope">
<el-radio v-model="chooseId" :label="scope.row.id">
<i></i>
</el-radio>
</template>
</el-table-column>
<el-table-column prop="name" label="服务名"></el-table-column>
<el-table-column prop="routePath" label="路由路径"></el-table-column>
<el-table-column prop="urls" label="服务地址">
<template #default="scope">
{{ scope.row.urls ? scope.row.urls : '注册中心' }}
</template>
</el-table-column>
<el-table-column prop="remark" label="描述" min-width="80px" show-overflow-tooltip></el-table-column>
<el-table-column prop="createTime" label="创建时间">
<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="查看更多" min-width="80px">
<template #default="scope">
<el-link @click.prevent="showMembers(scope.row)" type="success">成员</el-link>
<el-link class="ml5" @click.prevent="showEnv(scope.row)" type="info">环境</el-link>
</template>
</el-table-column> -->
<el-table-column label="操作" min-width="80px">
<template #default="scope">
<el-button
@click="syncService(scope.row)"
type="success"
icom="el-icon-tickets"
size="mini"
plain
:disabled="scope.row.canSync == -1"
>同步</el-button
>
</template>
</el-table-column>
</el-table>
<el-pagination
@current-change="handlePageChange"
style="text-align: center"
background
layout="prev, pager, next, total, jumper"
:total="total"
v-model:current-page="query.pageNum"
:page-size="query.pageSize"
/>
<el-dialog width="400px" title="服务编辑" :before-close="cancelAddService" v-model="addServiceDialog.visible">
<el-form :model="addServiceDialog.form" size="small" label-width="85px">
<el-form-item label="服务名:" required>
<el-input :disabled="addServiceDialog.form.id ? true : false" v-model="addServiceDialog.form.name" auto-complete="off"></el-input>
</el-form-item>
<el-form-item label="路由路径:" required>
<el-input v-model="addServiceDialog.form.routePath" auto-complete="off"></el-input>
</el-form-item>
<el-form-item label="描述:" required>
<el-input v-model="addServiceDialog.form.remark" auto-complete="off"></el-input>
</el-form-item>
<el-form-item label="地址:">
<el-input v-model="addServiceDialog.form.urls" auto-complete="off" placeholder="不填则注册中心获取"></el-input>
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button @click="saveService" type="primary" size="small"> </el-button>
<el-button @click="cancelAddService()" size="small"> </el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script lang="ts">
import { toRefs, reactive, onMounted, defineComponent } from 'vue';
import { serviceApi } from '../api';
import { ElMessage } from 'element-plus';
import { notEmpty } from '@/common/assert';
export default defineComponent({
name: 'ServiceList',
components: {},
setup() {
const state = reactive({
permissions: {
saveProject: 'project:save',
saveMember: 'project:member:add',
delMember: 'project:member:del',
saveEnv: 'project:env:add',
},
query: {
pageNum: 1,
pageSize: 10,
name: null,
},
total: 0,
services: [],
btnLoading: false,
chooseId: null as any,
chooseData: null as any,
addServiceDialog: {
title: '新增服务',
visible: false,
form: { name: '', remark: '' },
},
});
onMounted(() => {
search();
});
const search = async () => {
let res = await serviceApi.services.request(state.query);
state.services = res.list;
state.total = res.total;
};
const handlePageChange = (curPage: number) => {
state.query.pageNum = curPage;
search();
};
const showAddServiceDialog = (data: any) => {
if (data) {
state.addServiceDialog.form = {...data};
} else {
state.addServiceDialog.form = {} as any;
}
state.addServiceDialog.visible = true;
};
const cancelAddService = () => {
state.addServiceDialog.visible = false;
state.addServiceDialog.form = {} as any;
};
const saveService = async () => {
const form = state.addServiceDialog.form as any;
notEmpty(form.name, '服务名不能为空');
notEmpty(form.remark, '服务描述不能为空');
await serviceApi.saveService.request(form);
ElMessage.success('保存成功');
search();
cancelAddService();
};
const syncService = async (item: any) => {
await serviceApi.syncService.request({id: item.id})
ElMessage.success("同步成功")
item.canSync = -1
}
const choose = (item: any) => {
if (!item) {
return;
}
state.chooseId = item.id;
state.chooseData = item;
};
// const addEnv = async () => {
// const envForm = state.showEnvDialog.envForm;
// envForm.projectId = state.chooseData.id;
// await projectApi.saveProjectEnv.request(envForm);
// ElMessage.success('保存成功');
// state.showEnvDialog.envs = await projectApi.projectEnvs.request({ projectId: envForm.projectId });
// cancelAddEnv();
// };
// const roleEditChange = (data: any) => {
// ElMessage.success('修改成功!');
// search();
// };
return {
...toRefs(state),
search,
handlePageChange,
choose,
showAddServiceDialog,
saveService,
syncService,
cancelAddService,
};
},
});
</script>
<style lang="scss">
</style>

View File

@@ -74,7 +74,7 @@
/>
<el-link
v-auth="'resource:del'"
v-auth="'resource:delete'"
v-if="data.children == null && data.name !== '首页'"
@click.prevent="deleteMenu(data)"
type="danger"

View File

@@ -1,11 +1,11 @@
<template>
<div class="role-dialog">
<el-dialog :title="title" v-model="visible" :show-close="false" :before-close="cancel" width="500px">
<el-dialog :title="title" v-model="_visible" :show-close="false" :before-close="cancel" width="500px">
<el-form :model="form" label-width="90px">
<el-form-item label="角色名称:" required>
<el-form-item prop="name" label="角色名称:" required>
<el-input v-model="form.name" auto-complete="off"></el-input>
</el-form-item>
<el-form-item label="角色code:" required>
<el-form-item prop="code" label="角色code:" required>
<el-input :disabled="form.id != null" v-model="form.code" placeholder="COMMON开头则为所有账号共有角色" auto-complete="off"></el-input>
</el-form-item>
<el-form-item label="角色描述:">
@@ -41,7 +41,7 @@ export default defineComponent({
},
setup(props: any, { emit }) {
const state = reactive({
visible: false,
_visible: false,
form: {
id: null,
name: '',
@@ -52,7 +52,7 @@ export default defineComponent({
});
watch(props, (newValue) => {
state.visible = newValue.visible;
state._visible = newValue.visible;
if (newValue.data) {
state.form = { ...newValue.data };
} else {

View File

@@ -145,6 +145,8 @@ export default defineComponent({
const roleEditChange = () => {
ElMessage.success('修改成功!');
state.chooseId = null;
state.chooseData = null;
search();
};

View File

@@ -75,7 +75,7 @@ func (r *redisAppImpl) Save(re *entity.Redis) {
} else {
// 如果存在该库,则校验修改的库是否为该库
if err == nil {
biz.IsTrue(re.Id == re.Id, "该库已存在")
biz.IsTrue(oldRedis.Id == re.Id, "该库已存在")
}
// 先关闭数据库连接
CloseRedis(re.Id)