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,25 +1,29 @@
import { nextTick, ref } from "vue";
import { describe, expect, it } from "vitest";
import { useSystemResource } from "./system-resource";
import { buildSystemTree, dataScopeLabel, filterSystemTree } from "@/lib/system-resource";
describe("system resource loader", () => {
it("reloads records when the route resource changes", async () => {
const resource = ref("users");
const requestedResources: string[] = [];
const state = useSystemResource(resource, async (name) => {
requestedResources.push(name);
return { items: [name] };
});
describe("system resource tree helpers", () => {
const items = [
{ id: "root", name: "系统管理", parentId: null, sortOrder: 10 },
{ id: "child", name: "用户管理", parentId: "root", sortOrder: 20 },
{ id: "other", name: "首页", parentId: null, sortOrder: 5 },
];
await nextTick();
await Promise.resolve();
expect(requestedResources).toEqual(["users"]);
expect(state.items.value).toEqual(["users"]);
it("builds a stable parent-child tree ordered by sort", () => {
expect(buildSystemTree(items)).toEqual([
{ ...items[2], children: [] },
{ ...items[0], children: [{ ...items[1], children: [] }] },
]);
});
resource.value = "roles";
await nextTick();
await Promise.resolve();
expect(requestedResources).toEqual(["users", "roles"]);
expect(state.items.value).toEqual(["roles"]);
it("keeps matching ancestors when filtering a tree", () => {
expect(filterSystemTree(buildSystemTree(items), "用户")).toEqual([
{ ...items[0], children: [{ ...items[1], children: [] }] },
]);
});
it("uses RuoYi-compatible Chinese labels for data scope", () => {
expect(dataScopeLabel("all")).toBe("全部数据");
expect(dataScopeLabel("dept_and_children")).toBe("本部门及以下");
expect(dataScopeLabel("custom_dept")).toBe("自定义数据");
});
});