Files
WonderQ-Project/docs/superpowers/specs/2026-08-26-ruoyi-admin-shell-visual-design.md
T

174 lines
7.6 KiB
Markdown
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.
# WonderQ Admin UI Vue RuoYi 默认后台壳还原设计
## 1. 背景与目标
`WonderQ-Admin-UI-Vue` 当前使用自定义浅色侧栏和 88px 顶部区域。本次以仓库内 `RuoYi-Vue3` 的默认布局实现为唯一视觉与交互参考,将 WonderQ 管理端的后台壳完整还原为 RuoYi 默认后台结构,同时保留 WonderQ 已有业务页面、路由、权限和 API。
目标包括:
- 200px 深色侧栏、54px 折叠侧栏和递归权限菜单。
- 50px 顶部导航、汉堡按钮、面包屑和右侧工具栏。
- 34px TagsView 页签及关闭、刷新、右键菜单操作。
- 桌面端侧栏折叠、992px 移动端抽屉和遮罩交互。
- 用户下拉菜单、退出确认和布局设置入口。
- 右侧布局设置抽屉及 RuoYi 默认布局配置项。
## 2. 保留边界
以下能力保持现状,不因布局改造而改变:
- `auth.menus`、权限码、动态路由注册和鉴权流程。
- `src/api/` 下的请求路径、请求方法、Token 存储和响应类型。
- 首页、玩法、管家、线索、媒体、运营工具和系统资源等业务页面。
- 业务页面对后端 API 的调用、字段转换、加载态、错误态和提交行为。
- WonderQ 现有品牌名称和中文菜单内容。
用户下拉只提供现有范围内可兑现的布局设置和退出登录,不新增没有路由与业务契约支撑的个人中心页面。
## 3. 布局结构
将 `AdminLayout.vue` 调整为职责清晰的 RuoYi 风格布局组合:
```text
AdminLayout
├─ Sidebar
│ ├─ SidebarLogo
│ └─ SidebarMenu / SidebarItem
├─ MainContainer
│ ├─ Navbar
│ │ ├─ Hamburger
│ │ ├─ Breadcrumb
│ │ ├─ HeaderTools
│ │ └─ UserMenu
│ ├─ TagsView
│ └─ AppMain
│ └─ RouterView
└─ SettingsDrawer
```
建议的职责文件:
- `src/layouts/AdminLayout.vue`:仅负责布局编排、响应式状态和 RouterView。
- `src/components/layout/Sidebar.vue`:侧栏容器、折叠状态和移动端抽屉。
- `src/components/layout/SidebarItem.vue`:递归目录与页面菜单项。
- `src/components/layout/Navbar.vue`:顶栏、汉堡按钮、面包屑、工具栏和用户菜单。
- `src/components/layout/TagsView.vue`:页签渲染、关闭和右键菜单。
- `src/components/layout/SettingsDrawer.vue`:布局设置表单和即时预览。
- `src/stores/layout.ts`:侧栏、设备类型和壳层状态。
- `src/stores/tags.ts`:访问页签、固定页签和页签操作。
- `src/lib/layout-settings.ts`:默认值、本地存储读写和设置归一化。
菜单继续消费现有 `AdminMenu` 类型。菜单图标优先使用 `AdminMenu.icon`,缺失时按路径或组件名提供 Element Plus 图标回退,不修改 Admin API 契约。
## 4. 状态与数据流
### 4.1 布局状态
`layout` store 管理:
- `sidebarOpened`:桌面端侧栏是否展开。
- `mobile`:当前是否处于移动端断点。
- `withoutAnimation`:切换时是否关闭过渡。
- `settingsDrawerOpen`:布局设置抽屉是否打开。
断点沿用 RuoYi:视口小于 992px 时进入移动端。桌面端侧栏宽度为 200px,折叠后为 54px;移动端侧栏保持 200px,并通过平移和遮罩控制显示。
### 4.2 页签状态
`tags` store 管理:
- 固定的首页页签。
- 当前路由对应的访问页签。
- 页签的 `path`、`fullPath`、`name`、`title` 和 `query`。
- 当前页刷新、关闭当前、关闭其他、关闭左右侧和关闭全部。
路由变化后由布局层登记页签,重复访问同一路径只激活已有页签。刷新当前页使用现有的 `routeViewKey` 机制或等价的组件 key 更新,不改变 API 数据。
### 4.3 设置状态
使用独立的 `wonderq-admin-layout-setting` 本地存储键,避免与鉴权 Token 和其他项目配置耦合。设置项包括:
- `navType`:左侧菜单、混合菜单、顶部菜单。
- `sideTheme`:深色或浅色侧栏。
- `theme`:主色。
- `tagsView`、`tagsViewPersist`、`tagsIcon`、`tagsViewStyle`。
- `fixedHeader`、`sidebarLogo`、`dynamicTitle`、`footerVisible`。
读取本地配置时通过归一化函数过滤未知值,缺失或非法配置回退到 RuoYi 默认值。设置即时生效,保存后可在刷新页面后恢复,重置操作清理布局配置和持久化页签。
## 5. 交互设计
### 5.1 侧栏与移动端
- 桌面端点击汉堡按钮在 200px 与 54px 之间切换。
- 折叠时显示图标,菜单项保留可访问名称和悬停提示。
- 目录菜单保持单目录展开,当前路由使用 RuoYi 风格激活背景和主色文字。
- 移动端打开侧栏时渲染半透明遮罩,点击遮罩关闭。
- 移动端导航到页面后自动关闭侧栏。
### 5.2 顶栏与用户菜单
- 顶栏固定高度 50px,左侧显示汉堡按钮和动态面包屑。
- 右侧提供全屏、明暗主题、布局设置等工具入口。
- 用户下拉显示当前用户名称,提供布局设置和退出登录。
- 退出沿用现有确认弹窗、`auth.logout()` 和登录页跳转。
### 5.3 TagsView
- 首页页签固定存在;其他页面首次访问时创建页签。
- 当前页签使用 RuoYi 主色激活样式。
- 页签支持关闭按钮、中键关闭和右键菜单。
- 右键菜单提供刷新当前、关闭当前、关闭其他、关闭左侧、关闭右侧和全部关闭。
- 关闭当前页后跳转到最近可用页签;关闭全部后回到首页。
- 页签内容超出容器时水平滚动,并自动定位当前页。
### 5.4 布局设置抽屉
- 从右侧打开,默认宽度 300px,与 RuoYi 设置抽屉保持一致。
- 提供导航模式、主题风格、主色和系统布局配置。
- 依赖 TagsView 的选项在 TagsView 关闭时禁用。
- 保存配置给出成功提示;重置配置清除本地设置并恢复默认布局。
## 6. 视觉基线
以 `RuoYi-Vue3/src/assets/styles/variables.module.scss` 和布局组件样式为准:
- 侧栏背景:`#304156`。
- 侧栏悬停/激活背景:`#263445`。
- 子菜单背景:`#1f2d3d`。
- 菜单文字:`#bfcbd9`。
- 激活文字与主色:`#409eff`。
- 主内容背景:RuoYi 默认浅灰背景。
- 侧栏:200px / 54px。
- Navbar:50px。
- TagsView:34px。
- 页面表格、表单、弹窗优先使用 Element Plus 默认尺寸、边框和状态。
业务页面保留现有内容,仅统一页面壳的内容起始位置、固定 Header 下的滚动区域和移动端边距;不对业务字段或业务交互做无关重构。
## 7. 验证计划
自动验证:
```powershell
Set-Location .\WonderQ-Admin-UI-Vue
yarn test
yarn build
```
浏览器验证:
1. 1440px:检查深色侧栏、200px/54px 切换、50px 顶栏、34px 页签和页面滚动。
2. 1024px:检查临界断点和侧栏收起行为。
3. 390px:检查移动端抽屉、遮罩、自动关闭和业务页面横向溢出。
4. 依次验证首页、玩法、管家、线索、媒体、工具和系统资源页面的导航与页签。
5. 验证页签右键菜单、设置抽屉即时切换、用户下拉退出和全屏按钮。
6. 检查控制台无新增错误,确认 `/api/admin/...` 请求路径和业务响应结构未变化。
## 8. 风险与控制
- RuoYi 的顶部菜单、混合菜单会改变菜单展示位置,因此只在布局设置中改变壳层展示,不改变 `auth.menus`、权限码和路由路径。
- 移动端抽屉和固定 Header 可能影响原有业务页面高度,需在三种宽度下检查滚动容器和弹层层级。
- TagsView 关闭/刷新可能触发页面重新挂载,使用现有 `routeViewKey` 并验证表单未提交状态的预期行为。
- 不修改后端、数据库、迁移、鉴权和 API 契约,不执行数据库迁移或重置。