背景:角色权限只描述模块的一部分能力,侧栏同级均为模块级命名(用户与组织 / 客户 / 行业树);角色页实际覆盖角色 CRUD、权限点、数据范围、特殊权限与 SoD。 改动: - 侧栏、面包屑、页面标题统一为「角色管理」,页面内权限点 / 数据范围 / 特殊权限分区名不变; - 用户详情与超管授予弹窗中的模块引用同步改为「角色管理」; - 开发计划页面清单与 A2 实施报告同步; - 更新导航与面包屑单测、A2 e2e 标题断言。 验证:format:check / lint / typecheck / test 全绿;5173 实测侧栏、面包屑、页标题均为「角色管理」。
This commit is contained in:
1 parent
a3419cf5da
commit
f5a8afe835
11 files changed
+16
-16
No files matched your search
@@ -3,12 +3,12 @@ import { describe, expect, it } from 'vitest';
|
||||
import { getRoleSectionTrail, getUserSectionTrail } from './breadcrumbs';
|
||||
|
||||
describe('面包屑子路由补全', () => {
|
||||
it('角色新建页:工作台 / 管理中心 / 角色权限 / 新建角色', () => {
|
||||
it('角色新建页:工作台 / 管理中心 / 角色管理 / 新建角色', () => {
|
||||
const trail = getRoleSectionTrail('/system/roles/new');
|
||||
expect(trail?.map((entry) => entry.label)).toEqual([
|
||||
'工作台',
|
||||
'管理中心',
|
||||
'角色权限',
|
||||
'角色管理',
|
||||
'新建角色',
|
||||
]);
|
||||
expect(trail?.[2]?.path).toBe('/system/roles');
|
||||
@@ -19,7 +19,7 @@ describe('面包屑子路由补全', () => {
|
||||
expect(trail?.map((entry) => entry.label)).toEqual([
|
||||
'工作台',
|
||||
'管理中心',
|
||||
'角色权限',
|
||||
'角色管理',
|
||||
'角色编辑',
|
||||
]);
|
||||
});
|
||||
|
||||
@@ -8,7 +8,7 @@ export function getRoleSectionTrail(pathname: string): BreadcrumbEntry[] | null
|
||||
return [
|
||||
{ key: 'home', label: '工作台', path: ROUTES.home },
|
||||
{ key: 'system', label: '管理中心' },
|
||||
{ key: 'roles', label: '角色权限', path: ROUTES.system.roles },
|
||||
{ key: 'roles', label: '角色管理', path: ROUTES.system.roles },
|
||||
{ key: 'role-new', label: '新建角色' },
|
||||
];
|
||||
}
|
||||
@@ -16,7 +16,7 @@ export function getRoleSectionTrail(pathname: string): BreadcrumbEntry[] | null
|
||||
return [
|
||||
{ key: 'home', label: '工作台', path: ROUTES.home },
|
||||
{ key: 'system', label: '管理中心' },
|
||||
{ key: 'roles', label: '角色权限', path: ROUTES.system.roles },
|
||||
{ key: 'roles', label: '角色管理', path: ROUTES.system.roles },
|
||||
{ key: 'role-detail', label: '角色编辑' },
|
||||
];
|
||||
}
|
||||
|
||||
@@ -33,12 +33,12 @@ describe('导航配置', () => {
|
||||
);
|
||||
});
|
||||
|
||||
it('角色权限菜单使用 role:view,只读角色也能进入角色页', () => {
|
||||
it('角色管理菜单使用 role:view,只读角色也能进入角色页', () => {
|
||||
const rolesItem = NAV_MODULES.find((module) => module.key === 'system')?.items.find(
|
||||
(item) => item.key === 'roles',
|
||||
);
|
||||
expect(rolesItem?.permission).toBe('role:view');
|
||||
expect(findActiveNav(NAV_MODULES, '/system/roles/new')?.item?.label).toBe('角色权限');
|
||||
expect(findActiveNav(NAV_MODULES, '/system/roles/new')?.item?.label).toBe('角色管理');
|
||||
expect(findActiveNav(NAV_MODULES, '/system/roles/01HZZZZZZZZZZZZZZZZZZZZZZZ')?.module.key).toBe(
|
||||
'system',
|
||||
);
|
||||
|
||||
@@ -256,7 +256,7 @@ export const NAV_MODULES: readonly NavModule[] = [
|
||||
},
|
||||
{
|
||||
key: 'roles',
|
||||
label: '角色权限',
|
||||
label: '角色管理',
|
||||
path: '/system/roles',
|
||||
icon: IconShield,
|
||||
permission: Permission.ROLE_VIEW,
|
||||
|
||||
@@ -170,7 +170,7 @@ export function RolesPage(): ReactNode {
|
||||
<div className="lx-roles">
|
||||
<header className="lx-roles__header">
|
||||
<div className="lx-roles__head-txt">
|
||||
<h1>角色权限</h1>
|
||||
<h1>角色管理</h1>
|
||||
<p>配置功能权限、数据范围与特殊权限,变更即时生效并留痕</p>
|
||||
</div>
|
||||
<div className="lx-roles__header-actions">
|
||||
|
||||
@@ -93,7 +93,7 @@ export function UserRolesTab({
|
||||
<div className="lx-detail-tab">
|
||||
<SectionHead
|
||||
title="已绑定角色"
|
||||
hint="角色决定成员可访问的模块与操作;权限点由「角色权限」统一维护。"
|
||||
hint="角色决定成员可访问的模块与操作;权限点由「角色管理」统一维护。"
|
||||
action={
|
||||
canManage ? (
|
||||
<Button
|
||||
|
||||
@@ -29,7 +29,7 @@ export function SuperAdminGrantDialog({
|
||||
consequences={[
|
||||
'超级管理员拥有全部模块权限与全部客户数据范围',
|
||||
'授予即时生效并写入审计;建议全平台超级管理员不超过 2 人',
|
||||
'如需收回,请在「角色权限」中移除该角色',
|
||||
'如需收回,请在「角色管理」中移除该角色',
|
||||
]}
|
||||
acknowledgeLabel="我已确认授权范围,并同意授予超级管理员"
|
||||
confirmText="确认授予"
|
||||
|
||||
Reference in new issue
Block a user