feat(system): 实现RuoYi风格的RBAC管理页面

新增系统资源工具函数库,包含树形结构构建、树过滤和数据范围中文标签转换;重构系统资源编辑器组件,改用树形选择器优化权限配置并新增表单验证;重构系统管理页面布局,统一使用RuoYi风格样式,新增多维度筛选搜索功能,优化各资源表格展示;新增用户密码重置功能,移除过时的useSystemResource钩子并更新测试用例。
This commit is contained in:
duanshuwen committed 2026-08-26 23:46:41 +08:00
1 parent 994d07cfca
commit f087663b5b
5 files changed
+350 -52

No files matched your search

@@ -1,9 +1,50 @@
import { ref, watch, type Ref } from "vue";
import { getSystemResource } from "@/api/client";
import type { SystemRoleItem } from "@/types";
export type SystemResourceResponse = { items: unknown[] };
export type SystemResourceFetcher = (resource: string) => Promise<SystemResourceResponse>;
type TreeSource = {
id: string;
name: string;
parentId?: string | null;
sortOrder?: number;
};
export type SystemTreeNode<T extends TreeSource> = T & { children: Array<SystemTreeNode<T>> };
export function buildSystemTree<T extends TreeSource>(items: T[]): Array<SystemTreeNode<T>> {
const nodes = new Map(items.map((item) => [item.id, { ...item, children: [] as Array<SystemTreeNode<T>> }]));
const roots: Array<SystemTreeNode<T>> = [];
const ordered = [...nodes.values()].sort((left, right) => (left.sortOrder ?? 0) - (right.sortOrder ?? 0) || left.name.localeCompare(right.name));
for (const node of ordered) {
if (node.parentId && nodes.has(node.parentId)) nodes.get(node.parentId)!.children.push(node);
else roots.push(node);
}
return roots;
}
export function filterSystemTree<T extends TreeSource>(nodes: Array<SystemTreeNode<T>>, keyword: string): Array<SystemTreeNode<T>> {
const normalized = keyword.trim().toLowerCase();
if (!normalized) return nodes;
return nodes.reduce<Array<SystemTreeNode<T>>>((result, node) => {
const children = filterSystemTree(node.children, normalized);
if (node.name.toLowerCase().includes(normalized) || children.length) result.push({ ...node, children });
return result;
}, []);
}
export function dataScopeLabel(scope: SystemRoleItem["dataScope"] | string): string {
return {
all: "全部数据",
dept: "本部门数据",
dept_and_children: "本部门及以下",
custom_dept: "自定义数据",
self: "本人数据",
}[scope] ?? scope;
}
function errorMessage(error: unknown) {
return error instanceof Error ? error.message : "系统数据加载失败";
}