fix(tree): 修复左侧树滚动条失效与叶子节点误显 +/−,统一权限一览连接线
build / build (push) Successful in 3m27s

滚动条(上次改动引入的回归):
- MyTree 根节点加 .my-tree 类并打通高度链(flex 纵向 + .ztree 承担滚动),
  父级定高时滚动条只落在树节点区域;父级 auto 的卡片内树行为不变
- GroupTreeSearchPanel 的 .tree-body 改 flex 纵向传递高度,删除已失效的 .ztree 规则

叶子节点 +/−(以组用户管理左侧树为参考统一):
- zTree 只要 children 是数组即强制 isParent=true,故空数组必须不挂键;
  修正 GroupAuth / AppModuleCheckTree / PermissionView 共 9 处节点构造
- MyTree 初始化前加节点规范化兜底,防止后续新增树重犯
- removeNode 删除末个子节点后同步父节点父/叶状态,不再残留 +/−

权限一览:
- 删除 li{line-height:26px} 覆盖(zTree 图标按 21px 节距,26px 会让连接线出现断口)
- 左列改用页面级 permission-tree 类:flex 纵向 + overflow:hidden,
  消除整列滚动与外层裁切,滚动收敛到树体
This commit is contained in:
chenxing
2026-09-16 17:46:06 +08:00
parent af94e1d2cb
commit a082e59c3e
6 changed files with 135 additions and 69 deletions
+13 -5
View File
@@ -68,6 +68,7 @@ type AuthzTreeNode = {
nodeType: "app" | "module";
rawId: number;
appId: number;
isParent?: boolean;
children?: AuthzTreeNode[];
};
type CategoryTreeItem = { cat: CategoryItem; treeData: AuthzTreeNode[]; weight: number };
@@ -115,8 +116,10 @@ function isModuleAllChecked(node: AppModuleVo): boolean {
if (!node.checked) return false;
return (node.children || []).every((c) => isModuleAllChecked(c));
}
// 空 children 不挂键:zTree 只要见到 children 是数组就强制 isParent=true 而渲染 +/−(叶子也会出现展开图标)
function buildModuleNode(m: AppModuleVo, appId: number): AuthzTreeNode {
return {
const kids = (m.children || []).map((c) => buildModuleNode(c, appId));
const node: AuthzTreeNode = {
id: `mod_${m.id}`,
name: String(m.name || ""),
open: true,
@@ -124,21 +127,26 @@ function buildModuleNode(m: AppModuleVo, appId: number): AuthzTreeNode {
nodeType: "module",
rawId: Number(m.id),
appId,
children: (m.children || []).map((c) => buildModuleNode(c, appId)),
isParent: kids.length > 0,
};
if (kids.length > 0) node.children = kids;
return node;
}
function buildAppNode(app: AppItem): AuthzTreeNode {
const appId = Number(app.id);
return {
const kids = (app.modules || []).map((m) => buildModuleNode(m, appId));
const node: AuthzTreeNode = {
id: `app_${appId}`,
name: String(app.name || ""),
open: false, // 一级默认闭合,点击才展开模块
open: false,
checked: isAppChecked(app),
nodeType: "app",
rawId: appId,
appId,
children: (app.modules || []).map((m) => buildModuleNode(m, appId)),
isParent: kids.length > 0,
};
if (kids.length > 0) node.children = kids;
return node;
}
// ---------------- 数据加载 ----------------