Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
陈曦
sub2api
Commits
76448ab5
Commit
76448ab5
authored
Jan 14, 2026
by
IanShaw027
Browse files
refactor(frontend): 优化ops看板骨架屏组件
- 添加 fullscreen 属性支持,适配全屏模式 - 优化骨架屏布局,更好地匹配实际看板结构 - 改进加载动画效果,提升用户体验
parent
9584af5c
Changes
2
Show whitespace changes
Inline
Side-by-side
frontend/src/views/admin/ops/OpsDashboard.vue
View file @
76448ab5
...
...
@@ -8,7 +8,7 @@
{{
errorMessage
}}
</div>
<OpsDashboardSkeleton
v-if=
"loading && !hasLoadedOnce"
/>
<OpsDashboardSkeleton
v-if=
"loading && !hasLoadedOnce"
:fullscreen=
"isFullscreen"
/>
<OpsDashboardHeader
v-else-if=
"opsEnabled"
...
...
frontend/src/views/admin/ops/components/OpsDashboardSkeleton.vue
View file @
76448ab5
<
script
setup
lang=
"ts"
>
interface
Props
{
fullscreen
?:
boolean
}
const
props
=
withDefaults
(
defineProps
<
Props
>
(),
{
fullscreen
:
false
})
</
script
>
<
template
>
<div
class=
"space-y-6"
>
<!-- Header -->
<div
class=
"rounded-3xl bg-white
p-6
shadow-sm ring-1 ring-gray-900/5 dark:bg-dark-800 dark:ring-dark-700"
>
<div
class=
"flex flex-
col gap-4 sm:flex-row sm:
items-center
sm:
justify-between"
>
<!-- Header
(matches OpsDashboardHeader + overview blocks)
-->
<div
:
class=
"
['
rounded-3xl bg-white shadow-sm ring-1 ring-gray-900/5 dark:bg-dark-800 dark:ring-dark-700
', props.fullscreen ? 'p-8' : 'p-6']
"
>
<div
class=
"flex flex-
wrap
items-center justify-between
gap-4 border-b border-gray-100 pb-4 dark:border-dark-700
"
>
<div
class=
"space-y-2"
>
<div
class=
"h-
5
w-4
8
animate-pulse rounded bg-gray-200 dark:bg-dark-700"
></div>
<div
class=
"h-
4
w-
72
animate-pulse rounded bg-gray-100 dark:bg-dark-700/70"
></div>
<div
class=
"h-
6
w-4
4
animate-pulse rounded bg-gray-200 dark:bg-dark-700"
></div>
<div
class=
"h-
3
w-
80
animate-pulse rounded bg-gray-100 dark:bg-dark-700/70"
></div>
</div>
<div
class=
"flex items-center gap-3"
>
<div
v-if=
"!props.fullscreen"
class=
"flex flex-wrap items-center gap-3"
>
<div
class=
"h-9 w-[140px] animate-pulse rounded-xl bg-gray-200 dark:bg-dark-700"
></div>
<div
class=
"h-9 w-[160px] animate-pulse rounded-xl bg-gray-200 dark:bg-dark-700"
></div>
<div
class=
"h-9 w-[150px] animate-pulse rounded-xl bg-gray-200 dark:bg-dark-700"
></div>
<div
class=
"h-9 w-9 animate-pulse rounded-xl bg-gray-200 dark:bg-dark-700"
></div>
<div
class=
"h-9 w-28 animate-pulse rounded-xl bg-gray-200 dark:bg-dark-700"
></div>
<div
class=
"h-9 w-28 animate-pulse rounded-xl bg-gray-200 dark:bg-dark-700"
></div>
<div
class=
"h-9 w-9 animate-pulse rounded-xl bg-gray-200 dark:bg-dark-700"
></div>
</div>
</div>
<div
class=
"mt-6 grid grid-cols-2 gap-4 sm:grid-cols-4"
>
<div
v-for=
"i in 4"
:key=
"i"
class=
"rounded-2xl bg-gray-50 p-4 dark:bg-dark-900/30"
>
<div
class=
"h-3 w-16 animate-pulse rounded bg-gray-200 dark:bg-dark-700"
></div>
<div
class=
"mt-3 h-6 w-24 animate-pulse rounded bg-gray-200 dark:bg-dark-700"
></div>
<div
class=
"mt-6 grid grid-cols-1 gap-6 lg:grid-cols-12"
>
<div
class=
"rounded-2xl bg-gray-50 p-4 dark:bg-dark-900/30 lg:col-span-5"
>
<div
class=
"grid h-full grid-cols-1 gap-6 md:grid-cols-[200px_1fr] md:items-center"
>
<div
class=
"h-28 animate-pulse rounded-xl bg-gray-100 dark:bg-dark-700/70"
></div>
<div
class=
"space-y-4"
>
<div
class=
"h-4 w-32 animate-pulse rounded bg-gray-200 dark:bg-dark-700"
></div>
<div
class=
"grid grid-cols-2 gap-3"
>
<div
v-for=
"i in 4"
:key=
"i"
class=
"h-14 animate-pulse rounded-xl bg-gray-100 dark:bg-dark-700/70"
></div>
</div>
</div>
</div>
</div>
<!-- Charts -->
<div
class=
"grid grid-cols-1 gap-6 lg:grid-cols-2"
>
<div
class=
"rounded-3xl bg-white p-6 shadow-sm ring-1 ring-gray-900/5 dark:bg-dark-800 dark:ring-dark-700"
>
<div
class=
"h-4 w-40 animate-pulse rounded bg-gray-200 dark:bg-dark-700"
></div>
<div
class=
"mt-6 h-64 animate-pulse rounded-2xl bg-gray-100 dark:bg-dark-700/70"
></div>
<div
class=
"lg:col-span-7"
>
<div
class=
"grid h-full grid-cols-1 content-center gap-4 sm:grid-cols-2 lg:grid-cols-3"
>
<div
v-for=
"i in 6"
:key=
"i"
class=
"h-20 animate-pulse rounded-2xl bg-gray-50 dark:bg-dark-900/30"
></div>
</div>
</div>
<div
class=
"rounded-3xl bg-white p-6 shadow-sm ring-1 ring-gray-900/5 dark:bg-dark-800 dark:ring-dark-700"
>
<div
class=
"h-4 w-40 animate-pulse rounded bg-gray-200 dark:bg-dark-700"
></div>
<div
class=
"mt-6 h-64 animate-pulse rounded-2xl bg-gray-100 dark:bg-dark-700/70"
></div>
</div>
</div>
<!--
Cards
-->
<!--
Row: Concurrency + Throughput (matches OpsDashboard.vue)
-->
<div
class=
"grid grid-cols-1 gap-6 lg:grid-cols-3"
>
<div
:class=
"['min-h-[360px] rounded-3xl bg-white shadow-sm ring-1 ring-gray-900/5 dark:bg-dark-800 dark:ring-dark-700 lg:col-span-1', props.fullscreen ? 'p-8' : 'p-6']"
>
<div
class=
"h-4 w-44 animate-pulse rounded bg-gray-200 dark:bg-dark-700"
></div>
<div
class=
"mt-6 h-72 animate-pulse rounded-2xl bg-gray-100 dark:bg-dark-700/70"
></div>
</div>
<div
:class=
"['min-h-[360px] rounded-3xl bg-white shadow-sm ring-1 ring-gray-900/5 dark:bg-dark-800 dark:ring-dark-700 lg:col-span-2', props.fullscreen ? 'p-8' : 'p-6']"
>
<div
class=
"h-4 w-56 animate-pulse rounded bg-gray-200 dark:bg-dark-700"
></div>
<div
class=
"mt-6 h-72 animate-pulse rounded-2xl bg-gray-100 dark:bg-dark-700/70"
></div>
</div>
</div>
<!-- Row: Visual Analysis (baseline 3-up grid) -->
<div
class=
"grid grid-cols-1 gap-6 md:grid-cols-3"
>
<div
v-for=
"i in 3"
:key=
"i"
class=
"rounded-3xl bg-white
p-6
shadow-sm ring-1 ring-gray-900/5 dark:bg-dark-800 dark:ring-dark-700"
:
class=
"
['
rounded-3xl bg-white shadow-sm ring-1 ring-gray-900/5 dark:bg-dark-800 dark:ring-dark-700
', props.fullscreen ? 'p-8' : 'p-6']
"
>
<div
class=
"h-4 w-36 animate-pulse rounded bg-gray-200 dark:bg-dark-700"
></div>
<div
class=
"mt-4 space-y-3"
>
<div
class=
"h-3 w-2/3 animate-pulse rounded bg-gray-100 dark:bg-dark-700/70"
></div>
<div
class=
"h-3 w-1/2 animate-pulse rounded bg-gray-100 dark:bg-dark-700/70"
></div>
<div
class=
"h-3 w-3/5 animate-pulse rounded bg-gray-100 dark:bg-dark-700/70"
></div>
<div
class=
"h-4 w-44 animate-pulse rounded bg-gray-200 dark:bg-dark-700"
></div>
<div
class=
"mt-6 h-56 animate-pulse rounded-2xl bg-gray-100 dark:bg-dark-700/70"
></div>
</div>
</div>
<!-- Alert Events -->
<div
:class=
"['rounded-3xl bg-white shadow-sm ring-1 ring-gray-900/5 dark:bg-dark-800 dark:ring-dark-700', props.fullscreen ? 'p-8' : 'p-6']"
>
<div
class=
"flex flex-wrap items-center justify-between gap-4"
>
<div
class=
"h-4 w-48 animate-pulse rounded bg-gray-200 dark:bg-dark-700"
></div>
<div
v-if=
"!props.fullscreen"
class=
"flex flex-wrap items-center gap-2"
>
<div
class=
"h-9 w-[140px] animate-pulse rounded-xl bg-gray-200 dark:bg-dark-700"
></div>
<div
class=
"h-9 w-[120px] animate-pulse rounded-xl bg-gray-200 dark:bg-dark-700"
></div>
<div
class=
"h-9 w-[120px] animate-pulse rounded-xl bg-gray-200 dark:bg-dark-700"
></div>
</div>
</div>
<div
class=
"mt-6 space-y-3"
>
<div
v-for=
"i in 6"
:key=
"i"
class=
"flex items-center justify-between gap-4 rounded-2xl bg-gray-50 p-4 dark:bg-dark-900/30"
>
<div
class=
"flex-1 space-y-2"
>
<div
class=
"h-3 w-56 animate-pulse rounded bg-gray-200 dark:bg-dark-700"
></div>
<div
class=
"h-3 w-80 animate-pulse rounded bg-gray-100 dark:bg-dark-700/70"
></div>
</div>
<div
class=
"h-7 w-20 animate-pulse rounded-xl bg-gray-200 dark:bg-dark-700"
></div>
</div>
</div>
</div>
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment