- 统计来自甲骨文端每次云端模型请求的记录(经 30 分钟同步拉取到本地镜像)。 + 统计来自甲骨文端每次云端模型请求的记录(经 30 分钟同步拉取到本地镜像)。Key 列只显示配置里第几个 + Gemini Key 被用到(key1=主 key,key2/3/4=备用 key),不会显示密钥原文。 失败原因取值:429_quota(配额耗尽)/ timeout / 503_overload(过载重试)/ http_xxx / json_parse_failed 等。
+ diff --git a/fam-ui/src/views/People.vue b/fam-ui/src/views/People.vue index 9b67855..e74aaf9 100644 --- a/fam-ui/src/views/People.vue +++ b/fam-ui/src/views/People.vue @@ -4,13 +4,18 @@ import { api } from '../api.js' import PageHeader from '../components/PageHeader.vue' import EmptyState from '../components/EmptyState.vue' import PersonCard from '../components/PersonCard.vue' +import Spinner from '../components/Spinner.vue' const groups = ref([]) const allLabels = ref([]) const loadError = ref('') +const loading = ref(true) async function load() { loadError.value = '' + // 命名/合并后也会调用 load() 刷新——这时列表已经有内容,不重新显示大 Spinner + // 闪掉整页(丢失滚动位置),只有首次加载(还没有任何数据)才转圈。 + if (!groups.value.length) loading.value = true try { const data = await api.people() groups.value = data.groups @@ -18,6 +23,8 @@ async function load() { } catch (e) { loadError.value = e.message groups.value = [] + } finally { + loading.value = false } } @@ -30,7 +37,8 @@ onMounted(load){{ oracleError }}
共 {{ activities.length }} 条记录(活动日志仅保留最近 7 天)
+ diff --git a/fam-ui/src/views/Stats.vue b/fam-ui/src/views/Stats.vue index 6be4c03..5722e0b 100644 --- a/fam-ui/src/views/Stats.vue +++ b/fam-ui/src/views/Stats.vue @@ -3,17 +3,20 @@ import { computed, onMounted, ref } from 'vue' import { api, fmtDateOnly, fmtDateTime } from '../api.js' import PageHeader from '../components/PageHeader.vue' import EmptyState from '../components/EmptyState.vue' +import Spinner from '../components/Spinner.vue' const modelChart = ref([]) // [{label, value}] const attention = ref([]) const syncStatus = ref(null) const loadError = ref('') +const loading = ref(true) const BAR_COLORS = ['#5b8cff', '#8b6bff', '#3ddc9b', '#f5b84e', '#4fd1e8', '#ff7373'] const maxVal = computed(() => Math.max(1, ...modelChart.value.map(m => m.value))) async function load() { loadError.value = '' + loading.value = true try { const [ms, att, statusData] = await Promise.all([ api.modelStats(), @@ -30,6 +33,8 @@ async function load() { syncStatus.value = statusData.sync } catch (e) { loadError.value = e.message + } finally { + loading.value = false } } @@ -39,6 +44,8 @@ onMounted(load)