Main #2

Closed
maoyuanyang wants to merge 0 commits from maoyuanyang/curriculum-project-hub:main into main
Contributor

PR: 文件库老师端网盘式改版 + 授权面板表格化 + 回收站 + 权限语义调整

  • base: upstream/main
  • head: origin/main
  • 变更范围: 37 个文件,+1914 / -266 行,6 条 ADR(0030–0035),2 个 DB migration

一、老师端文件库网盘式改版

分支 feat/filelib-grid-browser,提交 0fd21e5

老师端 /app 从树+详情布局改为网盘式网格浏览器

  • 大图标卡片(文件夹 / 项目 / 文件三种样式),双击下钻、面包屑导航返回
  • 右键菜单:打开 / 新建子文件夹 / 重命名 / 授权管理 / 详情 / 删除(按 role 动态显隐)
  • 文件双击进预览栏(复用 FileEditor
  • 左栏导航(「教研数据库」标题 + 文件库 / 回收站),底部用户身份 + 退出
  • 管理后台 /database 保留原树状布局不动

新增组件: GridLibraryView / GridCard / ContextMenu

二、授权面板表格化

分支 feat/grants-table,提交 0dd2ae3

  • 顶部搜索框(名称 / id / 类型过滤)+「添加授权」弹窗(类型 + 主体搜索选择 + 权限)
  • 表格列:成员(圆形头像 + 名称)/ userId / 飞书 ID / 类型 / 权限(下拉可改)/ 加入时间 / 操作(删除)
  • 成员单元格点击跳转用户管理(?q= 过滤)或 Group 管理(?select= 选中)
  • 后端 GrantDto 增加 principalName + principalOpenId(批量回填,3 处统一)
  • 权限名称汉化(VIEW / EDIT / MANAGE → 只读 / 可编辑 / 可管理),共享 labels.ts
  • 容器加宽至 1400px,长 id 截断 + 悬停全文,溢出横向滚动

三、回收站

分支 feat/filelib-nav-rail,提交 d072e9e;后续修复 fix/bin-restore-dedup / feat/purge-follows-manage / fix/restore-no-suffix

操作 语义 门禁
列出 每支已删子树的顶点(祖先全活跃) 管理员或直连 MANAGE
恢复 只清本节点 deletedAt,保留原名;撞名报 409 同上
彻底删除 pathIds 枚举子树按深度降序分批硬删 同上(ADR-0034)

审计:folder.restore / project.restore / node.purge

四、权限语义调整

分支 feat/filelib-always-independent,提交 39a2be6

  • 项目级授权恒生效,移除「独立权限」开关(原 D11 冻结语义废除,ADR-0030)
  • permission.ts 删除冻结分支;FileLibProjectSettings 表保留但不再读写
  • 前端概览 tab 移除开关 UI

五、Bug 修复

提交 内容
91afd3c 文件库树加载失败时显示错误而非永久「加载中」
d39ebed 卡片右键 stopPropagation(修背景菜单覆盖节点菜单导致看不到删除)
ab5e038 .omo/ 误提交清理 + 加入 .gitignore

六、测试

  • 新增 filelib-nav.test.ts(回收站列出 / 恢复 / 彻底删除 / 权限 5 例)
  • filelib-permission.test.ts 改为断言恒生效语义
  • helpers.ts resetDb 补 MemberGroup 三表清理
  • 全套 54 例通过

七、ADR 记录

ADR 内容
0030 项目级授权恒生效,移除独立权限开关
0031 回收站语义(列出 / 恢复 / 彻底删除)
0032 移除最近打开模块(supersede 0031 对应半部)
0033 恢复自动改名(后被 0035 supersede)
0034 彻底删除改与 MANAGE 同权
0035 恢复保留原名,撞名报清晰错误

⚠️ 注意事项

  1. upstream 有 10 个未合提交(真 git VersionStore、CodeMirror 编辑器、PDF 导出、修改历史 tab 等),merge upstream 后需解决冲突——尤其是 VersionStore 改为真 git 后 binService / fileService 的 storageDir 语义可能需要适配
  2. 2 个 migrationfilelib_recent_visit 建表 + 删表),prisma migrate deploy 会顺序应用,最终无残留表
  3. ** breadcrumb API 新增 role 字段**(treeService.ts),additive,不影响现有消费方
# PR: 文件库老师端网盘式改版 + 授权面板表格化 + 回收站 + 权限语义调整 - **base:** `upstream/main` - **head:** `origin/main` - **变更范围:** 37 个文件,+1914 / -266 行,6 条 ADR(0030–0035),2 个 DB migration --- ## 一、老师端文件库网盘式改版 > 分支 `feat/filelib-grid-browser`,提交 `0fd21e5` 老师端 `/app` 从树+详情布局改为**网盘式网格浏览器**: - 大图标卡片(文件夹 / 项目 / 文件三种样式),双击下钻、面包屑导航返回 - 右键菜单:打开 / 新建子文件夹 / 重命名 / 授权管理 / 详情 / 删除(按 `role` 动态显隐) - 文件双击进预览栏(复用 `FileEditor`) - 左栏导航(「教研数据库」标题 + 文件库 / 回收站),底部用户身份 + 退出 - 管理后台 `/database` 保留原树状布局不动 **新增组件:** `GridLibraryView` / `GridCard` / `ContextMenu` ## 二、授权面板表格化 > 分支 `feat/grants-table`,提交 `0dd2ae3` - 顶部搜索框(名称 / id / 类型过滤)+「添加授权」弹窗(类型 + 主体搜索选择 + 权限) - 表格列:成员(圆形头像 + 名称)/ userId / 飞书 ID / 类型 / 权限(下拉可改)/ 加入时间 / 操作(删除) - 成员单元格点击跳转用户管理(`?q=` 过滤)或 Group 管理(`?select=` 选中) - 后端 `GrantDto` 增加 `principalName` + `principalOpenId`(批量回填,3 处统一) - 权限名称汉化(VIEW / EDIT / MANAGE → 只读 / 可编辑 / 可管理),共享 `labels.ts` - 容器加宽至 1400px,长 id 截断 + 悬停全文,溢出横向滚动 ## 三、回收站 > 分支 `feat/filelib-nav-rail`,提交 `d072e9e`;后续修复 `fix/bin-restore-dedup` / `feat/purge-follows-manage` / `fix/restore-no-suffix` | 操作 | 语义 | 门禁 | |------|------|------| | 列出 | 每支已删子树的顶点(祖先全活跃) | 管理员或直连 MANAGE | | 恢复 | 只清本节点 `deletedAt`,保留原名;撞名报 `409` | 同上 | | 彻底删除 | pathIds 枚举子树按深度降序分批硬删 | 同上(ADR-0034) | 审计:`folder.restore` / `project.restore` / `node.purge` ## 四、权限语义调整 > 分支 `feat/filelib-always-independent`,提交 `39a2be6` - 项目级授权恒生效,移除「独立权限」开关(原 D11 冻结语义废除,ADR-0030) - `permission.ts` 删除冻结分支;`FileLibProjectSettings` 表保留但不再读写 - 前端概览 tab 移除开关 UI ## 五、Bug 修复 | 提交 | 内容 | |------|------| | `91afd3c` | 文件库树加载失败时显示错误而非永久「加载中」 | | `d39ebed` | 卡片右键 `stopPropagation`(修背景菜单覆盖节点菜单导致看不到删除) | | `ab5e038` | `.omo/` 误提交清理 + 加入 `.gitignore` | ## 六、测试 - 新增 `filelib-nav.test.ts`(回收站列出 / 恢复 / 彻底删除 / 权限 5 例) - `filelib-permission.test.ts` 改为断言恒生效语义 - `helpers.ts` `resetDb` 补 MemberGroup 三表清理 - 全套 **54 例通过** ## 七、ADR 记录 | ADR | 内容 | |-----|------| | 0030 | 项目级授权恒生效,移除独立权限开关 | | 0031 | 回收站语义(列出 / 恢复 / 彻底删除) | | 0032 | 移除最近打开模块(supersede 0031 对应半部) | | 0033 | 恢复自动改名(后被 0035 supersede) | | 0034 | 彻底删除改与 MANAGE 同权 | | 0035 | 恢复保留原名,撞名报清晰错误 | ## ⚠️ 注意事项 1. **upstream 有 10 个未合提交**(真 git VersionStore、CodeMirror 编辑器、PDF 导出、修改历史 tab 等),merge upstream 后需解决冲突——尤其是 `VersionStore` 改为真 git 后 `binService` / `fileService` 的 storageDir 语义可能需要适配 2. **2 个 migration**(`filelib_recent_visit` 建表 + 删表),`prisma migrate deploy` 会顺序应用,最终无残留表 3. ** breadcrumb API 新增 `role` 字段**(`treeService.ts`),additive,不影响现有消费方
maoyuanyang added 47 commits 2026-07-31 15:35:04 +08:00
- GrantsPanel 重写为表格:顶部左侧授权成员搜索框(名称/id/类型过滤),
  右侧「添加授权」弹窗(类型 + 主体搜索选择 + 权限);行内权限下拉
  直接改级(复用 PUT upsert),操作列删除;成员单元格跳转用户管理
  (?q= 过滤)或 Group 管理(?select= 选中)。
