You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

202 lines
7.7 KiB

<template>
<div class="h-full flex flex-col">
<div class="bg-white border-b p-5">
<div v-for="(status,index) in statuses" :key="index" class="inline-block py-1 px-2 rounded border ml-1">
{{ status.name }} : {{ status.value }}
</div>
</div>
<a-row class="h-0 grow">
<a-col class="border-r h-full overflow-y-auto" :span="16">
<div class="p-5 border-t border-b" v-if="0 < params.length">
<a-row>
<a-col :span="8" v-for="group in params" :key="group.name" class="p-1">
<fieldset class="border">
<legend>{{ group.name }}</legend>
<div class="p-1" v-for="item in group.items" :key="item.key">
<service-configuration-param-value-edit
:param="item"
v-model:value="item.value"
@save-request="actionServiceParamSave"
></service-configuration-param-value-edit>
</div>
</fieldset>
</a-col>
</a-row>
<div class="p-1">
<a-button class="mr-1" @click="actionServiceParamReload">刷新</a-button>
<a-button @click="actionServiceParamSave">保存</a-button>
</div>
</div>
<div class="p-5">
<fieldset v-for="(group,groupIndex) in actions" :key="groupIndex" class="border my-1 p-1">
<legend>{{ group.name }}</legend>
<div v-for="action in group.items" :key="action.key" :class="{'inline-block ml-1':0 === action.params.length}">
<a-button v-if="0 === action.params.length" class="my-1"
:loading="action.isExecuting"
@click="actionServiceExecute(action)"
>{{ action.name }}</a-button>
<div v-else class="border rounded-md my-1 px-3 bg-white">
<span>{{ action.name }}</span>
<div class="inline-block mx-2" v-for="actionParam in action.params" :key="actionParam.key">
{{ actionParam.name }} :
<a-switch v-if="'java.lang.Boolean' === actionParam.type" v-model:checked="actionParam.value" />
<a-input v-else-if="'java.lang.String' === actionParam.type" class="w-24" v-model:value="actionParam.value" />
<a-input-number v-else-if="'java.lang.Integer' === actionParam.type" class="w-24" v-model:value="actionParam.value" />
<a-select v-else-if="'Enum' === actionParam.type" v-model:value="actionParam.value" :dropdownMatchSelectWidth="false">
<a-select-option v-for="(enumItem,enumIndex) in actionParam.options" :key="enumIndex" :value="enumItem.value">{{ enumItem.name }}</a-select-option>
</a-select>
<span v-else>{{ actionParam }}</span>
</div>
<a-button class="m-1" :loading="action.isExecuting" @click="actionServiceExecute(action)">执行</a-button>
</div>
</div>
</fieldset>
</div>
</a-col>
<a-col :span="8" class="p-5 h-full">
<service-configuration-action-log :log="actionLog"/>
</a-col>
</a-row>
</div>
</template>
<script setup>
import { onUnmounted, ref, watch } from 'vue';
import ApiClient from '@/utils/ApiClient';
import ServiceConfigurationParamValueEdit from './ServiceConfigurationParamValueEdit.vue'
import ServiceConfigurationActionLog from './ServiceConfigurationActionLog.vue'
/** @var {Object} */
const props = defineProps({
serviceKey : String,
});
/** @var {Array} */
const params = ref([]);
/** @var {Array} */
const actions = ref([]);
/** @var {Array} */
const statuses = ref([]);
/** @var {Object} */
const actionLog = ref(null);
/** @var {Integer} */
let statusRefreshTimer = null;
// watch service key
watch(() => props.serviceKey, handleServiceKeyChange);
// on unmounted
onUnmounted(() => {
if ( null !== statusRefreshTimer ) {
clearTimeout(statusRefreshTimer);
statusRefreshTimer = false;
}
});
// on mounted
async function handleServiceKeyChange() {
actionLog.value = null;
if ( null !== statusRefreshTimer ) {
clearTimeout(statusRefreshTimer);
statusRefreshTimer = null;
}
if ( null === props.serviceKey ) {
return ;
}
await actionServiceParamReload();
await serviceActionReload();
await refreshServiceStatusList();
}
// refresh service status list
async function refreshServiceStatusList() {
try {
let client = ApiClient.getClient();
statuses.value = await client.call('service-config/service-status-list', {serviceKey:props.serviceKey});
if ( false !== statusRefreshTimer ) {
statusRefreshTimer = setTimeout(refreshServiceStatusList, 500);
}
} catch ( e ) {/** nothing to do here */}
}
// service param reload
async function actionServiceParamReload() {
try {
params.value = [];
let client = ApiClient.getClient();
let list = await client.call('service-config/service-params-list', {serviceKey:props.serviceKey});
for ( var item of list ) {
let groupName = item.group;
let group = params.value.find( i => i.name === groupName);
if ( undefined === group ) {
group = {name:groupName, items:[]};
params.value.push(group);
}
group.items.push(item);
}
params.value.sort((a,b) => b.items.length - a.items.length || b.name.localeCompare(a.name));
} catch ( e ) {/** nothing to do here */}
}
// service param save
async function actionServiceParamSave() {
try {
let values = {};
for ( let group of params.value ) {
for ( let item of group.items ) {
values[item.key] = item.value;
}
}
let client = ApiClient.getClient();
await client.call('service-config/service-params-update', {serviceKey:props.serviceKey,params:values});
await actionServiceParamReload();
} catch ( e ) {/** nothing to do here */}
}
// service actions reload
async function serviceActionReload() {
try {
actions.value = [];
let client = ApiClient.getClient();
let list = await client.call('service-config/service-action-list', {serviceKey:props.serviceKey});
for ( let item of list ) {
let group = actions.value.find(i => i.name === item.group);
if ( undefined === group ) {
group = {name:item.group, items:[]};
actions.value.push(group);
}
group.items.push(item);
group.items.sort((a,b) => a.params.length - b.params.length);
}
actions.value.sort((a,b) => a.name.localeCompare(b.name));
} catch ( e ) {/** nothing to do here */}
}
// service action execute
async function actionServiceExecute(action) {
try {
let client = ApiClient.getClient();
let params = {};
params.serviceKey = props.serviceKey;
params.action = action.key;
params.params = [];
params.paramTypes = [];
for ( let item of action.params ) {
params.params.push(item.value);
let type = item.type;
if ( 'Enum' === type ) {
type = item.typeEnum;
}
params.paramTypes.push(type);
}
actionLog.value = {};
actionLog.value.action = params.action;
actionLog.value.params = params.params;
actionLog.value.response = null;
action.isExecuting = true;
actionLog.value.response = await client.call('service-config/service-action-exec',params);
action.isExecuting = false;
} catch ( e ) {
/** nothing to do here */
} finally {
action.isExecuting = false;
}
}
</script>