kt-template-admin/apps/web-antdv-next/src/views/qqbot/plugin/list.tsx

172 lines
5.1 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import type { TableColumnType } from 'antdv-next';
import type { QqbotApi } from '#/api/qqbot';
import type { KtTableApi, KtTableButton } from '#/components/ktTable';
import type { DictOption } from '#/hooks/useDict';
import { defineComponent, onMounted, ref } from 'vue';
import { Page } from '@vben/common-ui';
import { message, Tag } from 'antdv-next';
import {
getQqbotPluginHealth,
getQqbotPluginList,
getQqbotPluginOperationList,
} from '#/api/qqbot';
import { KtTable, useKtTable } from '#/components/ktTable';
import { useDict } from '#/hooks/useDict';
const AKtTable = KtTable as any;
const QQBOT_PLUGIN_TRIGGER_MODE_DICT = 'QQBOT_PLUGIN_TRIGGER_MODE';
const qqbotPluginTriggerModeFallback: Array<
DictOption<QqbotApi.PluginTriggerMode>
> = [
{ label: '命令', value: 'command' },
{ label: '事件', value: 'event' },
];
export default defineComponent({
name: 'QqBotPluginList',
setup() {
const pluginOptions = ref<Array<{ label: string; value: string }>>([]);
const pluginMap = ref<Record<string, QqbotApi.Plugin>>({});
const {
labelOf: getTriggerModeLabel,
options: triggerModeOptions,
reload: reloadTriggerModeDict,
} = useDict<QqbotApi.PluginTriggerMode>(QQBOT_PLUGIN_TRIGGER_MODE_DICT, {
fallbackOptions: qqbotPluginTriggerModeFallback,
immediate: false,
});
const columns: Array<TableColumnType<QqbotApi.PluginOperation>> = [
{ dataIndex: 'pluginKey', key: 'pluginKey', title: '插件', width: 160 },
{
dataIndex: 'triggerMode',
key: 'triggerMode',
title: '触发方式',
width: 120,
},
{ dataIndex: 'key', key: 'key', title: '能力 Key', width: 220 },
{ dataIndex: 'name', key: 'name', title: '能力名称', width: 160 },
{
dataIndex: 'description',
key: 'description',
title: '说明',
width: 360,
},
{
dataIndex: 'cacheTtlMs',
key: 'cacheTtlMs',
title: '建议缓存',
width: 120,
},
];
const api: KtTableApi<QqbotApi.PluginOperation> = {
list: async (params) =>
await getQqbotPluginOperationList(params.pluginKey, params.triggerMode),
};
const buttons: Array<KtTableButton<QqbotApi.PluginOperation>> = [
{
key: 'health',
label: '健康检查',
onClick: async () => {
const health = await getQqbotPluginHealth();
const content = health
.map(
(item) =>
`${getTriggerModeLabel(item.triggerMode, '-')} ${item.name || item.pluginKey || ''}: ${item.status}${item.message ? ` ${item.message}` : ''}`,
)
.join('');
message.success(content || '插件健康检查完成');
},
},
];
const [registerTable] = useKtTable<QqbotApi.PluginOperation>({
api,
buttons,
columns,
formOptions: {
schema: [
{
component: 'Select',
componentProps: () => ({
allowClear: true,
options: triggerModeOptions.value,
}),
fieldName: 'triggerMode',
label: '触发方式',
},
{
component: 'Select',
componentProps: () => ({
allowClear: true,
options: pluginOptions.value,
}),
fieldName: 'pluginKey',
label: '插件',
},
],
},
showSelection: false,
tableTitle: '插件能力',
});
onMounted(() => {
void loadMetadata();
});
async function loadMetadata() {
const [plugins] = await Promise.all([
getQqbotPluginList(),
reloadTriggerModeDict(),
]);
const nextPluginMap: Record<string, QqbotApi.Plugin> = {};
for (const item of plugins) {
nextPluginMap[item.key] = item;
}
pluginMap.value = nextPluginMap;
pluginOptions.value = plugins.map((item) => ({
label: `${item.name} (${item.key} / ${getTriggerModeLabel(item.triggerMode, '-')})`,
value: item.key,
}));
}
return () => (
<Page autoContentHeight>
<AKtTable
onRegister={registerTable}
v-slots={{
bodyCell: ({ column, record }: any) => {
const row = record as QqbotApi.PluginOperation;
if (column.key === 'pluginKey') {
const plugin = pluginMap.value[row.pluginKey];
return plugin ? (
<Tag color="processing">
{plugin.name} v{plugin.version}
</Tag>
) : (
row.pluginKey
);
}
if (column.key === 'triggerMode') {
return (
<Tag color={row.triggerMode === 'event' ? 'warning' : 'blue'}>
{getTriggerModeLabel(row.triggerMode, '-')}
</Tag>
);
}
if (column.key === 'cacheTtlMs') {
return row.cacheTtlMs ? `${row.cacheTtlMs} ms` : '-';
}
return undefined;
},
}}
/>
</Page>
);
},
});