- grantService: GrantDto 增加 principalName,list/put/force 三处统一
  批量回填(用户 displayName / 组 name),前端不再只显示裸 id。
- 用户管理页加过滤框并从 ?q= 初始化;GroupAdmin 支持 ?select= 直达。
- 测试:resetDb 补 MemberGroup 三表清理(全局表不被 org/user 级联清到,
  此前跨用例污染导致级联软删用例断言失败);cph_hub_test 补 migrate。
- 顺带合并 types.ts 里重复的 Grant 声明(interface 合并残留)。
统一走新增共享常量 labels.ts ROLE_LABEL(与 OverviewPanel 既有文案一致);
覆盖授权表格与弹窗下拉、详情头 tag、树节点角标;API 传参仍用英文枚举。
GrantDto 增加 principalOpenId(USER 主体的 feishuOpenId),GROUP 行两列显示 —;
搜索过滤同步覆盖 openId。
- permission.ts: effectiveRole 删除 D11 冻结分支,输入不再含开关字段
- treeService: 停止读 FileLibProjectSettings;建项目不再写默认行
- grantService/routes: 删 setIndependentPermission 与 PUT 路由;节点详情 DTO 去掉 independentPermission
- filelib-web: 概览 tab 移除开关;NodeDetail 类型同步
- 测试: 单测/集成改为断言恒生效语义;ADR-0030 废除契约 D11/P5
- FileLibProjectSettings 表保留(存量行忽略,不再读写),审计词表保留历史读取
- 新 GridLibraryView:双击下钻文件夹/项目,面包屑+返回跳级,项目内文件同网格,
  双击进 FileEditor 预览;工具条按上下文出新建文件夹/项目/文件
- 右键菜单(ContextMenu):打开/新建子文件夹/重命名/授权管理/详情/删除,
  按节点 role 动态显隐;文件菜单:打开预览/下载/删除;空白处右键出新建+刷新
- GridCard 大图标卡片(琥珀文件夹/立方体项目/文档文件);授权与详情复用
  GrantsPanel/OverviewPanel(Modal 加 maxW prop);Icon 补 5 个图标
- 管理后台 /database 保留树状 LibraryView 不动;后端零改动
- 回收站:listBin(祖先全活跃的已删顶点;管理员/直连 MANAGE 可见)、
  restore(与 D15 对称只清本节点,落审计)、purge(仅管理员,pathIds 枚举
  子树按深度降序分批硬删,绕过 self-FK RESTRICT)
- 最近打开:FileLibRecentVisit 表(filePath='' 兜底 PG 唯一索引),客户端
  成功打开后上报(VIEW 门禁,upsert 刷新),列表 20 条,D8/D15 可见性过滤
- 前端:/app 左栏(文件库/最近打开/回收站);RecentView/BinView;
  GridLibraryView 埋点 + navTarget 跳转(breadcrumb 建栈,role 已捎带)
- 测试:filelib-nav 集成 4 例;全套 79 例绿
- FileLibRecentVisit 删表(手写迁移;表当日新建无生产数据)
- recentService/recentRoutes/RecentView 删除;GridLibraryView 埋点与
  navTarget 跳转一并移除;types 清 RecentEntry
- 左栏保留 文件库/回收站(ADR-0031 回收站半部不受影响)
- breadcrumb 的 role 字段保留(独立可用的增量字段)
- restore 前查活跃兄弟:撞名则恢复为「原名(已恢复[/ N])」(截断计入
  128 长度预算),同事务落审计并记 renamedFrom;API 返回最终名
- BinView toast 提示改名;测试补撞名/二次恢复用例
能删进回收站(MANAGE)的人就能清空;无关者 404(D8)。二次确认与
node.purge 审计不变;BinView 彻底删除按钮对全部可见条目开放。
恢复不再改名;同名兄弟占位时抛 409 name_conflict_on_restore + 人话提示,
操作者自行重命名现有节点或彻底删除旧节点后再恢复。
Owner

Merged

Merged
bai closed this pull request 2026-08-06 00:54:59 +08:00

Pull request closed

Sign in to join this conversation.
No Reviewers
No Label
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: bai/curriculum-project-hub#2