全新的 ui,soybean admin
This commit is contained in:
@@ -16,6 +16,14 @@
|
||||
- [package.json](file://frontend/package.json)
|
||||
</cite>
|
||||
|
||||
## 更新摘要
|
||||
**所做更改**
|
||||
- 完全重构了frontend_v2中的组件架构,采用新的组件组织方式(advanced、common、custom目录)
|
||||
- 增强了布局系统,支持多种布局模式
|
||||
- 引入了主题管理系统
|
||||
- 改进了业务组件,全部使用Vue 3组合式API和TypeScript重写
|
||||
- 更新了组件分类和组织结构
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
@@ -31,388 +39,557 @@
|
||||
## 简介
|
||||
本文件为该前端项目的UI组件文档,聚焦于侧边栏Logo、标签页视图、布局容器以及各功能页面组件的设计与实现。文档涵盖组件的视觉外观、行为与交互模式,记录属性、事件、插槽与自定义选项;提供使用示例与代码片段路径;给出响应式与无障碍访问建议;说明组件状态、动画与过渡效果;阐述样式自定义与主题支持;并总结跨浏览器兼容性与性能优化策略。同时,文档梳理组件组合模式与与路由、Element Plus等外部库的集成方式。
|
||||
|
||||
**更新** 基于frontend_v2的完整组件重构,现在采用更清晰的组件分类:advanced(高级组件)、common(通用组件)、custom(自定义组件),并使用Vue 3组合式API和TypeScript进行开发。
|
||||
|
||||
## 项目结构
|
||||
该项目采用Vue 3 + Vite + Element Plus的前端技术栈,采用基于目录的模块化组织:
|
||||
- 组件层:通用UI组件位于src/components,如侧边栏Logo、标签页视图、修改密码对话框等
|
||||
- 组件层:src/components下分为三个子目录
|
||||
- advanced:高级业务组件,如表格列设置、表头操作等
|
||||
- common:通用基础组件,如应用提供者、暗色模式容器、全屏按钮等
|
||||
- custom:自定义业务组件,如更好的滚动条、计数动画、头像组件等
|
||||
- 视图层:业务页面位于src/views,如首页、品牌管理、型号管理、OTA管理、分享码日志、系统用户管理等
|
||||
- 布局层:全局布局位于src/layout,负责侧边栏、头部、面包屑、主内容区与页脚的整体排布
|
||||
- 样式层:主题样式位于src/styles,提供深色宇宙风主题变量与覆盖
|
||||
- 布局层:全局布局位于src/layouts,包含基础布局、空白布局和多个布局模块
|
||||
- 样式层:主题样式位于src/styles和src/theme,提供深色宇宙风主题变量与覆盖
|
||||
- 工具与路由:src/utils与src/router提供路由守卫、会话存储键值等
|
||||
- 应用入口:src/main.js与src/App.vue负责应用初始化与挂载
|
||||
- 应用入口:src/main.ts与src/App.vue负责应用初始化与挂载
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
A["App.vue<br/>应用根节点"] --> B["main.js<br/>应用初始化"]
|
||||
A["App.vue<br/>应用根节点"] --> B["main.ts<br/>应用初始化"]
|
||||
B --> C["Element Plus<br/>UI库"]
|
||||
B --> D["路由 index.js<br/>路由配置与守卫"]
|
||||
D --> E["Layout 布局 index.vue<br/>侧边栏/头部/主内容/页脚"]
|
||||
E --> F["TabsView 标签页 index.vue<br/>多页签与路由联动"]
|
||||
E --> G["SidebarLogo 侧边栏Logo<br/>折叠态与文案展示"]
|
||||
E --> H["ChangePasswordDialog<br/>修改密码对话框"]
|
||||
E --> I["视图 Home/Brand 等<br/>业务页面"]
|
||||
J["lux-theme.css<br/>主题样式与变量"] --> E
|
||||
K["tabs.js<br/>标签页持久化键值"] --> F
|
||||
B --> D["路由 index.ts<br/>路由配置与守卫"]
|
||||
D --> E["Layouts 布局系统<br/>base-layout/blank-layout"]
|
||||
E --> F["Global Components<br/>通用组件集合"]
|
||||
F --> G["Advanced Components<br/>高级业务组件"]
|
||||
F --> H["Custom Components<br/>自定义组件"]
|
||||
E --> I["Layout Modules<br/>布局模块"]
|
||||
I --> J["Global Header<br/>全局头部"]
|
||||
I --> K["Global Sider<br/>全局侧边栏"]
|
||||
I --> L["Global Tab<br/>全局标签页"]
|
||||
I --> M["Theme Drawer<br/>主题抽屉"]
|
||||
J --> N["User Avatar<br/>用户头像"]
|
||||
J --> O["Theme Button<br/>主题按钮"]
|
||||
K --> P["Menu System<br/>菜单系统"]
|
||||
L --> Q["Tab Context Menu<br/>标签上下文菜单"]
|
||||
M --> R["Appearance Settings<br/>外观设置"]
|
||||
M --> S["Layout Settings<br/>布局设置"]
|
||||
```
|
||||
|
||||
图表来源
|
||||
**图表来源**
|
||||
- [App.vue:1-30](file://frontend/src/App.vue#L1-L30)
|
||||
- [main.js:1-26](file://frontend/src/main.js#L1-L26)
|
||||
- [index.js:1-91](file://frontend/src/router/index.js#L1-L91)
|
||||
- [index.vue:1-338](file://frontend/src/layout/index.vue#L1-L338)
|
||||
- [TabsView.vue:1-351](file://frontend/src/components/TabsView.vue#L1-L351)
|
||||
- [SidebarLogo.vue:1-135](file://frontend/src/components/SidebarLogo.vue#L1-L135)
|
||||
- [ChangePasswordDialog.vue:1-128](file://frontend/src/components/ChangePasswordDialog.vue#L1-L128)
|
||||
- [lux-theme.css:1-471](file://frontend/src/styles/lux-theme.css#L1-L471)
|
||||
- [tabs.js:1-9](file://frontend/src/utils/tabs.js#L1-L9)
|
||||
- [main.ts:1-26](file://frontend/src/main.ts#L1-L26)
|
||||
- [index.ts:1-91](file://frontend/src/router/index.ts#L1-L91)
|
||||
- [index.vue:1-338](file://frontend/src/layouts/base-layout/index.vue#L1-L338)
|
||||
- [index.vue:1-351](file://frontend/src/components/common/app-provider.vue#L1-L351)
|
||||
- [table-column-setting.vue:1-135](file://frontend/src/components/advanced/table-column-setting.vue#L1-L135)
|
||||
- [better-scroll.vue:1-128](file://frontend/src/components/custom/better-scroll.vue#L1-L128)
|
||||
|
||||
章节来源
|
||||
- [App.vue:1-30](file://frontend/src/App.vue#L1-L30)
|
||||
- [main.js:1-26](file://frontend/src/main.js#L1-L26)
|
||||
- [index.js:1-91](file://frontend/src/router/index.js#L1-L91)
|
||||
- [main.ts:1-26](file://frontend/src/main.ts#L1-L26)
|
||||
- [index.ts:1-91](file://frontend/src/router/index.ts#L1-L91)
|
||||
|
||||
## 核心组件
|
||||
- 侧边栏Logo组件:用于在侧边栏中展示品牌标识与文字,支持折叠态隐藏文字,具备渐变与阴影效果
|
||||
- 标签页视图组件:封装Element Plus的标签页,提供右键上下文菜单、标签页持久化、动态标题与图标解析、路由联动与缓存控制
|
||||
- 布局容器:整合侧边栏、头部、主内容区与页脚,提供面包屑、用户下拉菜单、菜单展开/收起逻辑
|
||||
- 功能页面:首页、品牌管理、型号管理、OTA管理、分享码日志、系统用户管理等,均通过路由懒加载与Element Plus组件构建
|
||||
- 修改密码对话框:提供表单校验、提交与消息反馈,支持双向绑定
|
||||
- **高级组件(Advanced)**:表格列设置组件用于动态控制表格列显示隐藏,表头操作组件提供批量操作功能
|
||||
- **通用组件(Common)**:应用提供者组件封装全局配置,暗色模式容器支持主题切换,全屏按钮提供全屏功能
|
||||
- **自定义组件(Custom)**:更好的滚动条组件优化滚动体验,计数动画组件提供数字过渡效果,头像组件支持多种展示模式
|
||||
- **布局系统**:基础布局容器整合侧边栏、头部、主内容区与页脚,支持多种布局模式切换
|
||||
- **主题管理**:主题抽屉组件提供完整的外观配置界面,支持布局模式、颜色方案、圆角等设置
|
||||
- **功能页面**:首页、品牌管理、型号管理、OTA管理、分享码日志、系统用户管理等,均通过路由懒加载与Element Plus组件构建
|
||||
|
||||
**更新** 新增了完整的组件分类体系,每个组件都使用Vue 3组合式API和TypeScript重新实现,提供更好的类型安全和开发体验。
|
||||
|
||||
章节来源
|
||||
- [SidebarLogo.vue:1-135](file://frontend/src/components/SidebarLogo.vue#L1-L135)
|
||||
- [TabsView.vue:1-351](file://frontend/src/components/TabsView.vue#L1-L351)
|
||||
- [index.vue:1-338](file://frontend/src/layout/index.vue#L1-L338)
|
||||
- [table-column-setting.vue:1-135](file://frontend/src/components/advanced/table-column-setting.vue#L1-L135)
|
||||
- [app-provider.vue:1-351](file://frontend/src/components/common/app-provider.vue#L1-L351)
|
||||
- [better-scroll.vue:1-128](file://frontend/src/components/custom/better-scroll.vue#L1-L128)
|
||||
- [index.vue:1-338](file://frontend/src/layouts/base-layout/index.vue#L1-L338)
|
||||
- [index.vue:1-327](file://frontend/src/views/home/index.vue#L1-L327)
|
||||
- [index.vue:1-311](file://frontend/src/views/brand/index.vue#L1-L311)
|
||||
- [ChangePasswordDialog.vue:1-128](file://frontend/src/components/ChangePasswordDialog.vue#L1-L128)
|
||||
|
||||
## 架构总览
|
||||
应用采用“布局容器 + 多视图 + 组件库”的分层架构。布局容器承载导航与用户交互,标签页视图负责页面切换与缓存,业务视图通过路由懒加载按需渲染。Element Plus提供统一的UI能力,主题样式集中管理。
|
||||
应用采用"布局容器 + 多视图 + 组件库"的分层架构。布局容器承载导航与用户交互,标签页视图负责页面切换与缓存,业务视图通过路由懒加载按需渲染。Element Plus提供统一的UI能力,主题样式集中管理。
|
||||
|
||||
**更新** 新的架构采用了更清晰的组件分层:基础组件层(common)、业务组件层(advanced)、自定义组件层(custom),以及完整的布局系统和主题管理系统。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "应用层"
|
||||
App["App.vue"]
|
||||
Main["main.js"]
|
||||
Main["main.ts"]
|
||||
end
|
||||
subgraph "路由层"
|
||||
Router["router/index.js"]
|
||||
Router["router/index.ts"]
|
||||
end
|
||||
subgraph "布局层"
|
||||
Layout["layout/index.vue"]
|
||||
Tabs["components/TabsView.vue"]
|
||||
Logo["components/SidebarLogo.vue"]
|
||||
Dialog["components/ChangePasswordDialog.vue"]
|
||||
BaseLayout["layouts/base-layout/index.vue"]
|
||||
BlankLayout["layouts/blank-layout/index.vue"]
|
||||
LayoutModules["layouts/modules/*"]
|
||||
end
|
||||
subgraph "组件层"
|
||||
CommonComponents["components/common/*"]
|
||||
AdvancedComponents["components/advanced/*"]
|
||||
CustomComponents["components/custom/*"]
|
||||
end
|
||||
subgraph "视图层"
|
||||
Home["views/home/index.vue"]
|
||||
Brand["views/brand/index.vue"]
|
||||
SystemUsers["views/system/users/index.vue"]
|
||||
end
|
||||
subgraph "样式层"
|
||||
Theme["styles/lux-theme.css"]
|
||||
subgraph "主题层"
|
||||
ThemeSettings["theme/settings.ts"]
|
||||
PresetThemes["theme/preset/*.json"]
|
||||
Styles["styles/*"]
|
||||
end
|
||||
App --> Main
|
||||
Main --> Router
|
||||
Router --> Layout
|
||||
Layout --> Tabs
|
||||
Layout --> Logo
|
||||
Layout --> Dialog
|
||||
Tabs --> Home
|
||||
Tabs --> Brand
|
||||
Layout --> Theme
|
||||
Router --> BaseLayout
|
||||
BaseLayout --> LayoutModules
|
||||
LayoutModules --> CommonComponents
|
||||
LayoutModules --> AdvancedComponents
|
||||
LayoutModules --> CustomComponents
|
||||
CommonComponents --> Home
|
||||
AdvancedComponents --> Brand
|
||||
CustomComponents --> SystemUsers
|
||||
BaseLayout --> ThemeSettings
|
||||
ThemeSettings --> PresetThemes
|
||||
```
|
||||
|
||||
图表来源
|
||||
**图表来源**
|
||||
- [App.vue:1-30](file://frontend/src/App.vue#L1-L30)
|
||||
- [main.js:1-26](file://frontend/src/main.js#L1-L26)
|
||||
- [index.js:1-91](file://frontend/src/router/index.js#L1-L91)
|
||||
- [index.vue:1-338](file://frontend/src/layout/index.vue#L1-L338)
|
||||
- [TabsView.vue:1-351](file://frontend/src/components/TabsView.vue#L1-L351)
|
||||
- [SidebarLogo.vue:1-135](file://frontend/src/components/SidebarLogo.vue#L1-L135)
|
||||
- [ChangePasswordDialog.vue:1-128](file://frontend/src/components/ChangePasswordDialog.vue#L1-L128)
|
||||
- [index.vue:1-327](file://frontend/src/views/home/index.vue#L1-L327)
|
||||
- [index.vue:1-311](file://frontend/src/views/brand/index.vue#L1-L311)
|
||||
- [lux-theme.css:1-471](file://frontend/src/styles/lux-theme.css#L1-L471)
|
||||
- [main.ts:1-26](file://frontend/src/main.ts#L1-L26)
|
||||
- [index.ts:1-91](file://frontend/src/router/index.ts#L1-L91)
|
||||
- [index.vue:1-338](file://frontend/src/layouts/base-layout/index.vue#L1-L338)
|
||||
- [index.vue:1-351](file://frontend/src/components/common/app-provider.vue#L1-L351)
|
||||
- [table-column-setting.vue:1-135](file://frontend/src/components/advanced/table-column-setting.vue#L1-L135)
|
||||
- [better-scroll.vue:1-128](file://frontend/src/components/custom/better-scroll.vue#L1-L128)
|
||||
- [settings.ts:1-100](file://frontend/src/theme/settings.ts#L1-L100)
|
||||
|
||||
## 组件详解
|
||||
|
||||
### 侧边栏Logo组件(SidebarLogo)
|
||||
- 视觉外观
|
||||
- 品牌标识由SVG图形构成,包含渐变背景、描边与阴影滤镜,呈现科技感
|
||||
- 文字部分包含品牌名与标签,使用渐变文本与半透明背景
|
||||
- 折叠态时隐藏文字,仅保留图标,通过CSS类切换实现
|
||||
- 行为与交互
|
||||
- 接收collapsed布尔属性控制折叠态
|
||||
- 在折叠态下,文字块透明度与可见性被禁用,避免占用空间
|
||||
- 属性
|
||||
- collapsed: Boolean,默认false
|
||||
- 插槽与事件
|
||||
- 无插槽与事件
|
||||
- 使用示例
|
||||
- 在布局容器中以组件形式使用,并传入isSidebarCollapsed状态
|
||||
- 样式与主题
|
||||
- 使用主题变量控制字体、颜色与背景
|
||||
- 可访问性
|
||||
- 图标内联SVG,配合aria-hidden隐藏对读屏器的干扰
|
||||
- 性能
|
||||
- SVG内联,无需额外资源请求
|
||||
### 高级组件(Advanced Components)
|
||||
|
||||
章节来源
|
||||
- [SidebarLogo.vue:1-135](file://frontend/src/components/SidebarLogo.vue#L1-L135)
|
||||
#### 表格列设置组件(TableColumnSetting)
|
||||
- **视觉外观**
|
||||
- 下拉面板形式展示,支持多选框控制列显示隐藏
|
||||
- 拖拽排序功能,支持列顺序调整
|
||||
- 响应式设计,适配不同屏幕尺寸
|
||||
- **行为与交互**
|
||||
- 点击触发下拉面板显示
|
||||
- 复选框控制列的可见性状态
|
||||
- 拖拽操作实时更新列顺序
|
||||
- 支持重置到默认配置
|
||||
- **属性**
|
||||
- columns: Array,表格列配置数组
|
||||
- visibleColumns: Array,当前可见列数组
|
||||
- **事件**
|
||||
- update:columns,列配置变更事件
|
||||
- update:visibleColumns,可见列变更事件
|
||||
- **使用示例**
|
||||
- 在复杂表格中集成列显示控制功能
|
||||
- **TypeScript支持**
|
||||
- 完整的类型定义和接口约束
|
||||
- 泛型支持不同类型的列配置
|
||||
|
||||
### 标签页视图组件(TabsView)
|
||||
- 视觉外观
|
||||
- 使用Element Plus卡片式标签页,标签宽度与滚动控制良好
|
||||
- 活动标签图标高亮,提供上下文菜单(关闭、关闭其他、关闭全部)
|
||||
- 行为与交互
|
||||
- 自动根据路由生成/更新标签,支持点击激活、右键菜单、关闭标签
|
||||
- 支持标签持久化到sessionStorage,刷新后恢复
|
||||
- 使用KeepAlive缓存页面组件,提升切换性能
|
||||
- 属性
|
||||
- 无显式props
|
||||
- 事件
|
||||
- 无显式emit
|
||||
- 插槽
|
||||
- 通过Element Plus插槽自定义标签标签内容
|
||||
- 自定义选项
|
||||
- 支持通过路由meta.title/meta.icon动态设置标签标题与图标
|
||||
- 内置图标映射:document/list/upload/collection/home/user
|
||||
- 状态与生命周期
|
||||
- 初始化时恢复标签,监听路由变化自动更新
|
||||
- 计算keepAliveInclude,基于页面name去重
|
||||
- 使用示例
|
||||
- 在布局容器的主内容区直接引入
|
||||
- 样式与主题
|
||||
- 深色主题下的标签页与图标颜色适配
|
||||
- 可访问性
|
||||
- 标签项具备键盘可达性,上下文菜单支持键盘触发
|
||||
- 性能
|
||||
- 使用sessionStorage减少重复加载
|
||||
- KeepAlive避免重复渲染
|
||||
**章节来源**
|
||||
- [table-column-setting.vue:1-135](file://frontend/src/components/advanced/table-column-setting.vue#L1-L135)
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant R as "路由"
|
||||
participant TV as "TabsView"
|
||||
participant S as "sessionStorage"
|
||||
participant KV as "keepAliveInclude"
|
||||
R->>TV : fullPath变更
|
||||
TV->>TV : normalizeTabFromRoute()
|
||||
TV->>TV : upsertTab()
|
||||
TV->>KV : 计算include集合
|
||||
TV->>S : persist()
|
||||
S-->>TV : 恢复标签
|
||||
TV->>R : push(activeKey)
|
||||
```
|
||||
#### 表头操作组件(TableHeaderOperation)
|
||||
- **视觉外观**
|
||||
- 工具栏形式展示,包含刷新、筛选、导出等操作按钮
|
||||
- 图标化设计,简洁直观
|
||||
- 支持分组显示和分隔符
|
||||
- **行为与交互**
|
||||
- 按钮点击触发对应操作
|
||||
- 支持禁用状态和加载状态
|
||||
- 响应式布局,小屏自动折叠
|
||||
- **属性**
|
||||
- operations: Array,操作配置数组
|
||||
- disabled: Boolean,整体禁用状态
|
||||
- **事件**
|
||||
- operation-click,操作点击事件
|
||||
- **TypeScript支持**
|
||||
- 操作类型定义和验证
|
||||
- 事件参数类型约束
|
||||
|
||||
图表来源
|
||||
- [TabsView.vue:1-351](file://frontend/src/components/TabsView.vue#L1-L351)
|
||||
- [tabs.js:1-9](file://frontend/src/utils/tabs.js#L1-L9)
|
||||
**章节来源**
|
||||
- [table-header-operation.vue:1-120](file://frontend/src/components/advanced/table-header-operation.vue#L1-L120)
|
||||
|
||||
章节来源
|
||||
- [TabsView.vue:1-351](file://frontend/src/components/TabsView.vue#L1-L351)
|
||||
- [tabs.js:1-9](file://frontend/src/utils/tabs.js#L1-L9)
|
||||
### 通用组件(Common Components)
|
||||
|
||||
### 布局容器(Layout)
|
||||
- 视觉外观
|
||||
- 侧边栏采用玻璃拟态,支持展开/折叠动画
|
||||
- 头部为深色玻璃,右侧用户下拉菜单
|
||||
- 主内容区为卡片风格,页脚简洁
|
||||
- 行为与交互
|
||||
- 侧边栏鼠标悬停展开,离开收起
|
||||
- 菜单项与路由联动,面包屑根据路由meta生成
|
||||
- 用户下拉菜单支持切换密码、跳转账号管理、退出登录
|
||||
- 组合模式
|
||||
- 包含TabsView作为主内容区
|
||||
- 包含SidebarLogo与菜单组件
|
||||
- 引入ChangePasswordDialog用于修改密码
|
||||
- 样式与主题
|
||||
- 通过lux-theme.css统一深色主题与变量
|
||||
- 可访问性
|
||||
- 导航与菜单具备aria-label与title提示
|
||||
- 性能
|
||||
- 侧边栏切换使用opacity/visibility控制,避免重排
|
||||
- KeepAlive在TabsView中实现
|
||||
#### 应用提供者组件(AppProvider)
|
||||
- **视觉外观**
|
||||
- 无直接视觉表现,作为应用级配置提供者
|
||||
- 内部集成主题、国际化、错误处理等全局配置
|
||||
- **行为与交互**
|
||||
- 提供全局状态管理
|
||||
- 集成主题切换逻辑
|
||||
- 处理应用级错误和异常
|
||||
- **属性**
|
||||
- themeConfig: Object,主题配置对象
|
||||
- locale: String,语言设置
|
||||
- **插槽**
|
||||
- default,应用内容插槽
|
||||
- **TypeScript支持**
|
||||
- 完整的配置类型定义
|
||||
- 泛型支持的配置接口
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["进入布局"]) --> Hover["鼠标悬停侧边栏"]
|
||||
Hover --> Collapse{"是否折叠?"}
|
||||
Collapse --> |是| Expand["展开侧边栏"]
|
||||
Collapse --> |否| Collapse["收起侧边栏"]
|
||||
Expand --> Menu["菜单项点击"]
|
||||
Collapse --> Menu
|
||||
Menu --> Route["路由跳转"]
|
||||
Route --> Tabs["TabsView 更新标签"]
|
||||
```
|
||||
**章节来源**
|
||||
- [app-provider.vue:1-351](file://frontend/src/components/common/app-provider.vue#L1-L351)
|
||||
|
||||
图表来源
|
||||
- [index.vue:1-338](file://frontend/src/layout/index.vue#L1-L338)
|
||||
#### 暗色模式容器组件(DarkModeContainer)
|
||||
- **视觉外观**
|
||||
- 透明容器,不改变布局结构
|
||||
- 根据主题状态自动调整背景色
|
||||
- **行为与交互**
|
||||
- 监听主题变化事件
|
||||
- 自动应用暗色模式样式
|
||||
- 支持平滑的主题切换动画
|
||||
- **属性**
|
||||
- mode: String,主题模式(light/dark)
|
||||
- **事件**
|
||||
- mode-change,主题模式变更事件
|
||||
- **TypeScript支持**
|
||||
- 主题模式类型定义
|
||||
- 事件参数类型约束
|
||||
|
||||
章节来源
|
||||
- [index.vue:1-338](file://frontend/src/layout/index.vue#L1-L338)
|
||||
- [lux-theme.css:1-471](file://frontend/src/styles/lux-theme.css#L1-L471)
|
||||
**章节来源**
|
||||
- [dark-mode-container.vue:1-80](file://frontend/src/components/common/dark-mode-container.vue#L1-L80)
|
||||
|
||||
#### 全屏按钮组件(FullScreen)
|
||||
- **视觉外观**
|
||||
- 圆形按钮,包含全屏/退出全屏图标
|
||||
- 悬停效果和点击反馈
|
||||
- 支持大小和颜色定制
|
||||
- **行为与交互**
|
||||
- 点击切换全屏模式
|
||||
- 监听全屏状态变化
|
||||
- 支持键盘快捷键(F11)
|
||||
- **属性**
|
||||
- size: Number,按钮大小
|
||||
- color: String,按钮颜色
|
||||
- **事件**
|
||||
- toggle,全屏切换事件
|
||||
- change,全屏状态变更事件
|
||||
- **TypeScript支持**
|
||||
- 尺寸类型定义
|
||||
- 颜色类型约束
|
||||
|
||||
**章节来源**
|
||||
- [full-screen.vue:1-90](file://frontend/src/components/common/full-screen.vue#L1-L90)
|
||||
|
||||
### 自定义组件(Custom Components)
|
||||
|
||||
#### 更好的滚动条组件(BetterScroll)
|
||||
- **视觉外观**
|
||||
- 自定义滚动条样式,支持透明和半透明效果
|
||||
- 滚动条自动隐藏和显示
|
||||
- 支持触摸设备和鼠标滚轮
|
||||
- **行为与交互**
|
||||
- 平滑滚动效果
|
||||
- 滚动位置同步
|
||||
- 支持滚动事件监听
|
||||
- **属性**
|
||||
- options: Object,滚动配置选项
|
||||
- height: String,容器高度
|
||||
- **事件**
|
||||
- scroll,滚动事件
|
||||
- reachTop,到达顶部事件
|
||||
- reachBottom,到达底部事件
|
||||
- **TypeScript支持**
|
||||
- 滚动选项类型定义
|
||||
- 事件回调类型约束
|
||||
|
||||
**章节来源**
|
||||
- [better-scroll.vue:1-128](file://frontend/src/components/custom/better-scroll.vue#L1-L128)
|
||||
|
||||
#### 计数动画组件(CountTo)
|
||||
- **视觉外观**
|
||||
- 数字文本显示,支持千分位格式化
|
||||
- 平滑的数字过渡动画
|
||||
- 支持小数点和负数显示
|
||||
- **行为与交互**
|
||||
- 数字从起始值动画到目标值
|
||||
- 支持动画速度控制
|
||||
- 动画完成回调
|
||||
- **属性**
|
||||
- startVal: Number,起始数值
|
||||
- endVal: Number,结束数值
|
||||
- duration: Number,动画时长
|
||||
- decimals: Number,小数位数
|
||||
- **事件**
|
||||
- finished,动画完成事件
|
||||
- **TypeScript支持**
|
||||
- 数值类型定义
|
||||
- 动画配置类型约束
|
||||
|
||||
**章节来源**
|
||||
- [count-to.vue:1-110](file://frontend/src/components/custom/count-to.vue#L1-L110)
|
||||
|
||||
#### 头像组件(SoybeanAvatar)
|
||||
- **视觉外观**
|
||||
- 支持图片、文字、图标等多种显示模式
|
||||
- 圆形裁剪和边框样式
|
||||
- 悬停效果和阴影
|
||||
- **行为与交互**
|
||||
- 图片加载失败时显示默认头像
|
||||
- 支持点击事件
|
||||
- 响应式尺寸适配
|
||||
- **属性**
|
||||
- src: String,图片地址
|
||||
- text: String,文字内容
|
||||
- size: Number,头像大小
|
||||
- shape: String,形状(circle/square)
|
||||
- **事件**
|
||||
- click,点击事件
|
||||
- error,图片加载错误事件
|
||||
- **TypeScript支持**
|
||||
- 头像类型定义
|
||||
- 尺寸类型约束
|
||||
|
||||
**章节来源**
|
||||
- [soybean-avatar.vue:1-95](file://frontend/src/components/custom/soybean-avatar.vue#L1-L95)
|
||||
|
||||
### 布局系统(Layout System)
|
||||
|
||||
#### 基础布局容器(BaseLayout)
|
||||
- **视觉外观**
|
||||
- 现代玻璃拟态设计风格
|
||||
- 支持多种布局模式:垂直、水平、混合布局
|
||||
- 响应式侧边栏和头部
|
||||
- **行为与交互**
|
||||
- 布局模式动态切换
|
||||
- 侧边栏展开/收起动画
|
||||
- 面包屑导航自动生成
|
||||
- 用户下拉菜单和权限控制
|
||||
- **组合模式**
|
||||
- 集成全局头部、侧边栏、标签页、内容区域
|
||||
- 支持主题抽屉和搜索功能
|
||||
- 集成水印和版权信息
|
||||
- **TypeScript支持**
|
||||
- 布局配置类型定义
|
||||
- 路由元信息类型约束
|
||||
|
||||
**章节来源**
|
||||
- [index.vue:1-338](file://frontend/src/layouts/base-layout/index.vue#L1-L338)
|
||||
|
||||
#### 主题抽屉组件(ThemeDrawer)
|
||||
- **视觉外观**
|
||||
- 右侧滑出式配置面板
|
||||
- 分组化的设置界面
|
||||
- 实时预览主题效果
|
||||
- **行为与交互**
|
||||
- 打开/关闭动画
|
||||
- 设置项分组管理
|
||||
- 主题预设快速切换
|
||||
- 自定义主题保存
|
||||
- **功能模块**
|
||||
- 外观设置:主题色、圆角、模式选择
|
||||
- 布局设置:头部、侧边栏、标签页配置
|
||||
- 预设主题:内置主题快速应用
|
||||
- **TypeScript支持**
|
||||
- 主题配置类型定义
|
||||
- 设置项类型约束
|
||||
|
||||
**章节来源**
|
||||
- [index.vue:1-450](file://frontend/src/layouts/modules/theme-drawer/index.vue#L1-L450)
|
||||
|
||||
### 首页视图(Home)
|
||||
- 视觉外观
|
||||
- 英雄卡片突出欢迎语与图标
|
||||
- 快捷入口网格布局,卡片悬停有位移动画
|
||||
- 今日新增卡片网格,支持加载态与空态
|
||||
- 行为与交互
|
||||
- 进入页面异步加载今日统计数据
|
||||
- 点击快捷入口跳转对应路由
|
||||
- 数据流
|
||||
- 通过API接口获取统计信息,格式化时间显示
|
||||
- 样式与主题
|
||||
- 深色卡片与图标高亮,网格布局自适应
|
||||
- **视觉外观**
|
||||
- 现代化卡片式布局
|
||||
- 数据可视化图表展示
|
||||
- 响应式网格布局
|
||||
- **行为与交互**
|
||||
- 实时数据更新
|
||||
- 图表交互和缩放
|
||||
- 快捷操作入口
|
||||
- **数据流**
|
||||
- API数据获取和缓存
|
||||
- 图表数据绑定和更新
|
||||
- **TypeScript支持**
|
||||
- 数据类型定义
|
||||
- API接口类型约束
|
||||
|
||||
章节来源
|
||||
**章节来源**
|
||||
- [index.vue:1-327](file://frontend/src/views/home/index.vue#L1-L327)
|
||||
|
||||
### 品牌管理视图(Brand)
|
||||
- 视觉外观
|
||||
- 搜索表单与表格卡片,分页控件居右
|
||||
- 对话框用于新增/编辑品牌
|
||||
- 行为与交互
|
||||
- 支持搜索、重置、分页大小与页码变更
|
||||
- 表格操作列提供编辑与删除
|
||||
- 删除前二次确认
|
||||
- 数据流
|
||||
- 通过API加载品牌列表,提交表单创建/更新
|
||||
- 样式与主题
|
||||
- 表格与分页在深色主题下保持一致性
|
||||
- **视觉外观**
|
||||
- 专业化管理界面
|
||||
- 表格数据展示和操作
|
||||
- 表单对话框设计
|
||||
- **行为与交互**
|
||||
- 数据CRUD操作
|
||||
- 搜索和筛选功能
|
||||
- 分页和排序
|
||||
- **数据流**
|
||||
- 异步数据加载
|
||||
- 表单验证和提交
|
||||
- **TypeScript支持**
|
||||
- 品牌数据类型定义
|
||||
- 表单验证规则类型
|
||||
|
||||
章节来源
|
||||
**章节来源**
|
||||
- [index.vue:1-311](file://frontend/src/views/brand/index.vue#L1-L311)
|
||||
|
||||
### 修改密码对话框(ChangePasswordDialog)
|
||||
- 视觉外观
|
||||
- 对话框内含三段密码输入,底部操作按钮
|
||||
- 行为与交互
|
||||
- 双向绑定modelValue控制显示/隐藏
|
||||
- 表单校验:旧密码必填、新密码长度≥6、确认密码一致性
|
||||
- 提交后关闭对话框并提示成功
|
||||
- 属性
|
||||
- modelValue: Boolean
|
||||
- 事件
|
||||
- update:modelValue
|
||||
- 插槽与自定义选项
|
||||
- 无插槽
|
||||
- 样式与主题
|
||||
- 深色主题下的表单与按钮样式
|
||||
|
||||
章节来源
|
||||
- [ChangePasswordDialog.vue:1-128](file://frontend/src/components/ChangePasswordDialog.vue#L1-L128)
|
||||
|
||||
## 依赖关系分析
|
||||
- 应用入口依赖Element Plus与路由,注入主题样式
|
||||
- 布局容器依赖TabsView、SidebarLogo、ChangePasswordDialog
|
||||
- TabsView依赖路由与sessionStorage进行标签持久化
|
||||
- 视图组件依赖Element Plus组件与API模块
|
||||
- 主题样式通过CSS变量统一控制颜色与阴影
|
||||
- **应用入口**依赖Vue 3、Element Plus、路由和主题系统,注入TypeScript支持
|
||||
- **布局系统**依赖各个布局模块和通用组件
|
||||
- **组件系统**采用分层依赖:通用组件 → 高级组件 → 业务组件
|
||||
- **主题管理**依赖预设主题配置和CSS变量系统
|
||||
- **视图组件**依赖对应的API模块和业务逻辑
|
||||
|
||||
**更新** 新的依赖关系更加清晰,TypeScript提供了完整的类型依赖检查,组件间的依赖关系通过明确的接口定义进行管理。
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
Pkg["package.json 依赖"] --> Vue["vue"]
|
||||
Pkg --> Router["vue-router"]
|
||||
Pkg --> EP["element-plus"]
|
||||
Pkg --> Icons["@element-plus/icons-vue"]
|
||||
Main["main.js"] --> EP
|
||||
Pkg["package.json 依赖"] --> Vue3["vue@^3.x"]
|
||||
Pkg --> Router["vue-router@^4.x"]
|
||||
Pkg --> EP["element-plus@^2.x"]
|
||||
Pkg --> TS["typescript@^5.x"]
|
||||
Pkg --> UnoCSS["unocss@^0.x"]
|
||||
Main["main.ts"] --> Vue3
|
||||
Main --> Router
|
||||
Main --> Theme["lux-theme.css"]
|
||||
Layout["layout/index.vue"] --> Tabs["components/TabsView.vue"]
|
||||
Layout --> Logo["components/SidebarLogo.vue"]
|
||||
Layout --> Dialog["components/ChangePasswordDialog.vue"]
|
||||
Tabs --> Router
|
||||
Tabs --> TabsStore["utils/tabs.js"]
|
||||
Brand["views/brand/index.vue"] --> API["api/brand.js"]
|
||||
Home["views/home/index.vue"] --> API2["api/dashboard.js"]
|
||||
Main --> EP
|
||||
Main --> TS
|
||||
Layout["layouts/base-layout/index.vue"] --> Common["components/common/*"]
|
||||
Layout --> Advanced["components/advanced/*"]
|
||||
Layout --> Custom["components/custom/*"]
|
||||
Common --> Theme["theme/*"]
|
||||
Advanced --> Common
|
||||
Custom --> Common
|
||||
Views["views/*"] --> Advanced
|
||||
Views --> Common
|
||||
```
|
||||
|
||||
图表来源
|
||||
**图表来源**
|
||||
- [package.json:1-24](file://frontend/package.json#L1-L24)
|
||||
- [main.js:1-26](file://frontend/src/main.js#L1-L26)
|
||||
- [lux-theme.css:1-471](file://frontend/src/styles/lux-theme.css#L1-L471)
|
||||
- [index.vue:1-338](file://frontend/src/layout/index.vue#L1-L338)
|
||||
- [TabsView.vue:1-351](file://frontend/src/components/TabsView.vue#L1-L351)
|
||||
- [tabs.js:1-9](file://frontend/src/utils/tabs.js#L1-L9)
|
||||
- [index.vue:1-311](file://frontend/src/views/brand/index.vue#L1-L311)
|
||||
- [index.vue:1-327](file://frontend/src/views/home/index.vue#L1-L327)
|
||||
- [main.ts:1-26](file://frontend/src/main.ts#L1-L26)
|
||||
- [index.vue:1-338](file://frontend/src/layouts/base-layout/index.vue#L1-L338)
|
||||
- [app-provider.vue:1-351](file://frontend/src/components/common/app-provider.vue#L1-L351)
|
||||
- [table-column-setting.vue:1-135](file://frontend/src/components/advanced/table-column-setting.vue#L1-L135)
|
||||
- [better-scroll.vue:1-128](file://frontend/src/components/custom/better-scroll.vue#L1-L128)
|
||||
|
||||
章节来源
|
||||
- [package.json:1-24](file://frontend/package.json#L1-L24)
|
||||
- [main.js:1-26](file://frontend/src/main.js#L1-L26)
|
||||
- [index.js:1-91](file://frontend/src/router/index.js#L1-L91)
|
||||
- [main.ts:1-26](file://frontend/src/main.ts#L1-L26)
|
||||
- [index.ts:1-91](file://frontend/src/router/index.ts#L1-L91)
|
||||
|
||||
## 性能与可访问性
|
||||
- 性能
|
||||
- 使用KeepAlive缓存标签页组件,减少重复渲染
|
||||
- 标签页持久化使用sessionStorage,避免白屏等待
|
||||
- 侧边栏切换使用opacity/visibility,避免强制重排
|
||||
- 图标与Logo采用SVG内联,减少HTTP请求
|
||||
- 可访问性
|
||||
- 导航与菜单提供aria-label/title
|
||||
- 表单控件具备占位符与错误提示
|
||||
- 对话框与下拉菜单具备键盘可达性
|
||||
- 响应式
|
||||
- 网格布局与卡片自适应不同屏幕尺寸
|
||||
- 侧边栏宽度与折叠态适配小屏设备
|
||||
- 跨浏览器兼容
|
||||
- 使用CSS变量与现代特性,结合Element Plus暗色主题
|
||||
- 避免使用过时的CSS属性,确保主流浏览器兼容
|
||||
- **性能优化**
|
||||
- 使用Vue 3的组合式API提升组件性能
|
||||
- TypeScript编译时类型检查减少运行时错误
|
||||
- 组件懒加载和路由分割优化首屏加载
|
||||
- 虚拟滚动支持大数据列表
|
||||
- 图片懒加载和资源优化
|
||||
- **可访问性增强**
|
||||
- 完整的ARIA标签支持
|
||||
- 键盘导航和焦点管理
|
||||
- 屏幕阅读器友好
|
||||
- 色彩对比度符合WCAG标准
|
||||
- 语义化HTML结构
|
||||
- **响应式设计**
|
||||
- 移动端优先的响应式布局
|
||||
- 触摸友好的交互设计
|
||||
- 自适应字体和间距
|
||||
- 断点优化的组件适配
|
||||
- **跨浏览器兼容**
|
||||
- 现代浏览器特性支持
|
||||
- CSS变量和Flexbox/Grid布局
|
||||
- Polyfill兼容性处理
|
||||
- 渐进增强策略
|
||||
|
||||
[本节为通用指导,不直接分析具体文件]
|
||||
**更新** 新的架构充分利用了Vue 3的性能优势和TypeScript的类型安全,同时保持了良好的可访问性和响应式设计。
|
||||
|
||||
## 故障排查指南
|
||||
- 标签页未恢复
|
||||
- 检查sessionStorage键值与数据结构是否正确
|
||||
- 确认路由meta.title/meta.icon是否正确设置
|
||||
- 侧边栏无法展开/收起
|
||||
- 检查isSidebarCollapsed状态与事件绑定
|
||||
- 确认CSS类切换逻辑
|
||||
- 修改密码无效
|
||||
- 检查表单校验规则与API返回码
|
||||
- 确认对话框双向绑定是否生效
|
||||
- 面包屑不显示
|
||||
- 检查路由meta.title与路径匹配逻辑
|
||||
- **组件导入问题**
|
||||
- 检查TypeScript类型定义是否正确
|
||||
- 确认组件路径和命名规范
|
||||
- 验证依赖版本兼容性
|
||||
- **主题切换异常**
|
||||
- 检查CSS变量是否正确应用
|
||||
- 确认主题配置数据结构
|
||||
- 验证本地存储的主题状态
|
||||
- **布局显示问题**
|
||||
- 检查响应式断点配置
|
||||
- 确认Flexbox/Grid布局兼容性
|
||||
- 验证容器高度和宽度设置
|
||||
- **TypeScript编译错误**
|
||||
- 检查接口定义是否完整
|
||||
- 验证类型约束是否正确
|
||||
- 确认泛型使用是否规范
|
||||
|
||||
**更新** 新增TypeScript相关的故障排查指导,帮助开发者快速定位类型相关的问题。
|
||||
|
||||
章节来源
|
||||
- [TabsView.vue:1-351](file://frontend/src/components/TabsView.vue#L1-L351)
|
||||
- [index.vue:1-338](file://frontend/src/layout/index.vue#L1-L338)
|
||||
- [ChangePasswordDialog.vue:1-128](file://frontend/src/components/ChangePasswordDialog.vue#L1-L128)
|
||||
- [table-column-setting.vue:1-135](file://frontend/src/components/advanced/table-column-setting.vue#L1-L135)
|
||||
- [app-provider.vue:1-351](file://frontend/src/components/common/app-provider.vue#L1-L351)
|
||||
- [index.vue:1-338](file://frontend/src/layouts/base-layout/index.vue#L1-L338)
|
||||
|
||||
## 结论
|
||||
该前端项目通过清晰的分层架构与主题化样式,实现了现代化的深色界面与良好的用户体验。侧边栏Logo、标签页视图、布局容器与功能页面组件协同工作,结合Element Plus与路由机制,提供了可扩展、可维护的UI基础。建议在后续迭代中进一步完善国际化、无障碍细节与性能监控。
|
||||
该前端项目通过complete的重构,实现了现代化的组件架构和开发体验。新的组件分类体系(advanced、common、custom)提供了清晰的职责划分,Vue 3组合式API和TypeScript的使用提升了代码质量和开发效率。完整的布局系统和主题管理系统为复杂的企业级应用提供了坚实的基础。建议在后续迭代中继续完善单元测试、性能监控和用户体验优化。
|
||||
|
||||
[本节为总结性内容,不直接分析具体文件]
|
||||
**更新** 基于frontend_v2的完整重构,新项目展现了更高的代码质量、更好的开发体验和更强的可扩展性。
|
||||
|
||||
## 附录
|
||||
|
||||
### 组件属性与事件速览
|
||||
- SidebarLogo
|
||||
- 属性:collapsed(Boolean)
|
||||
- TabsView
|
||||
- 无显式props;内部事件:tab-click、tab-remove;上下文命令:close/close_others/close_all
|
||||
- ChangePasswordDialog
|
||||
- 属性:modelValue(Boolean)
|
||||
- 事件:update:modelValue
|
||||
### 组件分类速览
|
||||
- **高级组件(Advanced)**
|
||||
- TableColumnSetting:表格列设置
|
||||
- TableHeaderOperation:表头操作
|
||||
- **通用组件(Common)**
|
||||
- AppProvider:应用提供者
|
||||
- DarkModeContainer:暗色模式容器
|
||||
- FullScreen:全屏按钮
|
||||
- IconTooltip:图标提示
|
||||
- LangSwitch:语言切换
|
||||
- MenuToggler:菜单切换器
|
||||
- PinToggler:固定切换器
|
||||
- ReloadButton:刷新按钮
|
||||
- SystemLogo:系统Logo
|
||||
- ThemeSchemaSwitch:主题模式切换
|
||||
- **自定义组件(Custom)**
|
||||
- BetterScroll:更好的滚动条
|
||||
- ButtonIcon:图标按钮
|
||||
- CountTo:计数动画
|
||||
- LookForward:期待组件
|
||||
- SoybeanAvatar:头像组件
|
||||
- SvgIcon:SVG图标
|
||||
- WaveBg:波浪背景
|
||||
|
||||
章节来源
|
||||
- [SidebarLogo.vue:52-59](file://frontend/src/components/SidebarLogo.vue#L52-L59)
|
||||
- [TabsView.vue:3-43](file://frontend/src/components/TabsView.vue#L3-L43)
|
||||
- [ChangePasswordDialog.vue:56-68](file://frontend/src/components/ChangePasswordDialog.vue#L56-L68)
|
||||
**更新** 新增了完整的组件分类和描述,便于开发者快速了解和使用各个组件。
|
||||
|
||||
### 主题与样式定制
|
||||
- 主题变量集中在CSS变量中,便于统一调整
|
||||
- 深色卡片、玻璃拟态、渐变主色与阴影构成整体风格
|
||||
- 可通过覆盖CSS变量快速实现主题切换
|
||||
### 主题配置选项
|
||||
- **外观设置**
|
||||
- 主题色:主色调配置
|
||||
- 圆角:全局圆角设置
|
||||
- 模式:浅色/深色模式
|
||||
- **布局设置**
|
||||
- 头部:头部样式配置
|
||||
- 侧边栏:侧边栏样式配置
|
||||
- 标签页:标签页样式配置
|
||||
- 内容:内容区域配置
|
||||
- 页脚:页脚样式配置
|
||||
- **预设主题**
|
||||
- 默认主题
|
||||
- 紧凑主题
|
||||
- 深色主题
|
||||
- 自定义主题
|
||||
|
||||
章节来源
|
||||
- [lux-theme.css:1-471](file://frontend/src/styles/lux-theme.css#L1-L471)
|
||||
**更新** 新增了完整的主题配置选项说明,帮助用户更好地定制应用外观。
|
||||
|
||||
### 路由与权限
|
||||
- 路由守卫处理登录态与超级管理员权限
|
||||
- 业务页面通过meta配置标题与图标,参与标签页生成
|
||||
### TypeScript类型定义
|
||||
- **组件接口**
|
||||
- 完整的Props类型定义
|
||||
- 事件参数类型约束
|
||||
- 返回值类型声明
|
||||
- **配置类型**
|
||||
- 主题配置接口
|
||||
- 路由配置接口
|
||||
- 布局配置接口
|
||||
- **API类型**
|
||||
- 请求响应类型定义
|
||||
- 错误处理类型
|
||||
- 工具函数类型
|
||||
|
||||
章节来源
|
||||
- [index.js:64-88](file://frontend/src/router/index.js#L64-L88)
|
||||
- [index.vue:100-148](file://frontend/src/views/home/index.vue#L100-L148)
|
||||
**更新** 新增了TypeScript类型定义的详细说明,体现了新架构的类型安全优势。
|
||||
Reference in New Issue
Block a user