fix: version 页改 antd a-table + 初始服务端探测(发布=注册到服务端)

This commit is contained in:
2026-08-06 16:11:16 +08:00
parent 2c7ebf4efc
commit 787a83c550
@@ -2,16 +2,15 @@
/**
* 模板版本发布(issue #183 [E2]):发布 = 注册新版本到服务端注册表;
* 注册表离线时降级本地记录并标注。
* 表格:antd a-table(响应式直绑,规避 vxe-grid proxy 时序)。
*/
import { ref } from 'vue';
import { onMounted, ref } from 'vue';
import { Page, VbenButton } from '@vben/common-ui';
import { MaterialSymbolsAdd } from '@vben/icons';
import { message } from 'antdv-next';
import type { VxeTableGridOptions } from '#/adapter/vxe-table';
import { useVbenVxeGrid } from '#/adapter/vxe-table';
import { registerModel } from '#/api/iaop/registry';
import { fetchRegistryModels, registerModel } from '#/api/iaop/registry';
interface VersionRow {
version: string;
@@ -28,37 +27,31 @@ const rows = ref<VersionRow[]>([
{ version: 'v0.8.0', stage: 'dev', time: '2026-08-03 09:00', author: 'bot_dev1', note: '布局资产初版' },
]);
const gridOptions: VxeTableGridOptions = {
rowConfig: { keyField: 'version' },
height: 'auto',
stripe: true,
columns: [
{ title: '版本', field: 'version', width: 110 },
{ title: '阶段', field: 'stage', width: 100, slots: { default: 'stage' } },
{ title: '时间', field: 'time', width: 170 },
{ title: '作者', field: 'author', width: 110 },
{ title: '说明', field: 'note', minWidth: 200 },
],
proxy: {
query: async ({ page } = {}) => {
// page 可能缺省(分页未就绪的首次查询),兜底返回全量
const cur = page?.currentPage ?? 1;
const size = page?.pageSize ?? (rows.value.length || 10);
return {
items: rows.value.slice((cur - 1) * size, cur * size),
total: rows.value.length,
};
},
},
};
const columns = [
{ title: '版本', dataIndex: 'version', key: 'version', width: 120 },
{ title: '阶段', dataIndex: 'stage', key: 'stage', width: 110 },
{ title: '时间', dataIndex: 'time', key: 'time', width: 180 },
{ title: '作者', dataIndex: 'author', key: 'author', width: 120 },
{ title: '说明', dataIndex: 'note', key: 'note' },
];
const [Grid, gridApi] = useVbenVxeGrid({ gridOptions });
const tagColor = (stage: string) =>
stage === 'prod' ? 'green' : stage === 'staging' ? 'orange' : 'blue';
onMounted(async () => {
// 初始探测服务端在线状态(注册表可达 → 在线)
try {
await fetchRegistryModels();
online.value = true;
} catch {
online.value = false;
}
});
async function publish() {
const version = `v${Date.now() % 100000}`;
const name = 'iaop-template';
try {
// 发布 = 注册新版本到服务端注册表(staging)
await registerModel({ name, version, stage: 'staging', description: '手动发布(前端)' });
online.value = true;
rows.value.unshift({
@@ -76,7 +69,6 @@ async function publish() {
});
message.warning('注册表服务不可达:本次发布仅本地记录');
}
gridApi.query();
}
</script>
@@ -85,10 +77,12 @@ async function publish() {
<template #extra>
<VbenButton variant="solid" @click="publish"><MaterialSymbolsAdd class="size-4" />发布新版本</VbenButton>
</template>
<Grid>
<template #stage="{ row }">
<a-tag :color="row.stage === 'prod' ? 'green' : row.stage === 'staging' ? 'orange' : 'blue'">{{ row.stage }}</a-tag>
<a-table :data-source="rows" :columns="columns" row-key="version" size="small" :pagination="false">
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'stage'">
<a-tag :color="tagColor(record.stage)">{{ record.stage }}</a-tag>
</template>
</Grid>
</template>
</a-table>
</Page>
</template>