后台管理手机端适配:侧栏收成 ☰ 抽屉,列表/总览响应式单列,编辑器贴边与工具栏收紧,修 iOS 聚焦缩放

This commit is contained in:
Sakurasan committed 2026-10-01 00:15:33 +08:00
1 parent 92654dec9f
commit bf3ce934dd
4 files changed
+168 -21

No files matched your search

+15 -3
View File
@@ -14,6 +14,7 @@ const route = useRoute()
const ready = ref(false)
const paletteOpen = ref(false)
const shortcutsOpen = ref(false)
const sideOpen = ref(false)
const counts = ref({ published: 0, draft: 0, tags: 0 })
async function loadCounts() {
@@ -75,6 +76,8 @@ function onKeydown(e) {
paletteOpen.value = true
return
}
// Esc 收起手机端抽屉
if (e.key === 'Escape') sideOpen.value = false
// ?
if (e.key === '?' && !e.metaKey && !e.ctrlKey && !e.altKey) {
const t = e.target
@@ -91,14 +94,17 @@ function onKeydown(e) {
onMounted(() => window.addEventListener('keydown', onKeydown))
onBeforeUnmount(() => window.removeEventListener('keydown', onKeydown))
// refresh counts when route changes (posts / tags edited)
watch(() => route.path, () => loadCounts())
// refresh counts when route changes (posts / tags edited); 顺手收起手机端抽屉
watch(() => route.path, () => {
sideOpen.value = false
loadCounts()
})
</script>
<template>
<div v-if="ready" class="admin-shell">
<ToastStack />
<aside class="admin-side">
<aside class="admin-side" :class="{ open: sideOpen }">
<div class="brand">
<RouterLink to="/admin" class="name">{{ site.site_title || 'ONE' }}</RouterLink>
<span class="label">· 后台</span>
@@ -162,12 +168,16 @@ watch(() => route.path, () => loadCounts())
<div class="admin-main">
<header class="admin-topbar">
<div class="crumbs">
<!-- 手机端唤出侧栏抽屉(≤860px 显示,桌面隐藏) -->
<button class="menu-btn" type="button" aria-label="后台菜单" @click="sideOpen = !sideOpen">☰</button>
<strong>{{ crumb }}</strong>
</div>
<div class="right">
<button class="cmd-hint" @click="paletteOpen = true">
搜索 / 命令 <kbd>⌘K</kbd>
</button>
<!-- 手机端侧栏进抽屉后,退出固定放顶栏;桌面隐藏,退出仍走侧栏 footer -->
<button class="btn leave-m" @click="logout">退出</button>
</div>
</header>
<main class="admin-content">
@@ -175,6 +185,8 @@ watch(() => route.path, () => loadCounts())
<RouterView :key="route.name === 'admin-edit' ? route.params.id : undefined" />
</main>
</div>
<!-- 手机端抽屉遮罩:点空白收回 -->
<div class="side-scrim" :class="{ on: sideOpen }" @click="sideOpen = false"></div>
<Transition name="pop">
<CommandPalette v-if="paletteOpen" @close="paletteOpen = false" />
+16 -3
View File
@@ -59,7 +59,7 @@ const chartMax = computed(() => {
</div>
</div>
<div style="display: grid; grid-template-columns: 1.4fr 1fr; gap: 16px;">
<div class="dash-cols">
<div class="panel">
<div class="panel-title">
<h2>最近 12 个月发布</h2>
@@ -107,7 +107,7 @@ const chartMax = computed(() => {
</div>
</div>
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 16px; margin-top: 16px;">
<div class="dash-cols even">
<div class="panel">
<div class="panel-title">
<h2>最近发布</h2>
@@ -137,4 +137,17 @@ const chartMax = computed(() => {
</div>
</div>
</section>
</template>
</template>
<style scoped>
/* 两块并排面板:桌面 1.4:1 / 1:1,手机(≤720px)单列——写死在行内样式里
会被 min-content 顶出横向滚动(量过:390 视口下 docW 418)。 */
.dash-cols {display: grid;
grid-template-columns: 1.4fr 1fr;
gap: 16px;}
.dash-cols.even {grid-template-columns: 1fr 1fr;
margin-top: 16px;}
@media (max-width: 720px) {
.dash-cols,
.dash-cols.even {grid-template-columns: 1fr;}
}
</style>
+3 -3
View File
@@ -910,13 +910,13 @@ const tbGroups = computed(() => [
<div class="editor-grid">
<div>
<!-- kind switch + title -->
<div style="display: flex; gap: 6px; align-items: center; margin-bottom: 10px;">
<div class="editor-top-row">
<button class="chip" :class="{ on: form.kind === 'long' }" @click="form.kind = 'long'">长文</button>
<button class="chip" :class="{ on: form.kind === 'short' }" @click="form.kind = 'short'">短文</button>
<span style="font-size: 12px; color: var(--admin-muted); margin-left: 4px;">
<span class="kind-hint">
{{ form.kind === 'short' ? '一两段话,时间线里不显示标题' : '有标题、有结构,适合讲完整一件事' }}
</span>
<span style="flex: 1;"></span>
<span class="spacer"></span>
<div class="editor-mode">
<button :class="{ on: mode === 'wysiwyg' }" @click="switchMode('wysiwyg')">富文本</button>
<button :class="{ on: mode === 'md' }" @click="switchMode('md')">Markdown</button>