From 6cb591212dd746fa63bb891a94c4667ce3ad645c Mon Sep 17 00:00:00 2001 From: Your Name Date: Tue, 2 Jun 2026 05:14:13 +0800 Subject: [PATCH] refactor(files): P2 split UI into components with page context inject Co-authored-by: Cursor --- .../changelog/2026-06-02-files-refactor-P2.md | 48 ++ .../plans/2026-06-02-files-refactor-P2.md | 27 + .../src/components/files/FilesBreadcrumb.vue | 29 + .../src/components/files/FilesDialogs.vue | 180 +++++ frontend/src/components/files/FilesList.vue | 234 +++++++ .../components/files/FilesPermissionAlert.vue | 35 + .../src/components/files/FilesStatusBar.vue | 24 + .../src/components/files/FilesToolbar.vue | 121 ++++ .../src/composables/files/filesPageContext.ts | 18 + frontend/src/composables/files/index.ts | 2 + frontend/src/pages/FilesPage.vue | 644 +----------------- 11 files changed, 740 insertions(+), 622 deletions(-) create mode 100644 docs/changelog/2026-06-02-files-refactor-P2.md create mode 100644 docs/design/plans/2026-06-02-files-refactor-P2.md create mode 100644 frontend/src/components/files/FilesBreadcrumb.vue create mode 100644 frontend/src/components/files/FilesDialogs.vue create mode 100644 frontend/src/components/files/FilesList.vue create mode 100644 frontend/src/components/files/FilesPermissionAlert.vue create mode 100644 frontend/src/components/files/FilesStatusBar.vue create mode 100644 frontend/src/components/files/FilesToolbar.vue create mode 100644 frontend/src/composables/files/filesPageContext.ts diff --git a/docs/changelog/2026-06-02-files-refactor-P2.md b/docs/changelog/2026-06-02-files-refactor-P2.md new file mode 100644 index 00000000..ecdd5e90 --- /dev/null +++ b/docs/changelog/2026-06-02-files-refactor-P2.md @@ -0,0 +1,48 @@ +# Changelog: 文件管理器 P2 — 组件拆分 + +**日期**: 2026-06-02 +**类型**: 重构 (Refactor) +**影响范围**: `frontend/src/pages/FilesPage.vue`、`frontend/src/components/files/*` + +--- + +## 变更摘要 + +将文件管理页模板拆分为 6 个子组件;`FilesPage.vue` 仅负责布局装配与 `provideFilesPage` 注入上下文。 + +--- + +## 动机 + +P1 已将逻辑迁入 composable,但单文件模板仍超 500 行,不利于维护与 P5/P6 局部优化。 + +--- + +## 新增文件 + +- `frontend/src/composables/files/filesPageContext.ts` — provide/inject 上下文 +- `frontend/src/components/files/FilesToolbar.vue` +- `frontend/src/components/files/FilesPermissionAlert.vue` +- `frontend/src/components/files/FilesStatusBar.vue` +- `frontend/src/components/files/FilesBreadcrumb.vue` +- `frontend/src/components/files/FilesList.vue` +- `frontend/src/components/files/FilesDialogs.vue` + +--- + +## 涉及文件 + +- `frontend/src/pages/FilesPage.vue` — 由 ~640 行降至 ~45 行 + +--- + +## 是否需迁移 / 重启 + +- 仅前端重新构建部署 + +--- + +## 验证方式 + +1. `cd frontend && npx vite build` +2. 文件管理:工具栏、列表、对话框、编辑器、右键菜单、快捷键 diff --git a/docs/design/plans/2026-06-02-files-refactor-P2.md b/docs/design/plans/2026-06-02-files-refactor-P2.md new file mode 100644 index 00000000..b1e0b06c --- /dev/null +++ b/docs/design/plans/2026-06-02-files-refactor-P2.md @@ -0,0 +1,27 @@ +# 文件管理器重构 P2 — 拆分 Vue 组件 + +**日期**: 2026-06-02 +**设计**: `docs/design/specs/2026-06-02-files-refactor-design.md` §3 P2 +**前置**: P1 composable + Pinia store + +## 目标 + +- 模板迁入 `frontend/src/components/files/*` +- `FilesPage.vue` ≤ 250 行(实际 ~45 行模板 + ~25 行 script) +- 子组件通过 `provideFilesPage` / `useFilesPageContext` 共享状态,避免 props 爆炸 + +## 组件清单 + +| 组件 | 职责 | +|------|------| +| `FilesToolbar.vue` | 服务器、路径、筛选、操作按钮 | +| `FilesPermissionAlert.vue` | 权限横幅 + 一键 sudo | +| `FilesStatusBar.vue` | 目录统计、剪贴板提示 | +| `FilesBreadcrumb.vue` | 面包屑 + 批量操作条 | +| `FilesList.vue` | 表格、拖拽上传、右键菜单 | +| `FilesDialogs.vue` | 上传/新建/删除/重命名/压缩/预览等对话框 | + +## 验证 + +- `npx vite build` +- 文件管理全功能回归(与 P1 相同) diff --git a/frontend/src/components/files/FilesBreadcrumb.vue b/frontend/src/components/files/FilesBreadcrumb.vue new file mode 100644 index 00000000..c657def7 --- /dev/null +++ b/frontend/src/components/files/FilesBreadcrumb.vue @@ -0,0 +1,29 @@ + + + diff --git a/frontend/src/components/files/FilesDialogs.vue b/frontend/src/components/files/FilesDialogs.vue new file mode 100644 index 00000000..e7844b9d --- /dev/null +++ b/frontend/src/components/files/FilesDialogs.vue @@ -0,0 +1,180 @@ + + + + + diff --git a/frontend/src/components/files/FilesList.vue b/frontend/src/components/files/FilesList.vue new file mode 100644 index 00000000..61b799f6 --- /dev/null +++ b/frontend/src/components/files/FilesList.vue @@ -0,0 +1,234 @@ + + + + + diff --git a/frontend/src/components/files/FilesPermissionAlert.vue b/frontend/src/components/files/FilesPermissionAlert.vue new file mode 100644 index 00000000..b37ed7c6 --- /dev/null +++ b/frontend/src/components/files/FilesPermissionAlert.vue @@ -0,0 +1,35 @@ + + + diff --git a/frontend/src/components/files/FilesStatusBar.vue b/frontend/src/components/files/FilesStatusBar.vue new file mode 100644 index 00000000..6d847a03 --- /dev/null +++ b/frontend/src/components/files/FilesStatusBar.vue @@ -0,0 +1,24 @@ + + + diff --git a/frontend/src/components/files/FilesToolbar.vue b/frontend/src/components/files/FilesToolbar.vue new file mode 100644 index 00000000..7a454953 --- /dev/null +++ b/frontend/src/components/files/FilesToolbar.vue @@ -0,0 +1,121 @@ + + + diff --git a/frontend/src/composables/files/filesPageContext.ts b/frontend/src/composables/files/filesPageContext.ts new file mode 100644 index 00000000..a8b880e6 --- /dev/null +++ b/frontend/src/composables/files/filesPageContext.ts @@ -0,0 +1,18 @@ +import { inject, provide, type InjectionKey } from 'vue' +import type { useFilesPage } from './useFilesPage' + +export type FilesPageContext = ReturnType + +export const filesPageKey: InjectionKey = Symbol('filesPage') + +export function provideFilesPage(ctx: FilesPageContext): void { + provide(filesPageKey, ctx) +} + +export function useFilesPageContext(): FilesPageContext { + const ctx = inject(filesPageKey) + if (!ctx) { + throw new Error('useFilesPageContext() must be used inside FilesPage') + } + return ctx +} diff --git a/frontend/src/composables/files/index.ts b/frontend/src/composables/files/index.ts index 11476447..7a5cdd04 100644 --- a/frontend/src/composables/files/index.ts +++ b/frontend/src/composables/files/index.ts @@ -5,3 +5,5 @@ export { useFilesEditor } from './useFilesEditor' export { useFilesActions } from './useFilesActions' export { useFilesSelection } from './useFilesSelection' export { useFilesPage } from './useFilesPage' +export { provideFilesPage, useFilesPageContext } from './filesPageContext' +export type { FilesPageContext } from './filesPageContext' diff --git a/frontend/src/pages/FilesPage.vue b/frontend/src/pages/FilesPage.vue index d8ffb2b1..33817c7d 100644 --- a/frontend/src/pages/FilesPage.vue +++ b/frontend/src/pages/FilesPage.vue @@ -1,639 +1,39 @@ - - -