ui 优化
This commit is contained in:
@@ -7,6 +7,7 @@
|
||||
- [index.js](file://frontend/src/router/index.js)
|
||||
- [index.vue](file://frontend/src/layout/index.vue)
|
||||
- [lux-theme.css](file://frontend/src/styles/lux-theme.css)
|
||||
- [index.vue](file://frontend/src/views/toolbox/luxsin-controller/index.vue)
|
||||
</cite>
|
||||
|
||||
## 更新摘要
|
||||
@@ -15,6 +16,7 @@
|
||||
- 支持新的玻璃拟态设计系统,提供更现代的视觉效果
|
||||
- 优化了图标和标签项的视觉反馈机制
|
||||
- 改进了主题样式与Element Plus组件的集成效果
|
||||
- **新增**:完善了工具箱图标支持,在标签页中正确显示工具箱相关功能
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
@@ -29,7 +31,7 @@
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本文件为标签页视图组件的综合技术文档,聚焦于标签页的状态管理、数据结构设计、事件处理系统、生命周期管理、主题与图标配置以及与路由系统的集成与状态同步机制。该组件基于 Vue 3 Composition API 与 Element Plus Tabs 实现,支持标签页的激活、关闭、右键菜单操作、持久化存储,并通过 KeepAlive 实现组件缓存与内存优化。**最新更新**:增强了平滑颜色过渡动画(0.2s ease)以改善交互体验,并支持新的玻璃拟态设计系统。
|
||||
本文件为标签页视图组件的综合技术文档,聚焦于标签页的状态管理、数据结构设计、事件处理系统、生命周期管理、主题与图标配置以及与路由系统的集成与状态同步机制。该组件基于 Vue 3 Composition API 与 Element Plus Tabs 实现,支持标签页的激活、关闭、右键菜单操作、持久化存储,并通过 KeepAlive 实现组件缓存与内存优化。**最新更新**:增强了平滑颜色过渡动画(0.2s ease)以改善交互体验,并支持新的玻璃拟态设计系统,同时完善了工具箱图标的完整支持。
|
||||
|
||||
## 项目结构
|
||||
标签页视图组件位于前端工程的组件目录中,与路由、布局及主题样式协同工作:
|
||||
@@ -38,6 +40,7 @@
|
||||
- 路由层:定义页面路由与元信息,驱动标签页标题与图标
|
||||
- 布局层:承载标签页视图组件并提供面包屑导航与用户菜单
|
||||
- 样式层:深色主题与标签页视觉样式,包含玻璃拟态设计系统
|
||||
- 视图层:工具箱功能页面,提供设备控制和管理工具
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
@@ -47,26 +50,30 @@ TV["标签页视图组件<br/>TabsView.vue"]
|
||||
R["路由配置<br/>router/index.js"]
|
||||
T["标签页工具<br/>utils/tabs.js"]
|
||||
ST["主题样式<br/>styles/lux-theme.css"]
|
||||
TB["工具箱视图<br/>toolbox/luxsin-controller/index.vue"]
|
||||
end
|
||||
L --> TV
|
||||
TV --> R
|
||||
TV --> T
|
||||
L --> ST
|
||||
TV --> TB
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [index.vue:139-141](file://frontend/src/layout/index.vue#L139-L141)
|
||||
- [index.vue:151](file://frontend/src/layout/index.vue#L151)
|
||||
- [TabsView.vue:1-53](file://frontend/src/components/TabsView.vue#L1-L53)
|
||||
- [index.js:1-103](file://frontend/src/router/index.js#L1-L103)
|
||||
- [index.js:1-109](file://frontend/src/router/index.js#L1-L109)
|
||||
- [tabs.js:1-9](file://frontend/src/utils/tabs.js#L1-L9)
|
||||
- [lux-theme.css:1-1259](file://frontend/src/styles/lux-theme.css#L1-L1259)
|
||||
- [lux-theme.css:740-767](file://frontend/src/styles/lux-theme.css#L740-L767)
|
||||
- [index.vue:1-231](file://frontend/src/views/toolbox/luxsin-controller/index.vue#L1-L231)
|
||||
|
||||
**章节来源**
|
||||
- [index.vue:139-141](file://frontend/src/layout/index.vue#L139-L141)
|
||||
- [index.vue:151](file://frontend/src/layout/index.vue#L151)
|
||||
- [TabsView.vue:1-53](file://frontend/src/components/TabsView.vue#L1-L53)
|
||||
- [index.js:1-103](file://frontend/src/router/index.js#L1-L103)
|
||||
- [index.js:1-109](file://frontend/src/router/index.js#L1-L109)
|
||||
- [tabs.js:1-9](file://frontend/src/utils/tabs.js#L1-L9)
|
||||
- [lux-theme.css:1-1259](file://frontend/src/styles/lux-theme.css#L1-L1259)
|
||||
- [lux-theme.css:740-767](file://frontend/src/styles/lux-theme.css#L740-L767)
|
||||
- [index.vue:1-231](file://frontend/src/views/toolbox/luxsin-controller/index.vue#L1-L231)
|
||||
|
||||
## 核心组件
|
||||
- 标签页视图组件:负责标签集合的渲染、激活切换、关闭、右键菜单、持久化与 KeepAlive 缓存
|
||||
@@ -74,16 +81,18 @@ L --> ST
|
||||
- 工具模块:提供标签页存储键名、首页路径等常量与清理函数
|
||||
- 布局容器:承载标签页视图组件并提供面包屑导航与用户菜单
|
||||
- 主题样式:提供深色主题变量与标签页视觉样式,支持玻璃拟态设计系统
|
||||
- 工具箱视图:提供设备控制和数据同步功能的专用界面
|
||||
|
||||
**章节来源**
|
||||
- [TabsView.vue:55-287](file://frontend/src/components/TabsView.vue#L55-L287)
|
||||
- [index.js:6-67](file://frontend/src/router/index.js#L6-L67)
|
||||
- [index.js:6-72](file://frontend/src/router/index.js#L6-L72)
|
||||
- [tabs.js:1-9](file://frontend/src/utils/tabs.js#L1-L9)
|
||||
- [index.vue:139-141](file://frontend/src/layout/index.vue#L139-L141)
|
||||
- [index.vue:151](file://frontend/src/layout/index.vue#L151)
|
||||
- [lux-theme.css:740-767](file://frontend/src/styles/lux-theme.css#L740-L767)
|
||||
- [index.vue:1-231](file://frontend/src/views/toolbox/luxsin-controller/index.vue#L1-L231)
|
||||
|
||||
## 架构总览
|
||||
标签页视图组件通过路由钩子监听路由变化,动态生成或更新标签项;通过 Element Plus 的 Tabs 组件展示标签,通过 KeepAlive 实现组件缓存;通过 sessionStorage 持久化标签状态;通过右键菜单提供关闭、关闭其他、关闭全部等操作。**新增功能**:实现了平滑的颜色过渡动画,提升用户交互体验。
|
||||
标签页视图组件通过路由钩子监听路由变化,动态生成或更新标签项;通过 Element Plus 的 Tabs 组件展示标签,通过 KeepAlive 实现组件缓存;通过 sessionStorage 持久化标签状态;通过右键菜单提供关闭、关闭其他、关闭全部等操作。**新增功能**:实现了平滑的颜色过渡动画,提升用户交互体验,并完善了工具箱图标的完整支持。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
@@ -99,15 +108,16 @@ View-->>TV : 组件实例缓存
|
||||
TV->>TV : handleTabClick/右键菜单/关闭
|
||||
TV->>Store : persist() 更新状态
|
||||
Note over TV : 添加0.2s平滑颜色过渡动画
|
||||
Note over TV : 支持工具箱图标显示
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [TabsView.vue:176-286](file://frontend/src/components/TabsView.vue#L176-L286)
|
||||
- [index.js:76-100](file://frontend/src/router/index.js#L76-L100)
|
||||
- [index.js:68-72](file://frontend/src/router/index.js#L68-L72)
|
||||
|
||||
**章节来源**
|
||||
- [TabsView.vue:176-286](file://frontend/src/components/TabsView.vue#L176-L286)
|
||||
- [index.js:76-100](file://frontend/src/router/index.js#L76-L100)
|
||||
- [index.js:68-72](file://frontend/src/router/index.js#L68-L72)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
@@ -222,6 +232,7 @@ KeepAlive["computed keepAliveInclude"] --> Cache["KeepAlive include"]
|
||||
- 首页特殊处理:HOME_PATH 对应标签不可关闭
|
||||
- 路由跳转:激活标签时若 fullPath 与当前不同则执行 router.push
|
||||
- 子路由处理:根布局路由(path='/')不加入标签,children 的实际页面才加入
|
||||
- **工具箱集成**:工具箱路由 `/toolbox/luxsin-controller` 配置了 `icon: 'tools'` 元信息,支持在标签页中显示工具箱图标
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
@@ -235,46 +246,51 @@ TV->>TV : activateByKey(匹配 key)
|
||||
alt 需要跳转
|
||||
TV->>Router : router.push(fullPath)
|
||||
end
|
||||
Note over TV : 工具箱路由支持 tools 图标
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [TabsView.vue:88-103](file://frontend/src/components/TabsView.vue#L88-L103)
|
||||
- [TabsView.vue:180-191](file://frontend/src/components/TabsView.vue#L180-L191)
|
||||
- [TabsView.vue:193-200](file://frontend/src/components/TabsView.vue#L193-L200)
|
||||
- [index.js:76-100](file://frontend/src/router/index.js#L76-L100)
|
||||
- [index.js:68-72](file://frontend/src/router/index.js#L68-L72)
|
||||
|
||||
**章节来源**
|
||||
- [TabsView.vue:88-103](file://frontend/src/components/TabsView.vue#L88-L103)
|
||||
- [TabsView.vue:180-191](file://frontend/src/components/TabsView.vue#L180-L191)
|
||||
- [TabsView.vue:193-200](file://frontend/src/components/TabsView.vue#L193-L200)
|
||||
- [index.js:76-100](file://frontend/src/router/index.js#L76-L100)
|
||||
- [index.js:68-72](file://frontend/src/router/index.js#L68-L72)
|
||||
|
||||
### 主题定制、图标配置与动态内容渲染
|
||||
|
||||
**更新** 新增了平滑颜色过渡动画和玻璃拟态设计系统支持
|
||||
**更新** 新增了平滑颜色过渡动画、玻璃拟态设计系统支持和工具箱图标完整支持
|
||||
|
||||
- **平滑过渡动画**:标签页图标和文本元素添加了 `transition: color 0.2s ease` 属性,提供流畅的颜色变化效果
|
||||
- **玻璃拟态设计**:通过 CSS 变量和 backdrop-filter 实现现代玻璃质感效果
|
||||
- **主题定制**:深色主题变量集中于 lux-theme.css,标签页样式通过 :deep 选择器覆盖 Element Plus 默认样式
|
||||
- **图标配置**:通过 icon 键值映射到 Element Plus 图标组件,支持 document/list/upload/collection/home/user 等
|
||||
- **图标配置**:通过 icon 键值映射到 Element Plus 图标组件,支持 document/list/upload/collection/home/user/tools 等
|
||||
- **动态内容渲染**:router-view 结合 KeepAlive,通过 key 基于 fullPath 变更触发组件重新渲染
|
||||
- **工具箱图标支持**:在 iconMap 中添加了 `tools: Tools` 映射,工具箱路由配置了 `icon: 'tools'` 元信息
|
||||
|
||||
**新增特性**:
|
||||
- 图标悬停和激活状态的平滑颜色过渡(0.2s ease)
|
||||
- 标签页背景色的渐变过渡效果
|
||||
- 玻璃拟态边框和阴影效果
|
||||
- 增强的视觉层次感和深度感
|
||||
- **工具箱图标完整支持**:工具箱功能在标签页中正确显示工具箱图标
|
||||
|
||||
**章节来源**
|
||||
- [lux-theme.css:740-767](file://frontend/src/styles/lux-theme.css#L740-L767)
|
||||
- [TabsView.vue:320-324](file://frontend/src/components/TabsView.vue#L320-L324)
|
||||
- [TabsView.vue:64-76](file://frontend/src/components/TabsView.vue#L64-L76)
|
||||
- [TabsView.vue:46-50](file://frontend/src/components/TabsView.vue#L46-L50)
|
||||
- [index.js:68-72](file://frontend/src/router/index.js#L68-L72)
|
||||
|
||||
## 依赖关系分析
|
||||
- 组件依赖:TabsView.vue 依赖 vue-router、@element-plus/icons-vue、utils/tabs 常量
|
||||
- 路由依赖:路由配置提供 meta.title/meta.icon,影响标签标题与图标
|
||||
- 布局依赖:Layout 将 TabsView 作为主内容区的一部分
|
||||
- **工具箱依赖**:工具箱视图组件独立实现设备控制功能,通过路由系统集成到标签页系统中
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
@@ -284,19 +300,22 @@ TV --> UT["utils/tabs.js"]
|
||||
UT --> C["常量: TABS_STORAGE_KEY, HOME_PATH"]
|
||||
TV --> RT["router/index.js"]
|
||||
L["layout/index.vue"] --> TV
|
||||
TB["toolbox/luxsin-controller/index.vue"] --> TV
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [TabsView.vue:56-59](file://frontend/src/components/TabsView.vue#L56-L59)
|
||||
- [tabs.js:1-9](file://frontend/src/utils/tabs.js#L1-L9)
|
||||
- [index.js:1-103](file://frontend/src/router/index.js#L1-L103)
|
||||
- [index.vue:158](file://frontend/src/layout/index.vue#L158)
|
||||
- [index.js:1-109](file://frontend/src/router/index.js#L1-L109)
|
||||
- [index.vue:151](file://frontend/src/layout/index.vue#L151)
|
||||
- [index.vue:1-231](file://frontend/src/views/toolbox/luxsin-controller/index.vue#L1-L231)
|
||||
|
||||
**章节来源**
|
||||
- [TabsView.vue:56-59](file://frontend/src/components/TabsView.vue#L56-L59)
|
||||
- [tabs.js:1-9](file://frontend/src/utils/tabs.js#L1-L9)
|
||||
- [index.js:1-103](file://frontend/src/router/index.js#L1-L103)
|
||||
- [index.vue:158](file://frontend/src/layout/index.vue#L158)
|
||||
- [index.js:1-109](file://frontend/src/router/index.js#L1-L109)
|
||||
- [index.vue:151](file://frontend/src/layout/index.vue#L151)
|
||||
- [index.vue:1-231](file://frontend/src/views/toolbox/luxsin-controller/index.vue#L1-L231)
|
||||
|
||||
## 性能考量
|
||||
- KeepAlive 缓存:仅缓存有 name 的标签组件,避免无意义的实例保活
|
||||
@@ -304,6 +323,7 @@ L["layout/index.vue"] --> TV
|
||||
- DOM 重绘:标签标题与图标采用固定宽度与省略号,避免布局抖动
|
||||
- 路由跳转:仅在 fullPath 与当前不同才执行跳转,避免重复导航
|
||||
- **动画性能**:使用 CSS transition 而非 JavaScript 动画,确保 0.2s 过渡动画的流畅性
|
||||
- **工具箱性能**:工具箱视图组件使用独立的请求处理和错误处理机制,避免影响主标签页性能
|
||||
|
||||
## 故障排查指南
|
||||
- 标签无法关闭:检查 closable 字段,首页标签默认不可关闭
|
||||
@@ -312,6 +332,7 @@ L["layout/index.vue"] --> TV
|
||||
- 标签状态丢失:检查 sessionStorage 写入权限与容量限制
|
||||
- 路由跳转无效:检查 fullPath 与当前路由是否一致,避免不必要的 router.push
|
||||
- **动画问题**:检查浏览器是否支持 CSS transition 和 backdrop-filter 属性
|
||||
- **工具箱图标问题**:确认工具箱路由配置了正确的 `icon: 'tools'` 元信息,且 iconMap 中包含 `tools: Tools` 映射
|
||||
|
||||
**章节来源**
|
||||
- [TabsView.vue:101-101](file://frontend/src/components/TabsView.vue#L101-L101)
|
||||
@@ -319,21 +340,27 @@ L["layout/index.vue"] --> TV
|
||||
- [TabsView.vue:64-76](file://frontend/src/components/TabsView.vue#L64-L76)
|
||||
- [TabsView.vue:125-141](file://frontend/src/components/TabsView.vue#L125-L141)
|
||||
- [TabsView.vue:197-199](file://frontend/src/components/TabsView.vue#L197-L199)
|
||||
- [index.js:68-72](file://frontend/src/router/index.js#L68-L72)
|
||||
|
||||
## 结论
|
||||
标签页视图组件通过清晰的数据结构、完善的事件处理与路由集成,实现了标签的激活、关闭、右键菜单与持久化。**最新改进**:通过添加 0.2s 平滑颜色过渡动画和玻璃拟态设计系统支持,显著提升了用户体验和视觉品质。结合 KeepAlive 缓存与现代化主题样式,提供了优秀的交互性能和美观的界面表现。建议在扩展新功能时遵循现有模式,保持标签状态与路由状态的一致性,并注意缓存范围与持久化策略的平衡。
|
||||
标签页视图组件通过清晰的数据结构、完善的事件处理与路由集成,实现了标签的激活、关闭、右键菜单与持久化。**最新改进**:通过添加 0.2s 平滑颜色过渡动画、玻璃拟态设计系统支持和工具箱图标完整支持,显著提升了用户体验和视觉品质。结合 KeepAlive 缓存与现代化主题样式,提供了优秀的交互性能和美观的界面表现。工具箱功能的集成进一步完善了系统的功能完整性,为用户提供了便捷的设备管理和数据同步工具。建议在扩展新功能时遵循现有模式,保持标签状态与路由状态的一致性,并注意缓存范围与持久化策略的平衡。
|
||||
|
||||
## 附录
|
||||
- 常用配置项
|
||||
- 存储键名:TABS_STORAGE_KEY
|
||||
- 首页路径:HOME_PATH
|
||||
- 图标映射:document/list/upload/collection/home/user
|
||||
- 图标映射:document/list/upload/collection/home/user/tools
|
||||
- **新增动画配置**
|
||||
- 过渡时间:0.2s
|
||||
- 缓动函数:ease
|
||||
- 过渡属性:color
|
||||
- **工具箱功能配置**
|
||||
- 路由路径:/toolbox/luxsin-controller
|
||||
- 图标配置:icon: 'tools'
|
||||
- 功能描述:设备数据同步和控制工具
|
||||
- 最佳实践
|
||||
- 在路由 meta 中提供 title 与 icon,确保标签显示一致性
|
||||
- 控制 KeepAlive include 范围,避免过度缓存
|
||||
- 使用 sessionStorage 进行轻量级状态持久化,避免频繁写入
|
||||
- 利用 CSS transition 实现流畅的用户交互反馈
|
||||
- 利用 CSS transition 实现流畅的用户交互反馈
|
||||
- 为新功能模块配置合适的图标和元信息,确保在标签页中正确显示
|
||||
@@ -12,16 +12,17 @@
|
||||
- [frontend/src/utils/tabs.js](file://frontend/src/utils/tabs.js)
|
||||
- [frontend/src/views/home/index.vue](file://frontend/src/views/home/index.vue)
|
||||
- [frontend/src/views/login/index.vue](file://frontend/src/views/login/index.vue)
|
||||
- [frontend/src/views/toolbox/luxsin-controller/index.vue](file://frontend/src/views/toolbox/luxsin-controller/index.vue)
|
||||
</cite>
|
||||
|
||||
## 更新摘要
|
||||
**所做更改**
|
||||
- 更新了主布局组件以支持全新的玻璃拟态设计系统和深色宇宙主题
|
||||
- 新增了动态背景光球效果,营造沉浸式视觉体验
|
||||
- 重构了侧边栏为悬浮式玻璃面板,支持智能展开/收起交互
|
||||
- 实现了三层导航架构:轨道导航 + 分类菜单 + 面包屑导航
|
||||
- 全面升级了主题系统,采用CSS变量驱动的响应式设计
|
||||
- 优化了组件间的依赖关系和性能表现
|
||||
- 新增了工具箱功能模块,包含Tools和Operation图标的完整支持
|
||||
- 在侧边栏导航中添加了"工具箱"分类菜单项
|
||||
- 实现了luxsin-controller工具页面,提供设备数据同步功能
|
||||
- 更新了路由配置以支持新的工具箱路径
|
||||
- 增强了轨道导航系统,添加工具箱快捷访问入口
|
||||
- 完善了面包屑导航对工具箱页面的支持
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
@@ -44,6 +45,7 @@
|
||||
- **三层导航架构**:轨道导航 + 分类菜单 + 面包屑导航
|
||||
- **智能交互体验**:自动展开、悬停反馈、流畅过渡动画
|
||||
- **完整主题系统**:基于CSS变量的深色宇宙主题设计
|
||||
- **工具箱功能模块**:新增工具箱分类,集成设备管理工具
|
||||
|
||||
布局组件的核心特色包括:
|
||||
- **玻璃拟态设计**:backdrop-filter模糊效果与半透明背景
|
||||
@@ -52,6 +54,7 @@
|
||||
- **标签页管理**:多标签页浏览和持久化存储
|
||||
- **深色主题**:基于CSS变量的主题系统
|
||||
- **响应式适配**:针对不同屏幕尺寸的优化布局
|
||||
- **工具箱集成**:完整的工具箱功能模块,支持设备数据同步操作
|
||||
|
||||
## 项目结构
|
||||
|
||||
@@ -77,19 +80,21 @@ E --> O[model/]
|
||||
E --> P[ota/]
|
||||
E --> Q[share-code/]
|
||||
E --> R[system/]
|
||||
F --> S[index.js<br/>路由配置]
|
||||
G --> T[lux-theme.css<br/>主题样式]
|
||||
H --> U[tabs.js<br/>标签页工具]
|
||||
E --> S[toolbox/]
|
||||
S --> T[luxsin-controller/<br/>工具箱控制器]
|
||||
F --> U[index.js<br/>路由配置]
|
||||
G --> V[lux-theme.css<br/>主题样式]
|
||||
H --> W[tabs.js<br/>标签页工具]
|
||||
end
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [frontend/src/layout/index.vue:1-351](file://frontend/src/layout/index.vue#L1-L351)
|
||||
- [frontend/src/router/index.js:1-103](file://frontend/src/router/index.js#L1-L103)
|
||||
- [frontend/src/layout/index.vue:1-365](file://frontend/src/layout/index.vue#L1-L365)
|
||||
- [frontend/src/router/index.js:1-109](file://frontend/src/router/index.js#L1-L109)
|
||||
|
||||
**章节来源**
|
||||
- [frontend/src/layout/index.vue:1-351](file://frontend/src/layout/index.vue#L1-L351)
|
||||
- [frontend/src/router/index.js:1-103](file://frontend/src/router/index.js#L1-L103)
|
||||
- [frontend/src/layout/index.vue:1-365](file://frontend/src/layout/index.vue#L1-L365)
|
||||
- [frontend/src/router/index.js:1-109](file://frontend/src/router/index.js#L1-L109)
|
||||
|
||||
## 核心组件
|
||||
|
||||
@@ -117,13 +122,16 @@ N --> P[LuxMenu<br/>分类菜单]
|
||||
O --> Q[耳机管理图标]
|
||||
O --> R[升级管理图标]
|
||||
O --> S[分享码图标]
|
||||
P --> T[耳机管理子菜单]
|
||||
P --> U[升级管理子菜单]
|
||||
P --> V[分享码子菜单]
|
||||
O --> T[工具箱图标]
|
||||
P --> U[耳机管理子菜单]
|
||||
P --> V[升级管理子菜单]
|
||||
P --> W[分享码子菜单]
|
||||
P --> X[工具箱子菜单]
|
||||
X --> Y[luxsin-controller]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [frontend/src/layout/index.vue:2-146](file://frontend/src/layout/index.vue#L2-L146)
|
||||
- [frontend/src/layout/index.vue:2-102](file://frontend/src/layout/index.vue#L2-L102)
|
||||
|
||||
### 组件层次结构
|
||||
|
||||
@@ -157,18 +165,31 @@ class ChangePasswordDialog {
|
||||
+visible : Ref
|
||||
+render()
|
||||
}
|
||||
class LuxsinController {
|
||||
+deviceIp : Ref
|
||||
+syncDataLoading : Ref
|
||||
+syncPeqLoading : Ref
|
||||
+rawResponse : Ref
|
||||
+decodedData : Ref
|
||||
+decodeError : Ref
|
||||
+handleSyncData()
|
||||
+handleSyncPeq()
|
||||
+doFetch()
|
||||
}
|
||||
LuxLayout --> SidebarLogo : "使用"
|
||||
LuxLayout --> TabsView : "使用"
|
||||
LuxLayout --> ChangePasswordDialog : "使用"
|
||||
TabsView --> LuxsinController : "渲染"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [frontend/src/layout/index.vue:152-233](file://frontend/src/layout/index.vue#L152-L233)
|
||||
- [frontend/src/layout/index.vue:163-246](file://frontend/src/layout/index.vue#L163-L246)
|
||||
- [frontend/src/components/SidebarLogo.vue:52-58](file://frontend/src/components/SidebarLogo.vue#L52-L58)
|
||||
- [frontend/src/components/TabsView.vue:55-63](file://frontend/src/components/TabsView.vue#L55-L63)
|
||||
- [frontend/src/views/toolbox/luxsin-controller/index.vue:73-168](file://frontend/src/views/toolbox/luxsin-controller/index.vue#L73-L168)
|
||||
|
||||
**章节来源**
|
||||
- [frontend/src/layout/index.vue:152-233](file://frontend/src/layout/index.vue#L152-L233)
|
||||
- [frontend/src/layout/index.vue:163-246](file://frontend/src/layout/index.vue#L163-L246)
|
||||
|
||||
## 架构概览
|
||||
|
||||
@@ -183,21 +204,23 @@ participant Router as Vue Router
|
||||
participant Layout as 布局组件
|
||||
participant Tabs as 标签页组件
|
||||
participant View as 页面视图
|
||||
User->>Rail : 点击轨道图标
|
||||
participant Toolbox as 工具箱
|
||||
User->>Rail : 点击工具箱图标
|
||||
Rail->>Layout : handleRailClick()
|
||||
Layout->>Layout : isSidebarCollapsed = false
|
||||
Note over Layout : 自动展开侧边栏
|
||||
User->>Menu : 选择菜单项
|
||||
Menu->>Router : 路由跳转
|
||||
User->>Menu : 选择工具箱菜单
|
||||
Menu->>Router : 路由跳转 /toolbox/luxsin-controller
|
||||
Router->>Layout : 加载布局
|
||||
Layout->>Tabs : 渲染标签页
|
||||
Tabs->>View : 加载页面内容
|
||||
View-->>User : 显示页面
|
||||
Tabs->>Toolbox : 加载工具箱页面
|
||||
Toolbox->>View : 显示设备控制界面
|
||||
View-->>User : 显示工具箱功能
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [frontend/src/layout/index.vue:195-197](file://frontend/src/layout/index.vue#L195-L197)
|
||||
- [frontend/src/router/index.js:76-100](file://frontend/src/router/index.js#L76-L100)
|
||||
- [frontend/src/layout/index.vue:208-210](file://frontend/src/layout/index.vue#L208-L210)
|
||||
- [frontend/src/router/index.js:68-72](file://frontend/src/router/index.js#L68-L72)
|
||||
|
||||
### 数据流架构
|
||||
|
||||
@@ -210,19 +233,24 @@ B --> |否| E[路由变化监听]
|
||||
E --> F[激活菜单项计算]
|
||||
F --> G[面包屑标题计算]
|
||||
G --> H[侧边栏展开状态]
|
||||
I[页面内容] --> J[标签页管理]
|
||||
J --> K[会话存储持久化]
|
||||
K --> L[页面缓存控制]
|
||||
M[用户菜单] --> N[权限检查]
|
||||
N --> O[功能访问控制]
|
||||
O --> P[页面跳转]
|
||||
I[工具箱功能] --> J[设备IP输入]
|
||||
J --> K[数据同步请求]
|
||||
K --> L[Base64解码处理]
|
||||
L --> M[JSON结果展示]
|
||||
N[页面内容] --> O[标签页管理]
|
||||
O --> P[会话存储持久化]
|
||||
P --> Q[页面缓存控制]
|
||||
R[用户菜单] --> S[权限检查]
|
||||
S --> T[功能访问控制]
|
||||
T --> U[页面跳转]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [frontend/src/layout/index.vue:174-212](file://frontend/src/layout/index.vue#L174-L212)
|
||||
- [frontend/src/layout/index.vue:185-199](file://frontend/src/layout/index.vue#L185-L199)
|
||||
- [frontend/src/views/toolbox/luxsin-controller/index.vue:126-168](file://frontend/src/views/toolbox/luxsin-controller/index.vue#L126-L168)
|
||||
|
||||
**章节来源**
|
||||
- [frontend/src/layout/index.vue:174-212](file://frontend/src/layout/index.vue#L174-L212)
|
||||
- [frontend/src/layout/index.vue:185-199](file://frontend/src/layout/index.vue#L185-L199)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
@@ -250,107 +278,150 @@ end
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [frontend/src/layout/index.vue:2-146](file://frontend/src/layout/index.vue#L2-L146)
|
||||
- [frontend/src/layout/index.vue:2-105](file://frontend/src/layout/index.vue#L2-L105)
|
||||
- [frontend/src/styles/lux-theme.css:80-151](file://frontend/src/styles/lux-theme.css#L80-L151)
|
||||
|
||||
#### 智能导航系统实现
|
||||
|
||||
布局组件实现了智能化的三层导航系统:
|
||||
布局组件实现了智能化的四层导航系统:
|
||||
|
||||
1. **轨道导航层**:轻量化的图标导航,点击后自动展开侧边栏
|
||||
2. **主菜单层**:分类化的三级菜单结构,支持展开/收起
|
||||
2. **主菜单层**:分类化的四级菜单结构,支持展开/收起
|
||||
3. **面包屑导航层**:动态生成面包屑路径,提供清晰的页面定位
|
||||
4. **工具箱集成层**:专门的工具箱功能模块,提供设备管理工具
|
||||
|
||||
**更新** 轨道导航采用普通锚元素配合点击处理器,提供了更灵活的导航行为和更好的用户体验。
|
||||
**更新** 轨道导航现在包含四个主要功能入口:耳机管理、升级管理、分享码和工具箱,每个都配有相应的图标和标题。
|
||||
|
||||
**章节来源**
|
||||
- [frontend/src/layout/index.vue:22-91](file://frontend/src/layout/index.vue#L22-L91)
|
||||
- [frontend/src/layout/index.vue:22-102](file://frontend/src/layout/index.vue#L22-L102)
|
||||
|
||||
### 侧边栏组件分析
|
||||
### 工具箱功能模块分析
|
||||
|
||||
#### 创新的双层设计
|
||||
#### 新增的工具箱分类
|
||||
|
||||
侧边栏采用了创新的玻璃拟态双层设计:
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class SidebarGlass {
|
||||
+width : 64px/220px
|
||||
+backdropFilter : blur(20px)
|
||||
+backgroundColor : rgba(15,23,42,0.60)
|
||||
+borderRight : 1px solid rgba(255,255,255,0.08)
|
||||
+transition : width 0.30s ease
|
||||
+boxShadow : 多层阴影效果
|
||||
}
|
||||
class SidebarRail {
|
||||
+position : absolute
|
||||
+visibility : hidden/visible
|
||||
+opacity : 0/1
|
||||
+pointerEvents : none/auto
|
||||
+railNavItems : Array
|
||||
}
|
||||
class SidebarLogo {
|
||||
+collapsed : Boolean
|
||||
+animation : slide/fade
|
||||
+responsive : true
|
||||
+gradientText : 渐变色文字
|
||||
}
|
||||
class SidebarNavWrap {
|
||||
+position : relative
|
||||
+overflow : hidden
|
||||
+flex : 1
|
||||
}
|
||||
class LuxMenu {
|
||||
+expanded : true/false
|
||||
+activeItem : highlight
|
||||
+hoverEffect : gradient
|
||||
+elSubMenus : Array
|
||||
}
|
||||
SidebarGlass --> SidebarLogo
|
||||
SidebarGlass --> SidebarNavWrap
|
||||
SidebarNavWrap --> SidebarRail
|
||||
SidebarNavWrap --> LuxMenu
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [frontend/src/layout/index.vue:10-93](file://frontend/src/layout/index.vue#L10-L93)
|
||||
- [frontend/src/styles/lux-theme.css:156-252](file://frontend/src/styles/lux-theme.css#L156-L252)
|
||||
|
||||
#### 智能交互逻辑
|
||||
|
||||
侧边栏的交互逻辑通过Vue的响应式系统实现,新增了智能展开功能:
|
||||
工具箱功能模块作为第四大功能分类,提供了设备管理和数据同步能力:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[鼠标悬停] --> B{isSidebarCollapsed}
|
||||
B --> |true| C[设置为false]
|
||||
B --> |false| D[保持状态]
|
||||
E[鼠标离开] --> F{isSidebarCollapsed}
|
||||
F --> |false| G[设置为true]
|
||||
F --> |true| H[保持状态]
|
||||
I[轨道导航点击] --> J[handleRailClick()]
|
||||
J --> K[强制展开侧边栏]
|
||||
K --> L[设置isSidebarCollapsed = false]
|
||||
M[菜单点击] --> N[更新activeMenu]
|
||||
N --> O[同步面包屑]
|
||||
O --> P[更新openedMenus]
|
||||
A[工具箱分类] --> B[luxsin-controller]
|
||||
B --> C[设备IP输入]
|
||||
B --> D[数据同步按钮]
|
||||
B --> E[PEQ同步按钮]
|
||||
C --> F[设备连接]
|
||||
D --> G[获取设备信息]
|
||||
E --> H[同步PEQ配置]
|
||||
G --> I[Base64解码]
|
||||
H --> I
|
||||
I --> J[JSON格式化显示]
|
||||
J --> K[原始响应查看]
|
||||
J --> L[解码结果展示]
|
||||
J --> M[错误信息提示]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [frontend/src/layout/index.vue:13-14](file://frontend/src/layout/index.vue#L13-L14)
|
||||
- [frontend/src/layout/index.vue:195-197](file://frontend/src/layout/index.vue#L195-L197)
|
||||
- [frontend/src/layout/index.vue:181-187](file://frontend/src/layout/index.vue#L181-L187)
|
||||
- [frontend/src/layout/index.vue:92-101](file://frontend/src/layout/index.vue#L92-L101)
|
||||
- [frontend/src/views/toolbox/luxsin-controller/index.vue:1-70](file://frontend/src/views/toolbox/luxsin-controller/index.vue#L1-L70)
|
||||
|
||||
**更新** 新增了`handleRailClick()`函数,当用户点击轨道导航图标时,会自动展开侧边栏,提供更好的用户体验。
|
||||
#### 工具箱页面功能特性
|
||||
|
||||
luxsin-controller页面实现了完整的设备数据同步功能:
|
||||
|
||||
1. **设备连接管理**:支持输入设备IP地址进行连接
|
||||
2. **数据同步操作**:提供基础数据同步和PEQ配置同步
|
||||
3. **响应数据处理**:自定义Base64解码算法处理设备返回数据
|
||||
4. **结果可视化**:同时显示原始响应和解码后的JSON格式
|
||||
5. **错误处理机制**:完善的错误提示和异常处理
|
||||
|
||||
**更新** 工具箱模块引入了全新的Tools和Operation图标,为设备管理功能提供了直观的视觉标识。
|
||||
|
||||
**章节来源**
|
||||
- [frontend/src/layout/index.vue:10-93](file://frontend/src/layout/index.vue#L10-L93)
|
||||
- [frontend/src/views/toolbox/luxsin-controller/index.vue:73-168](file://frontend/src/views/toolbox/luxsin-controller/index.vue#L73-L168)
|
||||
|
||||
### 图标系统集成
|
||||
|
||||
#### 新增图标支持
|
||||
|
||||
布局组件现在支持完整的图标系统,包括新增的工具箱相关图标:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "图标导入"
|
||||
A["@element-plus/icons-vue"] --> B[Headset]
|
||||
A --> C[Collection]
|
||||
A --> D[List]
|
||||
A --> E[Upload]
|
||||
A --> F[Document]
|
||||
A --> G[Share]
|
||||
A --> H[User]
|
||||
A --> I[Warning]
|
||||
A --> J[Aim]
|
||||
A --> K[Tools]
|
||||
A --> L[Operation]
|
||||
end
|
||||
subgraph "图标应用"
|
||||
K --> M[工具箱分类图标]
|
||||
L --> N[luxsin-controller菜单图标]
|
||||
M --> O[轨道导航图标]
|
||||
N --> P[菜单项图标]
|
||||
end
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [frontend/src/layout/index.vue:167](file://frontend/src/layout/index.vue#L167)
|
||||
- [frontend/src/layout/index.vue:94-98](file://frontend/src/layout/index.vue#L94-L98)
|
||||
|
||||
#### 图标使用规范
|
||||
|
||||
所有图标都遵循统一的命名和使用规范:
|
||||
- 分类图标使用较大的尺寸(默认大小)
|
||||
- 菜单项图标使用较小的尺寸
|
||||
- 轨道导航图标统一为18px
|
||||
- 图标颜色跟随主题变量自动适配
|
||||
|
||||
**章节来源**
|
||||
- [frontend/src/layout/index.vue:167](file://frontend/src/layout/index.vue#L167)
|
||||
|
||||
### 路由配置更新
|
||||
|
||||
#### 工具箱路由定义
|
||||
|
||||
路由系统已更新以支持新的工具箱功能:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[根路由 /] --> B[Layout组件]
|
||||
B --> C[Home 首页]
|
||||
B --> D[Brand 品牌管理]
|
||||
B --> E[Model 型号管理]
|
||||
B --> F[Ota OTA管理]
|
||||
B --> G[Blacklist 黑名单]
|
||||
B --> H[OtaTargetDevice 定向升级]
|
||||
B --> I[ShareCodeLog 分享日志]
|
||||
B --> J[SystemUsers 账号管理]
|
||||
B --> K[LuxsinController 工具箱控制器]
|
||||
K --> L[/toolbox/luxsin-controller]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [frontend/src/router/index.js:68-72](file://frontend/src/router/index.js#L68-L72)
|
||||
|
||||
#### 路由元数据配置
|
||||
|
||||
工具箱路由包含了完整的元数据配置:
|
||||
- **路径**:`/toolbox/luxsin-controller`
|
||||
- **名称**:`LuxsinController`
|
||||
- **标题**:`luxsin-controller`
|
||||
- **图标**:`tools`
|
||||
- **懒加载**:支持组件按需加载
|
||||
|
||||
**章节来源**
|
||||
- [frontend/src/router/index.js:68-72](file://frontend/src/router/index.js#L68-L72)
|
||||
|
||||
### 导航分类重构
|
||||
|
||||
#### 三大功能模块
|
||||
#### 四大功能模块
|
||||
|
||||
导航系统重构为三个主要功能模块:
|
||||
导航系统现已重构为四个主要功能模块:
|
||||
|
||||
1. **耳机管理模块** (`index="1"`)
|
||||
- 品牌管理 (`/brand`)
|
||||
@@ -364,6 +435,9 @@ O --> P[更新openedMenus]
|
||||
3. **分享码模块** (`index="share-code"`)
|
||||
- 分享日志 (`/share-code/log`)
|
||||
|
||||
4. **工具箱模块** (`index="toolbox"`)
|
||||
- luxsin-controller (`/toolbox/luxsin-controller`)
|
||||
|
||||
#### 智能菜单展开逻辑
|
||||
|
||||
```mermaid
|
||||
@@ -372,18 +446,20 @@ A[路由路径] --> B{路径匹配}
|
||||
B --> |/brand 或 /model| C[展开耳机管理]
|
||||
B --> |/ota 或 /blacklist 或 /ota-target-device| D[展开升级管理]
|
||||
B --> |/share-code/*| E[展开分享码]
|
||||
B --> |其他路径| F[不展开任何菜单]
|
||||
C --> G[openedMenus = ['1']]
|
||||
D --> H[openedMenus = ['upgrade']]
|
||||
E --> I[openedMenus = ['share-code']]
|
||||
F --> J[openedMenus = []]
|
||||
B --> |/toolbox/*| F[展开工具箱]
|
||||
B --> |其他路径| G[不展开任何菜单]
|
||||
C --> H[openedMenus = ['1']]
|
||||
D --> I[openedMenus = ['upgrade']]
|
||||
E --> J[openedMenus = ['share-code']]
|
||||
F --> K[openedMenus = ['toolbox']]
|
||||
G --> L[openedMenus = []]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [frontend/src/layout/index.vue:174-179](file://frontend/src/layout/index.vue#L174-L179)
|
||||
- [frontend/src/layout/index.vue:185-191](file://frontend/src/layout/index.vue#L185-L191)
|
||||
|
||||
**章节来源**
|
||||
- [frontend/src/layout/index.vue:49-90](file://frontend/src/layout/index.vue#L49-L90)
|
||||
- [frontend/src/layout/index.vue:50-101](file://frontend/src/layout/index.vue#L50-L101)
|
||||
|
||||
### 标签页组件分析
|
||||
|
||||
@@ -397,14 +473,15 @@ participant Route as 路由
|
||||
participant Tabs as 标签页组件
|
||||
participant Storage as 会话存储
|
||||
participant KeepAlive as 缓存管理
|
||||
participant Toolbox as 工具箱页面
|
||||
Route->>Tabs : 路由变化
|
||||
Tabs->>Tabs : upsertTab()
|
||||
Tabs->>Tabs : 更新activeKey
|
||||
Tabs->>Storage : persist()
|
||||
Note over Tabs,Storage : 持久化标签页状态
|
||||
Tabs->>KeepAlive : include更新
|
||||
KeepAlive->>Route : 渲染新页面
|
||||
Route-->>Tabs : 页面加载完成
|
||||
KeepAlive->>Toolbox : 加载工具箱页面
|
||||
Toolbox-->>Tabs : 页面加载完成
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
@@ -459,7 +536,7 @@ O --> P[沉浸式体验]
|
||||
|
||||
**图表来源**
|
||||
- [frontend/src/styles/lux-theme.css:11-78](file://frontend/src/styles/lux-theme.css#L11-L78)
|
||||
- [frontend/src/styles/lux-theme.css:98-129](file://frontend/src/styles/lux-theme.css#L98-L129)
|
||||
- [frontend/src/styles/lux-theme.css:98-129](file://frontend/src/styles/lux-theme.css#L98-129)
|
||||
|
||||
#### 样式覆盖策略
|
||||
|
||||
@@ -496,24 +573,26 @@ A --> C[TabsView]
|
||||
A --> D[ChangePasswordDialog]
|
||||
E[Router] --> F[Layout]
|
||||
F --> G[Views]
|
||||
H[ElementPlus] --> I[UI组件库]
|
||||
I --> J[Layout组件]
|
||||
I --> K[Menu组件]
|
||||
I --> L[Dropdown组件]
|
||||
M[Vue Router] --> N[路由导航]
|
||||
N --> O[权限控制]
|
||||
P[Auth Utils] --> Q[用户认证]
|
||||
Q --> R[权限验证]
|
||||
S[Icons] --> T[Headset, Upload, Share等图标]
|
||||
T --> U[轨道导航图标]
|
||||
T --> V[菜单项图标]
|
||||
W[Theme System] --> X[CSS Variables]
|
||||
X --> Y[Glass Effects]
|
||||
Y --> Z[Visual Consistency]
|
||||
G --> H[LuxsinController]
|
||||
I[ElementPlus] --> J[UI组件库]
|
||||
J --> K[Layout组件]
|
||||
J --> L[Menu组件]
|
||||
J --> M[Dropdown组件]
|
||||
N[Vue Router] --> O[路由导航]
|
||||
O --> P[权限控制]
|
||||
Q[Auth Utils] --> R[用户认证]
|
||||
R --> S[权限验证]
|
||||
T[Icons] --> U[Headset, Upload, Share等图标]
|
||||
T --> V[Tools, Operation新图标]
|
||||
U --> W[轨道导航图标]
|
||||
V --> X[工具箱图标]
|
||||
Y[Theme System] --> Z[CSS Variables]
|
||||
Z --> AA[Glass Effects]
|
||||
AA --> AB[Visual Consistency]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [frontend/src/layout/index.vue:156-160](file://frontend/src/layout/index.vue#L156-L160)
|
||||
- [frontend/src/layout/index.vue:163-171](file://frontend/src/layout/index.vue#L163-L171)
|
||||
- [frontend/src/router/index.js:1-5](file://frontend/src/router/index.js#L1-L5)
|
||||
|
||||
### 外部依赖分析
|
||||
@@ -527,10 +606,10 @@ Y --> Z[Visual Consistency]
|
||||
| 路由管理 | vue-router | 最新版 | 页面导航 |
|
||||
| 图标系统 | @element-plus/icons-vue | 最新版 | 图标组件 |
|
||||
|
||||
**更新** 新增了多个图标组件的使用,包括Headset、Upload、Share等用于新的导航系统。
|
||||
**更新** 新增了Tools和Operation图标的使用,用于工具箱功能的视觉标识。
|
||||
|
||||
**章节来源**
|
||||
- [frontend/src/layout/index.vue:156-160](file://frontend/src/layout/index.vue#L156-L160)
|
||||
- [frontend/src/layout/index.vue:167](file://frontend/src/layout/index.vue#L167)
|
||||
- [frontend/src/router/index.js:1-5](file://frontend/src/router/index.js#L1-L5)
|
||||
|
||||
## 性能考虑
|
||||
@@ -540,11 +619,12 @@ Y --> Z[Visual Consistency]
|
||||
布局组件在性能方面采用了多项优化策略:
|
||||
|
||||
1. **条件渲染**:侧边栏导航条和菜单根据状态动态显示
|
||||
2. **懒加载**:路由级别的组件懒加载
|
||||
2. **懒加载**:路由级别的组件懒加载,包括工具箱页面
|
||||
3. **缓存机制**:标签页内容的KeepAlive缓存
|
||||
4. **事件节流**:侧边栏交互事件的处理
|
||||
5. **计算属性优化**:使用computed缓存导航状态计算结果
|
||||
6. **GPU加速**:CSS变换和透明度动画利用硬件加速
|
||||
7. **图标优化**:图标组件按需加载,减少初始包体积
|
||||
|
||||
### 内存管理
|
||||
|
||||
@@ -562,6 +642,8 @@ L[导航状态变化] --> M[响应式更新]
|
||||
M --> N[最小化重渲染]
|
||||
O[背景光球] --> P[静态CSS动画]
|
||||
P --> Q[无JavaScript开销]
|
||||
R[工具箱页面] --> S[独立组件加载]
|
||||
S --> T[按需资源加载]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
@@ -571,6 +653,20 @@ P --> Q[无JavaScript开销]
|
||||
|
||||
### 常见问题及解决方案
|
||||
|
||||
#### 工具箱功能问题
|
||||
|
||||
**问题**:工具箱菜单无法点击
|
||||
**原因**:路由配置错误或组件导入失败
|
||||
**解决**:检查`/toolbox/luxsin-controller`路由配置和组件路径
|
||||
|
||||
**问题**:设备连接失败
|
||||
**原因**:设备IP地址格式错误或网络不可达
|
||||
**解决**:验证IP地址格式,检查网络连接和设备服务状态
|
||||
|
||||
**问题**:数据解码错误
|
||||
**原因**:Base64编码格式不匹配
|
||||
**解决**:检查设备返回的数据格式,确认自定义Base64编码表
|
||||
|
||||
#### 导航系统问题
|
||||
|
||||
**问题**:轨道导航点击无反应
|
||||
@@ -581,9 +677,9 @@ P --> Q[无JavaScript开销]
|
||||
**原因**:`isSidebarCollapsed`状态异常
|
||||
**解决**:检查watch监听器和状态更新逻辑
|
||||
|
||||
**问题**:菜单分类不正确
|
||||
**问题**:工具箱分类不展开
|
||||
**原因**:`resolveOpenedMenus`函数路径匹配错误
|
||||
**解决**:验证路由路径前缀匹配逻辑
|
||||
**解决**:验证`/toolbox`路径前缀匹配逻辑
|
||||
|
||||
#### 布局显示异常
|
||||
|
||||
@@ -599,6 +695,20 @@ P --> Q[无JavaScript开销]
|
||||
**原因**:浏览器不支持backdrop-filter
|
||||
**解决**:添加polyfill或降级方案
|
||||
|
||||
#### 图标显示问题
|
||||
|
||||
**问题**:工具箱图标不显示
|
||||
**原因**:Tools或Operation图标导入失败
|
||||
**解决**:检查`@element-plus/icons-vue`包安装和图标名称拼写
|
||||
|
||||
**问题**:图标颜色异常
|
||||
**原因**:主题变量冲突
|
||||
**解决**:检查CSS变量定义和继承关系
|
||||
|
||||
**问题**:图标尺寸不正确
|
||||
**原因**:样式覆盖导致
|
||||
**解决**:检查scoped样式和全局样式优先级
|
||||
|
||||
#### 性能问题
|
||||
|
||||
**问题**:页面切换卡顿
|
||||
@@ -614,9 +724,9 @@ P --> Q[无JavaScript开销]
|
||||
**解决**:减少动画帧率或使用CSS动画替代JS动画
|
||||
|
||||
**章节来源**
|
||||
- [frontend/src/layout/index.vue:195-197](file://frontend/src/layout/index.vue#L195-L197)
|
||||
- [frontend/src/layout/index.vue:174-187](file://frontend/src/layout/index.vue#L174-L187)
|
||||
- [frontend/src/components/TabsView.vue:276-286](file://frontend/src/components/TabsView.vue#L276-L286)
|
||||
- [frontend/src/layout/index.vue:208-210](file://frontend/src/layout/index.vue#L208-L210)
|
||||
- [frontend/src/layout/index.vue:185-191](file://frontend/src/layout/index.vue#L185-L191)
|
||||
- [frontend/src/views/toolbox/luxsin-controller/index.vue:126-168](file://frontend/src/views/toolbox/luxsin-controller/index.vue#L126-L168)
|
||||
|
||||
## 结论
|
||||
|
||||
@@ -629,14 +739,18 @@ P --> Q[无JavaScript开销]
|
||||
5. **可维护性**:清晰的组件分离和模块化设计
|
||||
6. **可扩展性**:灵活的主题系统和配置选项
|
||||
7. **性能优化**:合理的渲染策略和资源管理
|
||||
8. **工具箱集成**:完整的设备管理工具模块,支持数据同步操作
|
||||
|
||||
**最新更新亮点**:
|
||||
- **玻璃拟态设计系统**:全面的backdrop-filter效果和半透明背景
|
||||
- **动态背景光球**:三个渐变光球的动画效果营造沉浸感
|
||||
- **悬浮式侧边栏**:独立的玻璃面板设计,支持智能展开/收起
|
||||
- **简化的导航结构**:从六个独立菜单项重构为三个主要分类,提升了导航效率
|
||||
- **简化的导航结构**:从六个独立菜单项重构为四个主要分类,提升了导航效率
|
||||
- **创新的轨道导航**:轻量化的图标导航条,提供快速访问入口
|
||||
- **智能的用户体验**:点击轨道图标自动展开侧边栏,减少操作步骤
|
||||
- **灵活的导航实现**:采用普通锚元素配合点击处理器,提供更灵活的导航行为
|
||||
- **工具箱功能模块**:新增完整的工具箱分类,集成设备数据同步功能
|
||||
- **图标系统增强**:支持Tools和Operation等新图标,提升视觉识别度
|
||||
- **路由配置完善**:新增工具箱路由,支持懒加载和权限控制
|
||||
|
||||
该布局组件为整个Dashboard系统提供了坚实的基础,支持未来功能的扩展和定制化需求。通过合理的架构设计和实现细节,确保了系统的稳定性和可维护性。新的玻璃拟态设计不仅提升了用户体验,也为后续的功能扩展提供了良好的架构基础。
|
||||
该布局组件为整个Dashboard系统提供了坚实的基础,支持未来功能的扩展和定制化需求。通过合理的架构设计和实现细节,确保了系统的稳定性和可维护性。新的玻璃拟态设计不仅提升了用户体验,也为后续的功能扩展提供了良好的架构基础。工具箱模块的加入进一步丰富了系统功能,为设备管理和运维工作提供了强大的工具支持。
|
||||
@@ -16,14 +16,14 @@
|
||||
- [backend/src/utils/response.js](file://backend/src/utils/response.js)
|
||||
- [backend/src/models/Model.js](file://backend/src/models/Model.js)
|
||||
- [backend/src/models/Ota.js](file://backend/src/models/Ota.js)
|
||||
- [frontend/src/views/toolbox/luxsin-controller/index.vue](file://frontend/src/views/toolbox/luxsin-controller/index.vue)
|
||||
</cite>
|
||||
|
||||
## 更新摘要
|
||||
**变更内容**
|
||||
- 新增玻璃拟态视觉语言和设计令牌系统说明
|
||||
- 更新首页组件的视觉样式实现细节
|
||||
- 补充设计令牌在首页中的应用方式
|
||||
- 增强响应式布局和用户体验优化章节
|
||||
- 新增 Luxsin 控制器快捷入口链接,提供局域网设备数据同步的快速访问功能
|
||||
- 更新快捷入口配置数组,增加工具箱功能模块
|
||||
- 完善路由配置,支持新的工具页面导航
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
@@ -40,7 +40,7 @@
|
||||
## 简介
|
||||
本文件面向"首页仪表板"页面,系统性阐述其功能布局、数据展示机制、数据获取流程、响应式布局与样式定制、快捷入口配置与路由跳转、生命周期与错误处理、以及性能优化最佳实践。目标读者既包括前端开发者,也包括需要理解整体工作流的产品与运营人员。
|
||||
|
||||
**最新更新**:首页已全面升级至玻璃拟态视觉语言,采用统一的设计令牌系统和深色模式OLED优化,提供更现代的用户体验。
|
||||
**最新更新**:首页已全面升级至玻璃拟态视觉语言,采用统一的设计令牌系统和深色模式OLED优化,提供更现代的用户体验。同时新增了 Luxsin 控制器快捷入口,为局域网设备数据同步提供了快速访问通道。
|
||||
|
||||
## 项目结构
|
||||
首页位于前端单页应用中,采用 Vue 3 + Element Plus 组合,后端基于 Express + Sequelize 提供接口。首页通过 API 获取"今日新增"数据,并在页面上以卡片网格展示;同时提供快捷入口卡片,点击后通过路由跳转到相应功能模块。
|
||||
@@ -58,34 +58,38 @@ G["router/index.js<br/>路由与鉴权守卫"]
|
||||
H["utils/auth.js<br/>鉴权工具"]
|
||||
I["utils/tabs.js<br/>标签页常量"]
|
||||
J["styles/lux-theme.css<br/>设计令牌与玻璃拟态样式"]
|
||||
K["toolbox/luxsin-controller/index.vue<br/>设备数据同步工具"]
|
||||
end
|
||||
subgraph "后端"
|
||||
K["routes/dashboard.js<br/>GET /api/dashboard/today"]
|
||||
L["utils/response.js<br/>统一响应结构"]
|
||||
M["models/Model.js<br/>型号模型"]
|
||||
N["models/Ota.js<br/>OTA模型"]
|
||||
L["routes/dashboard.js<br/>GET /api/dashboard/today"]
|
||||
M["utils/response.js<br/>统一响应结构"]
|
||||
N["models/Model.js<br/>型号模型"]
|
||||
O["models/Ota.js<br/>OTA模型"]
|
||||
P["局域网设备<br/>dev/info.cgi"]
|
||||
end
|
||||
A --> B
|
||||
B --> C
|
||||
C --> D
|
||||
D --> E
|
||||
D --> J
|
||||
D --> K
|
||||
E --> F
|
||||
F --> K
|
||||
F --> L
|
||||
G --> H
|
||||
K --> L
|
||||
K --> M
|
||||
K --> N
|
||||
L --> M
|
||||
L --> N
|
||||
L --> O
|
||||
K --> P
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [frontend/src/App.vue:1-30](file://frontend/src/App.vue#L1-L30)
|
||||
- [frontend/src/layout/index.vue:1-338](file://frontend/src/layout/index.vue#L1-L338)
|
||||
- [frontend/src/components/TabsView.vue:1-351](file://frontend/src/components/TabsView.vue#L1-L351)
|
||||
- [frontend/src/views/home/index.vue:1-334](file://frontend/src/views/home/index.vue#L1-L334)
|
||||
- [frontend/src/views/home/index.vue:1-335](file://frontend/src/views/home/index.vue#L1-L335)
|
||||
- [frontend/src/api/dashboard.js:1-12](file://frontend/src/api/dashboard.js#L1-L12)
|
||||
- [frontend/src/utils/request.js:1-72](file://frontend/src/utils/request.js#L1-L72)
|
||||
- [frontend/src/router/index.js:1-91](file://frontend/src/router/index.js#L1-L91)
|
||||
- [frontend/src/router/index.js:1-109](file://frontend/src/router/index.js#L1-L109)
|
||||
- [frontend/src/utils/auth.js:1-99](file://frontend/src/utils/auth.js#L1-L99)
|
||||
- [frontend/src/utils/tabs.js:1-9](file://frontend/src/utils/tabs.js#L1-L9)
|
||||
- [frontend/src/styles/lux-theme.css:1-1259](file://frontend/src/styles/lux-theme.css#L1-L1259)
|
||||
@@ -93,10 +97,11 @@ K --> N
|
||||
- [backend/src/utils/response.js:1-25](file://backend/src/utils/response.js#L1-L25)
|
||||
- [backend/src/models/Model.js:1-53](file://backend/src/models/Model.js#L1-L53)
|
||||
- [backend/src/models/Ota.js:1-97](file://backend/src/models/Ota.js#L1-L97)
|
||||
- [frontend/src/views/toolbox/luxsin-controller/index.vue:1-231](file://frontend/src/views/toolbox/luxsin-controller/index.vue#L1-L231)
|
||||
|
||||
**章节来源**
|
||||
- [frontend/src/views/home/index.vue:1-334](file://frontend/src/views/home/index.vue#L1-L334)
|
||||
- [frontend/src/router/index.js:1-91](file://frontend/src/router/index.js#L1-L91)
|
||||
- [frontend/src/views/home/index.vue:1-335](file://frontend/src/views/home/index.vue#L1-L335)
|
||||
- [frontend/src/router/index.js:1-109](file://frontend/src/router/index.js#L1-L109)
|
||||
- [backend/src/routes/dashboard.js:1-66](file://backend/src/routes/dashboard.js#L1-L66)
|
||||
|
||||
## 核心组件
|
||||
@@ -107,6 +112,7 @@ K --> N
|
||||
- 布局与标签页:侧边栏导航、面包屑、用户下拉菜单、标签页持久化与缓存策略。
|
||||
- 设计令牌系统:统一的玻璃拟态视觉语言,包含颜色、阴影、模糊等设计变量。
|
||||
- 后端路由与模型:按日期范围查询型号与 OTA 新增记录,统一响应结构。
|
||||
- **新增**:Luxsin 控制器工具页面:提供局域网设备数据同步和 PEQ 参数管理功能。
|
||||
|
||||
**章节来源**
|
||||
- [frontend/src/views/home/index.vue:97-149](file://frontend/src/views/home/index.vue#L97-L149)
|
||||
@@ -117,6 +123,7 @@ K --> N
|
||||
- [frontend/src/components/TabsView.vue:55-287](file://frontend/src/components/TabsView.vue#L55-L287)
|
||||
- [frontend/src/styles/lux-theme.css:11-78](file://frontend/src/styles/lux-theme.css#L11-L78)
|
||||
- [backend/src/routes/dashboard.js:19-63](file://backend/src/routes/dashboard.js#L19-L63)
|
||||
- [frontend/src/views/toolbox/luxsin-controller/index.vue:73-168](file://frontend/src/views/toolbox/luxsin-controller/index.vue#L73-L168)
|
||||
|
||||
## 架构总览
|
||||
首页数据流自上而下:浏览器发起请求 -> 前端 Axios 拦截器 -> 后端路由 -> 数据库查询 -> 统一响应 -> 前端解析并渲染。
|
||||
@@ -154,7 +161,7 @@ V-->>U : 渲染今日新增卡片
|
||||
### 首页仪表板组件(Home)
|
||||
- 功能布局
|
||||
- 欢迎信息:根据本地存储的用户信息动态显示用户名。
|
||||
- 快捷入口卡片:支持点击跳转至品牌、型号、OTA、分享日志等模块。
|
||||
- 快捷入口卡片:支持点击跳转至品牌、型号、OTA、分享日志、**Luxsin 控制器**等模块。
|
||||
- 今日新增统计:分两列网格展示"新增型号"和"新增 OTA",包含加载态、空态与列表项。
|
||||
- 数据绑定与状态
|
||||
- 使用响应式引用保存加载状态、今日新增列表。
|
||||
@@ -176,10 +183,10 @@ V-->>U : 渲染今日新增卡片
|
||||
- 列表滚动容器设置最大高度并开启纵向滚动,避免长列表撑开页面。
|
||||
- 列表项 hover 仅做背景色过渡,减少复杂动画。
|
||||
|
||||
**更新** 首页组件现已完全集成到玻璃拟态设计系统中,所有卡片和界面元素都采用统一的视觉语言。
|
||||
**更新** 首页组件现已完全集成到玻璃拟态设计系统中,所有卡片和界面元素都采用统一的视觉语言。**新增 Luxsin 控制器快捷入口**,为用户提供局域网设备数据同步的快速访问功能。
|
||||
|
||||
**章节来源**
|
||||
- [frontend/src/views/home/index.vue:1-334](file://frontend/src/views/home/index.vue#L1-L334)
|
||||
- [frontend/src/views/home/index.vue:1-335](file://frontend/src/views/home/index.vue#L1-L335)
|
||||
|
||||
### 设计令牌系统与玻璃拟态视觉语言
|
||||
- 设计哲学
|
||||
@@ -237,12 +244,13 @@ V-->>U : 渲染今日新增卡片
|
||||
|
||||
**章节来源**
|
||||
- [frontend/src/utils/request.js:1-72](file://frontend/src/utils/request.js#L1-L72)
|
||||
- [frontend/src/utils/auth.js:1-99](file://frontend/src/utils/auth.js#L1-99)
|
||||
- [frontend/src/utils/auth.js:1-99](file://frontend/src/utils/auth.js#L1-L99)
|
||||
|
||||
### 路由与导航
|
||||
- 路由配置
|
||||
- 首页路径为 /home,作为 / 的子路由。
|
||||
- 所有子路由均需登录,部分路由需超级管理员权限。
|
||||
- **新增**:/toolbox/luxsin-controller 路由,指向 Luxsin 控制器工具页面。
|
||||
- 导航与面包屑
|
||||
- 侧边栏提供主要功能入口,支持折叠与高亮。
|
||||
- 标签页组件负责多页面切换与持久化。
|
||||
@@ -250,7 +258,7 @@ V-->>U : 渲染今日新增卡片
|
||||
- 支持修改密码、账号管理(超级管理员)、退出登录。
|
||||
|
||||
**章节来源**
|
||||
- [frontend/src/router/index.js:1-91](file://frontend/src/router/index.js#L1-91)
|
||||
- [frontend/src/router/index.js:1-109](file://frontend/src/router/index.js#L1-L109)
|
||||
- [frontend/src/layout/index.vue:144-222](file://frontend/src/layout/index.vue#L144-L222)
|
||||
- [frontend/src/components/TabsView.vue:55-287](file://frontend/src/components/TabsView.vue#L55-L287)
|
||||
|
||||
@@ -271,15 +279,18 @@ V-->>U : 渲染今日新增卡片
|
||||
|
||||
### 快捷入口配置与路由跳转
|
||||
- 配置方式
|
||||
- quickLinks 数组定义了四个入口项,每项包含 path、title、desc、icon。
|
||||
- quickLinks 数组定义了五个入口项,每项包含 path、title、desc、icon。
|
||||
- **新增**:Luxsin 控制器入口,提供局域网设备数据同步功能。
|
||||
- 图标通过动态组件渲染,支持任意 Element Plus 图标。
|
||||
- 跳转机制
|
||||
- 点击卡片触发 go(path) 函数,内部使用 vue-router 的 push 实现导航。
|
||||
- 与侧边栏导航保持一致的路径约定,便于统一维护。
|
||||
|
||||
**更新** 快捷入口现已包含 Luxsin 控制器功能,用户可以通过首页直接访问设备数据同步工具。
|
||||
|
||||
**章节来源**
|
||||
- [frontend/src/views/home/index.vue:113-144](file://frontend/src/views/home/index.vue#L113-L144)
|
||||
- [frontend/src/router/index.js:26-54](file://frontend/src/router/index.js#L26-L54)
|
||||
- [frontend/src/views/home/index.vue:113-119](file://frontend/src/views/home/index.vue#L113-L119)
|
||||
- [frontend/src/router/index.js:67-72](file://frontend/src/router/index.js#L67-L72)
|
||||
|
||||
### 生命周期管理与错误处理
|
||||
- 生命周期
|
||||
@@ -314,13 +325,38 @@ V-->>U : 渲染今日新增卡片
|
||||
- [frontend/src/components/TabsView.vue:47-50](file://frontend/src/components/TabsView.vue#L47-L50)
|
||||
- [frontend/src/utils/request.js:6-9](file://frontend/src/utils/request.js#L6-L9)
|
||||
- [frontend/src/views/home/index.vue:250-284](file://frontend/src/views/home/index.vue#L250-L284)
|
||||
- [frontend/src/styles/lux-theme.css:356-370](file://frontend/src/styles/lux-theme.css#L356-L370)
|
||||
- [frontend/src/styles/lux-theme.css:356-370](file://frontend/src/styles/lux-theme.css#L356-370)
|
||||
|
||||
### Luxsin 控制器工具页面
|
||||
- 功能特性
|
||||
- 设备 IP 输入验证与表单提交。
|
||||
- 支持同步设备和同步 PEQ 两种操作模式。
|
||||
- 自定义 Base64 解码器,处理设备返回的特殊编码数据。
|
||||
- 原始响应与解码结果的可视化展示。
|
||||
- 数据处理流程
|
||||
- 通过 fetch API 直接访问局域网设备的 dev/info.cgi 接口。
|
||||
- 实现自定义 Base64 字符映射表,将特殊编码转换为标准 Base64。
|
||||
- 使用 TextDecoder 进行 UTF-8 解码,支持中文等多字节字符。
|
||||
- 错误处理机制
|
||||
- HTTP 状态码检查与错误提示。
|
||||
- Base64 解码失败时的详细错误信息展示。
|
||||
- 空数据响应的友好提示。
|
||||
- 用户界面设计
|
||||
- 响应式表单布局,支持回车键提交。
|
||||
- 可折叠的原始响应查看器,节省屏幕空间。
|
||||
- 语法高亮的 JSON 输出显示。
|
||||
|
||||
**新增** Luxsin 控制器工具页面为局域网设备管理提供了强大的数据同步能力,支持实时设备信息查询和 PEQ 参数管理。
|
||||
|
||||
**章节来源**
|
||||
- [frontend/src/views/toolbox/luxsin-controller/index.vue:1-231](file://frontend/src/views/toolbox/luxsin-controller/index.vue#L1-L231)
|
||||
|
||||
## 依赖关系分析
|
||||
- 组件耦合
|
||||
- Home 依赖 api/dashboard.js 与 utils/request.js,形成清晰的职责分离。
|
||||
- 与路由层通过 go(path) 解耦,便于测试与替换。
|
||||
- 与样式层通过设计令牌解耦,便于主题切换。
|
||||
- **新增**:Home 组件通过路由配置间接依赖 Luxsin 控制器工具页面。
|
||||
- 外部依赖
|
||||
- Element Plus 提供 UI 组件与图标。
|
||||
- Vue Router 提供导航能力。
|
||||
@@ -361,10 +397,20 @@ class LayoutIndexVue {
|
||||
+activeMenu
|
||||
+handleUserMenuCommand()
|
||||
}
|
||||
class LuxsinController {
|
||||
+deviceIp : Ref<string>
|
||||
+syncDataLoading : Ref<boolean>
|
||||
+syncPeqLoading : Ref<boolean>
|
||||
+decodeCustomBase64(input)
|
||||
+handleSyncData()
|
||||
+handleSyncPeq()
|
||||
}
|
||||
HomeIndexVue --> DashboardApi : "调用"
|
||||
DashboardApi --> RequestUtil : "封装请求"
|
||||
HomeIndexVue --> DesignTokens : "使用"
|
||||
HomeIndexVue --> RouterGuard : "依赖"
|
||||
LayoutIndexVue --> RouterGuard : "依赖"
|
||||
HomeIndexVue --> LuxsinController : "路由跳转"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
@@ -374,6 +420,7 @@ LayoutIndexVue --> RouterGuard : "依赖"
|
||||
- [frontend/src/styles/lux-theme.css:11-78](file://frontend/src/styles/lux-theme.css#L11-L78)
|
||||
- [frontend/src/router/index.js:64-88](file://frontend/src/router/index.js#L64-L88)
|
||||
- [frontend/src/layout/index.vue:144-222](file://frontend/src/layout/index.vue#L144-L222)
|
||||
- [frontend/src/views/toolbox/luxsin-controller/index.vue:73-168](file://frontend/src/views/toolbox/luxsin-controller/index.vue#L73-L168)
|
||||
|
||||
## 性能考量
|
||||
- 渲染层面
|
||||
@@ -383,6 +430,7 @@ LayoutIndexVue --> RouterGuard : "依赖"
|
||||
- 网络层面
|
||||
- 统一超时与 baseURL,减少请求失败带来的等待。
|
||||
- 401 自动清理鉴权信息并跳转,避免无效请求。
|
||||
- **新增**:Luxsin 控制器使用原生 fetch API,避免额外的 HTTP 客户端开销。
|
||||
- 缓存层面
|
||||
- 标签页 KeepAlive 与 sessionStorage 持久化,减少重复渲染与数据请求。
|
||||
- **设计令牌性能**
|
||||
@@ -402,6 +450,10 @@ LayoutIndexVue --> RouterGuard : "依赖"
|
||||
- 快捷入口不生效
|
||||
- 检查 quickLinks 的 path 是否与路由配置一致。
|
||||
- 确认 go(path) 调用是否正确触发路由跳转。
|
||||
- **Luxsin 控制器连接问题**
|
||||
- 确认设备 IP 地址格式正确且设备在线。
|
||||
- 检查防火墙设置,确保可以访问设备的 dev/info.cgi 接口。
|
||||
- 验证自定义 Base64 解码器是否能正确处理设备返回的数据格式。
|
||||
- **玻璃拟态样式问题**
|
||||
- 检查 lux-theme.css 是否正确引入。
|
||||
- 确认浏览器是否支持 backdrop-filter。
|
||||
@@ -412,13 +464,15 @@ LayoutIndexVue --> RouterGuard : "依赖"
|
||||
- [frontend/src/router/index.js:64-88](file://frontend/src/router/index.js#L64-L88)
|
||||
- [frontend/src/views/home/index.vue:113-144](file://frontend/src/views/home/index.vue#L113-L144)
|
||||
- [frontend/src/styles/lux-theme.css:11-78](file://frontend/src/styles/lux-theme.css#L11-L78)
|
||||
- [frontend/src/views/toolbox/luxsin-controller/index.vue:134-168](file://frontend/src/views/toolbox/luxsin-controller/index.vue#L134-L168)
|
||||
|
||||
## 结论
|
||||
首页仪表板通过清晰的组件划分、统一的 API 约定与完善的鉴权与拦截机制,实现了良好的用户体验与可维护性。**最新升级**引入了完整的玻璃拟态设计系统和设计令牌,提供了更加现代化和一致的视觉体验。建议后续在以下方面持续优化:
|
||||
首页仪表板通过清晰的组件划分、统一的 API 约定与完善的鉴权与拦截机制,实现了良好的用户体验与可维护性。**最新升级**引入了完整的玻璃拟态设计系统和设计令牌,提供了更加现代化和一致的视觉体验。**新增的 Luxsin 控制器快捷入口**进一步增强了系统的实用性,为用户提供了便捷的局域网设备数据同步功能。建议后续在以下方面持续优化:
|
||||
- 增加加载骨架屏与错误重试策略,进一步提升弱网体验。
|
||||
- 对今日新增列表增加分页或虚拟滚动,应对数据量增长。
|
||||
- 将快捷入口配置抽象为可配置文件,便于产品侧快速调整。
|
||||
- 继续完善设计令牌系统,支持更多自定义主题选项。
|
||||
- **新增**:考虑为 Luxsin 控制器添加设备历史记录功能,方便用户快速访问常用设备。
|
||||
|
||||
## 附录
|
||||
- 快捷入口卡片配置项
|
||||
@@ -433,9 +487,14 @@ LayoutIndexVue --> RouterGuard : "依赖"
|
||||
- 语义令牌:页面、玻璃表面、边框、模糊
|
||||
- 阴影层级:4级 elevation 系统
|
||||
- 圆角规范:sm/md/lg/xl 四级
|
||||
- **新增**:Luxsin 控制器功能说明
|
||||
- 支持同步设备信息和 PEQ 参数
|
||||
- 自定义 Base64 字符映射表解码
|
||||
- 实时设备状态监控与数据可视化
|
||||
|
||||
**章节来源**
|
||||
- [frontend/src/views/home/index.vue:113-118](file://frontend/src/views/home/index.vue#L113-L118)
|
||||
- [frontend/src/views/home/index.vue:113-119](file://frontend/src/views/home/index.vue#L113-L119)
|
||||
- [frontend/src/utils/tabs.js:1-9](file://frontend/src/utils/tabs.js#L1-L9)
|
||||
- [frontend/src/styles/lux-theme.css:11-78](file://frontend/src/styles/lux-theme.css#L11-L78)
|
||||
- [DESIGN.md:28-97](file://DESIGN.md#L28-L97)
|
||||
- [DESIGN.md:28-97](file://DESIGN.md#L28-L97)
|
||||
- [frontend/src/views/toolbox/luxsin-controller/index.vue:88-124](file://frontend/src/views/toolbox/luxsin-controller/index.vue#L88-L124)
|
||||
@@ -0,0 +1,221 @@
|
||||
# Luxsin控制器
|
||||
|
||||
<cite>
|
||||
**本文引用的文件**
|
||||
- [frontend/src/views/toolbox/luxsin-controller/index.vue](file://frontend/src/views/toolbox/luxsin-controller/index.vue)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js)
|
||||
- [backend/src/services/curveClient.js](file://backend/src/services/curveClient.js)
|
||||
- [backend/src/app.js](file://backend/src/app.js)
|
||||
- [backend/src/routes/dashboard.js](file://backend/src/routes/dashboard.js)
|
||||
- [frontend/src/api/dashboard.js](file://frontend/src/api/dashboard.js)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构总览](#架构总览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排查指南](#故障排查指南)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 简介
|
||||
本文件聚焦于“Luxsin控制器”功能,该功能位于前端工具箱页面中,用于与目标设备(通过 IP)直接通信,拉取并解码设备返回的自定义 Base64 数据,并以 JSON 形式展示。同时,文档也梳理了后端中与曲线校验相关的服务实现,便于理解前后端在数据处理与校验方面的协作边界。
|
||||
|
||||
## 项目结构
|
||||
- 前端:基于 Vue 3 + Element Plus 的单页应用,路由集中管理,工具类页面以独立视图组织。
|
||||
- 后端:Express 应用,提供认证、模型、OTA、仪表盘等 API;其中曲线校验逻辑封装在服务层。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "前端"
|
||||
FE_LUX["luxsin-controller 页面<br/>index.vue"]
|
||||
FE_ROUTER["路由配置<br/>router/index.js"]
|
||||
FE_DASH_API["仪表盘API调用<br/>api/dashboard.js"]
|
||||
end
|
||||
subgraph "后端"
|
||||
BE_APP["Express入口<br/>app.js"]
|
||||
BE_DASH_ROUTES["仪表盘路由<br/>routes/dashboard.js"]
|
||||
BE_CURVE["曲线客户端服务<br/>services/curveClient.js"]
|
||||
end
|
||||
FE_ROUTER --> FE_LUX
|
||||
FE_DASH_API --> BE_DASH_ROUTES
|
||||
BE_DASH_ROUTES --> BE_APP
|
||||
BE_CURVE --> |"外部曲线接口"| LUXSIN_API["https://api.luxsin.com.cn/audio/getCurve"]
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [frontend/src/router/index.js:68-72](file://frontend/src/router/index.js#L68-L72)
|
||||
- [frontend/src/views/toolbox/luxsin-controller/index.vue:126-168](file://frontend/src/views/toolbox/luxsin-controller/index.vue#L126-L168)
|
||||
- [backend/src/app.js:14-37](file://backend/src/app.js#L14-L37)
|
||||
- [backend/src/routes/dashboard.js:19-63](file://backend/src/routes/dashboard.js#L19-L63)
|
||||
- [backend/src/services/curveClient.js:81-138](file://backend/src/services/curveClient.js#L81-L138)
|
||||
|
||||
章节来源
|
||||
- [frontend/src/router/index.js:68-72](file://frontend/src/router/index.js#L68-L72)
|
||||
- [backend/src/app.js:14-37](file://backend/src/app.js#L14-L37)
|
||||
|
||||
## 核心组件
|
||||
- 前端 Luxsin 控制器页面
|
||||
- 输入设备 IP,触发“同步数据”或“同步 PEQ”动作。
|
||||
- 直接访问设备 HTTP 接口获取原始响应,并在前端完成自定义 Base64 解码与 JSON 解析。
|
||||
- 支持折叠查看原始响应、格式化显示 JSON、错误信息提示。
|
||||
- 后端曲线客户端服务
|
||||
- 负责从外部曲线接口拉取数据,进行自定义 Base64 解码与 parametric_eq 结构校验。
|
||||
- 提供可复用的函数供其他模块使用。
|
||||
|
||||
章节来源
|
||||
- [frontend/src/views/toolbox/luxsin-controller/index.vue:126-168](file://frontend/src/views/toolbox/luxsin-controller/index.vue#L126-L168)
|
||||
- [backend/src/services/curveClient.js:81-138](file://backend/src/services/curveClient.js#L81-L138)
|
||||
|
||||
## 架构总览
|
||||
Luxsin控制器为纯前端能力,不经过后端中转,直接对设备进行 HTTP 请求。后端侧的曲线客户端服务则用于后台任务中对第三方曲线接口的拉取与校验,二者职责清晰、互不耦合。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant U as "用户"
|
||||
participant FE as "前端页面<br/>luxsin-controller"
|
||||
participant DEV as "目标设备<br/>http : //{IP}/dev/info.cgi"
|
||||
U->>FE : 输入设备IP并点击“同步数据/同步PEQ”
|
||||
FE->>DEV : GET /dev/info.cgi?action=syncData|syncPeq
|
||||
DEV-->>FE : 返回自定义Base64文本
|
||||
FE->>FE : 自定义Base64解码 -> UTF-8字符串
|
||||
FE->>FE : JSON.parse 解析
|
||||
FE-->>U : 展示原始响应/JSON结果/错误信息
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [frontend/src/views/toolbox/luxsin-controller/index.vue:126-168](file://frontend/src/views/toolbox/luxsin-controller/index.vue#L126-L168)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 前端 Luxsin 控制器页面
|
||||
- 交互流程
|
||||
- 用户输入设备 IP,点击按钮后发起 fetch 请求到设备地址。
|
||||
- 将原始响应以 Base64 文本展示,并提供折叠开关。
|
||||
- 在前端执行自定义字符映射至标准 Base64,再解码为 UTF-8 文本,最后解析为 JSON 并美化输出。
|
||||
- 捕获网络异常、空响应、非法字符、非 JSON 等情况,分别给出友好提示。
|
||||
- 关键处理逻辑
|
||||
- 自定义 Base64 解码:维护自定义字符表与标准字符表的映射,跳过换行、空格与填充符,遇到未知字符抛出错误。
|
||||
- 统一请求封装:根据 action 参数区分“同步数据”和“同步 PEQ”,复用同一请求流程。
|
||||
- 用户体验
|
||||
- 加载态控制、禁用无效操作、错误消息弹窗、原始响应长度标签、可折叠面板。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["进入页面"]) --> Input["输入设备IP"]
|
||||
Input --> Click{"点击同步按钮?"}
|
||||
Click --> |否| Idle["等待操作"]
|
||||
Click --> |是| BuildURL["拼接设备URL<br/>?action=syncData|syncPeq"]
|
||||
BuildURL --> FetchReq["发起HTTP请求"]
|
||||
FetchReq --> RespOK{"HTTP状态码是否成功?"}
|
||||
RespOK --> |否| NetErr["提示网络错误"] --> End(["结束"])
|
||||
RespOK --> |是| ReadText["读取文本响应"]
|
||||
ReadText --> Empty{"是否为空?"}
|
||||
Empty --> |是| EmptyErr["提示空数据"] --> End
|
||||
Empty --> |否| Decode["自定义Base64解码为UTF-8"]
|
||||
Decode --> Parse{"能否解析为JSON?"}
|
||||
Parse --> |否| JsonErr["提示JSON解析失败"] --> End
|
||||
Parse --> |是| Show["展示原始响应与JSON结果"] --> End
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [frontend/src/views/toolbox/luxsin-controller/index.vue:126-168](file://frontend/src/views/toolbox/luxsin-controller/index.vue#L126-L168)
|
||||
|
||||
章节来源
|
||||
- [frontend/src/views/toolbox/luxsin-controller/index.vue:1-231](file://frontend/src/views/toolbox/luxsin-controller/index.vue#L1-231)
|
||||
|
||||
### 后端曲线客户端服务
|
||||
- 职责边界
|
||||
- 对外部曲线接口进行拉取、提取编码字段、自定义 Base64 解码、JSON 解析与 parametric_eq 结构校验。
|
||||
- 暴露函数供其他业务模块复用。
|
||||
- 关键函数
|
||||
- 表单到目标类型的映射:根据佩戴方式选择 Harman over-ear/in-ear 目标。
|
||||
- 自定义 Base64 解码:将自定义字符映射为标准 Base64 后再解码。
|
||||
- 载荷提取:兼容多种响应结构,优先从常见键名中提取编码字符串。
|
||||
- 校验:确保存在 filters 数组且长度为 10。
|
||||
- 主流程:组装查询参数、发送请求、日志记录、错误归一化。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class CurveClient {
|
||||
+curveTargetForForm(form) string|null
|
||||
+customBase64ToString(encoded) string
|
||||
+isValidParametricEqPayload(data) bool
|
||||
+extractEncodedPayload(responseData, responseText) string
|
||||
+fetchAndValidateCurve(brand, name, form, timeout) [bool,string]
|
||||
}
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/src/services/curveClient.js:21-48](file://backend/src/services/curveClient.js#L21-L48)
|
||||
- [backend/src/services/curveClient.js:50-79](file://backend/src/services/curveClient.js#L50-L79)
|
||||
- [backend/src/services/curveClient.js:81-138](file://backend/src/services/curveClient.js#L81-L138)
|
||||
|
||||
章节来源
|
||||
- [backend/src/services/curveClient.js:1-147](file://backend/src/services/curveClient.js#L1-147)
|
||||
|
||||
### 仪表盘相关(辅助参考)
|
||||
- 前端调用仪表盘今日统计接口,后端路由聚合数据库中的新增型号与 OTA 数量。
|
||||
- 该部分与 Luxsin 控制器无直接耦合,但体现了前后端分层与鉴权中间件的使用模式。
|
||||
|
||||
章节来源
|
||||
- [frontend/src/api/dashboard.js:1-12](file://frontend/src/api/dashboard.js#L1-12)
|
||||
- [backend/src/routes/dashboard.js:19-63](file://backend/src/routes/dashboard.js#L19-L63)
|
||||
- [backend/src/app.js:14-37](file://backend/src/app.js#L14-L37)
|
||||
|
||||
## 依赖关系分析
|
||||
- 前端
|
||||
- luxsin-controller 页面仅依赖浏览器原生 fetch 与 DOM API,无后端依赖。
|
||||
- 路由注册使该页面可通过路径访问。
|
||||
- 后端
|
||||
- Express 应用挂载各路由,仪表盘路由需登录鉴权。
|
||||
- 曲线客户端服务依赖 axios 与日志模块,调用外部曲线接口。
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
FE_CTRL["前端控制器页面"] --> |直接HTTP| DEVICE["设备接口"]
|
||||
FE_ROUTER["前端路由"] --> FE_CTRL
|
||||
FE_DASH_API["前端仪表盘API"] --> BE_DASH["后端仪表盘路由"]
|
||||
BE_DASH --> BE_APP["Express应用"]
|
||||
BE_CURVE["曲线客户端服务"] --> EXT["外部曲线接口"]
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [frontend/src/router/index.js:68-72](file://frontend/src/router/index.js#L68-L72)
|
||||
- [frontend/src/views/toolbox/luxsin-controller/index.vue:126-168](file://frontend/src/views/toolbox/luxsin-controller/index.vue#L126-L168)
|
||||
- [backend/src/app.js:14-37](file://backend/src/app.js#L14-L37)
|
||||
- [backend/src/routes/dashboard.js:19-63](file://backend/src/routes/dashboard.js#L19-L63)
|
||||
- [backend/src/services/curveClient.js:81-138](file://backend/src/services/curveClient.js#L81-L138)
|
||||
|
||||
章节来源
|
||||
- [frontend/src/router/index.js:68-72](file://frontend/src/router/index.js#L68-L72)
|
||||
- [backend/src/app.js:14-37](file://backend/src/app.js#L14-L37)
|
||||
|
||||
## 性能考虑
|
||||
- 前端
|
||||
- 大体积原始响应建议保持折叠默认隐藏,避免首屏渲染压力。
|
||||
- 自定义 Base64 解码为 O(n) 线性扫描,注意超长数据的内存占用。
|
||||
- 后端
|
||||
- 曲线接口请求设置超时,避免阻塞;合理记录日志但不打印超大响应体。
|
||||
- 校验逻辑尽量短路失败分支,减少不必要的解析开销。
|
||||
|
||||
## 故障排查指南
|
||||
- 前端常见问题
|
||||
- 无法连接设备:检查 IP 是否正确、设备端口是否开放、是否存在跨域限制(直连通常不受浏览器同源策略影响)。
|
||||
- 空响应:确认设备接口是否返回有效数据。
|
||||
- 解码失败:检查自定义 Base64 字符集是否与设备一致,关注非法字符报错。
|
||||
- JSON 解析失败:确认解码后的文本确为合法 JSON。
|
||||
- 后端常见问题
|
||||
- 外部曲线接口不可达:检查网络连通性与超时配置。
|
||||
- 响应结构不一致:调整 extractEncodedPayload 的键名匹配策略。
|
||||
- 校验失败:确认 filters 数组长度与结构是否符合预期。
|
||||
|
||||
章节来源
|
||||
- [frontend/src/views/toolbox/luxsin-controller/index.vue:126-168](file://frontend/src/views/toolbox/luxsin-controller/index.vue#L126-L168)
|
||||
- [backend/src/services/curveClient.js:81-138](file://backend/src/services/curveClient.js#L81-L138)
|
||||
|
||||
## 结论
|
||||
Luxsin控制器是一个轻量、直观的前端调试工具,专注于与设备的直接通信与数据解码展示。其设计简洁、职责单一,适合现场快速定位问题。后端曲线客户端服务则提供了更稳健的外部接口处理能力,可作为后台任务的通用组件。两者互补,共同支撑起音频设备管理与调优工作流。
|
||||
Reference in New Issue
Block a user