Skip to content

Commit dde69e1

Browse files
authored
fix: UI permissions (#7082)
1 parent 8bc6798 commit dde69e1

3 files changed

Lines changed: 61 additions & 49 deletions

File tree

‎apps/common/auth/constants/permission_constants.py‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,12 +92,12 @@ class PermissionConstants(Enum):
9292

9393
SYSTEM_HOMEPAGE_READ = (
9494
Permission(group=Group.HOMEPAGE, sub_group=Group.HOMEPAGE, operate=Operate.READ, bit_index=0),
95-
PermissionMeta(role_list=[RoleConstants.ADMIN], category=Category.IAM),
95+
PermissionMeta(role_list=[RoleConstants.ADMIN], category=Category.IAM, scope=[PermissionScopeConstants.SYSTEM]),
9696
)
9797

9898
SYSTEM_HOMEPAGE_EXPORT = (
9999
Permission(group=Group.HOMEPAGE, sub_group=Group.HOMEPAGE, operate=Operate.EXPORT, bit_index=1),
100-
PermissionMeta(role_list=[RoleConstants.ADMIN], category=Category.IAM),
100+
PermissionMeta(role_list=[RoleConstants.ADMIN], category=Category.IAM, scope=[PermissionScopeConstants.SYSTEM]),
101101
)
102102

103103
# ==================== 资源主分组(无子分组) ====================

‎ui/src/layout/sidebar/SystemSidebar.vue‎

Lines changed: 53 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -18,40 +18,36 @@ const getSystemMenuIcon = (systemMenuItem: LayoutMenuItem) => (isSystemMenuActiv
1818
<template>
1919
<div class="mk-system-sidebar flex h-full flex-col">
2020
<el-scrollbar class="min-h-0 flex-1">
21-
<el-menu
22-
class="mt-2!"
23-
:class="props.collapsed ? 'px-3.5!' : 'px-4!'"
24-
:collapse="props.collapsed"
25-
:collapse-transition="false"
26-
:default-active="route.path"
27-
router
28-
:persistent="false"
29-
>
30-
<template v-for="item in systemMenuItems" :key="item.name" >
31-
<template v-if="item.permission? item.permission():true">
32-
<!-- 有子菜单 -->
33-
<el-sub-menu v-if="item.children?.length && item.route" :index="router.resolve(item.route).path" popper-class="mk-system-sidebar-menu-popper">
34-
<template #title>
21+
<el-menu class="mt-2!" :class="props.collapsed ? 'px-3.5!' : 'px-4!'" :collapse="props.collapsed"
22+
:collapse-transition="false" :default-active="route.path" router :persistent="false">
23+
<template v-for="item in systemMenuItems" :key="item.name">
24+
<template v-if="item.permission ? item.permission() : true">
25+
<!-- 有子菜单 -->
26+
<el-sub-menu v-if="item.children?.length && item.route" :index="router.resolve(item.route).path"
27+
popper-class="mk-system-sidebar-menu-popper">
28+
<template #title>
29+
<MkIcon v-if="item.icon" :name="getSystemMenuIcon(item)" :size="18" />
30+
<span>{{ item.label }}</span>
31+
</template>
32+
<el-menu-item-group>
33+
<template #title v-if="props.collapsed"><span>{{ item.label }}</span></template>
34+
<template v-for="child in item.children" :key="child.name">
35+
<template v-if="child.permission ? child.permission() : true">
36+
<el-menu-item :index="child.route ? router.resolve(child.route).path : child.name">
37+
{{ child.label }}
38+
</el-menu-item>
39+
</template>
40+
</template>
41+
</el-menu-item-group>
42+
</el-sub-menu>
43+
<!-- 无子菜单 -->
44+
<el-menu-item v-else :index="item.route ? router.resolve(item.route).path : item.name">
3545
<MkIcon v-if="item.icon" :name="getSystemMenuIcon(item)" :size="18" />
36-
<span>{{ item.label }}</span>
37-
</template>
38-
<el-menu-item-group>
39-
<template #title v-if="props.collapsed"
40-
><span>{{ item.label }}</span></template
41-
>
42-
<el-menu-item v-for="child in item.children" :key="child.name" :index="child.route ? router.resolve(child.route).path : child.name">
43-
{{ child.label }}
44-
</el-menu-item>
45-
</el-menu-item-group>
46-
</el-sub-menu>
47-
<!-- 无子菜单 -->
48-
<el-menu-item v-else :index="item.route ? router.resolve(item.route).path : item.name">
49-
<MkIcon v-if="item.icon" :name="getSystemMenuIcon(item)" :size="18" />
50-
<template #title>{{ item.label }}</template>
51-
</el-menu-item>
46+
<template #title>{{ item.label }}</template>
47+
</el-menu-item>
5248

5349
</template>
54-
50+
5551
</template>
5652
</el-menu>
5753
</el-scrollbar>
@@ -61,21 +57,20 @@ const getSystemMenuIcon = (systemMenuItem: LayoutMenuItem) => (isSystemMenuActiv
6157
</div>
6258
<!-- 收起导航按钮 -->
6359
<div :class="props.collapsed ? 'px-3.5' : 'px-4'" class="py-2">
64-
<button
65-
type="button"
66-
:class="props.collapsed ? 'p-2.75' : 'px-2 p-2.75'"
60+
<button type="button" :class="props.collapsed ? 'p-2.75' : 'px-2 p-2.75'"
6761
class="mk-system-sidebar-toggle flex w-full cursor-pointer items-center gap-2 rounded-md"
68-
@click="emit('toggle')"
69-
>
62+
@click="emit('toggle')">
7063
<MkIcon name="icon_side-fold_outlined" :size="18" :class="props.collapsed && 'rotate-180'" />
71-
<span class="whitespace-nowrap transition-opacity duration-100" :class="props.collapsed ? 'opacity-0' : 'delay-200 opacity-100'"> 收起导航 </span>
64+
<span class="whitespace-nowrap transition-opacity duration-100"
65+
:class="props.collapsed ? 'opacity-0' : 'delay-200 opacity-100'"> 收起导航 </span>
7266
</button>
7367
</div>
7468
</div>
7569
</template>
7670
<style lang="scss">
7771
.mk-system-sidebar,
7872
.mk-system-sidebar-menu-popper {
73+
7974
/* menu */
8075
.el-menu {
8176
background: none !important;
@@ -87,24 +82,29 @@ const getSystemMenuIcon = (systemMenuItem: LayoutMenuItem) => (isSystemMenuActiv
8782
gap: calc(var(--spacing) * 1);
8883
}
8984
}
85+
9086
.el-menu-item {
9187
border-radius: var(--el-border-radius-base);
9288
color: var(--el-text-color-primary);
9389
height: auto;
9490
line-height: 18px;
9591
padding: 11px calc(var(--spacing) * 2) !important;
92+
9693
[class^='el-icon'] {
9794
margin-right: calc(var(--spacing) * 2);
9895
}
96+
9997
&:hover {
10098
background-color: var(--mk-N900-transparent-10);
10199
}
100+
102101
&.is-active {
103102
background-color: white;
104103
color: var(--mk-primary);
105104
font-weight: 500;
106105
}
107106
}
107+
108108
// 子菜单
109109
.el-sub-menu {
110110
display: flex;
@@ -117,53 +117,62 @@ const getSystemMenuIcon = (systemMenuItem: LayoutMenuItem) => (isSystemMenuActiv
117117
height: auto;
118118
line-height: 18px;
119119
padding: 11px calc(var(--spacing) * 2) !important;
120+
120121
&:hover {
121122
background-color: var(--mk-N900-transparent-10);
122123
}
123124
}
125+
124126
.el-icon {
125127
margin-right: calc(var(--spacing) * 2);
126128
width: auto;
127129
}
130+
128131
.el-menu-item {
129132
height: auto;
130133
line-height: 18px;
131134
padding: 11px calc(var(--spacing) * 2) !important;
132135
padding-left: 34px !important;
133136
}
137+
134138
.el-sub-menu__icon-arrow {
135139
font-size: 16px;
136140
margin-top: calc(var(--spacing) * -2);
137141
right: 0;
138142
}
139143
}
144+
140145
.el-menu-item-group {
141-
> ul {
146+
>ul {
142147
display: flex;
143148
flex-direction: column;
144149
gap: calc(var(--spacing) * 1);
145150
}
151+
146152
&__title {
147153
padding: 9px calc(var(--spacing) * 4) !important;
148154
font-size: var(--mk-font-size-base);
149155
color: var(--el-text-color-regular);
150156
}
151157
}
158+
152159
// 菜单收起
153160
.el-menu--collapse {
154-
> .el-menu-item {
161+
>.el-menu-item {
155162
min-height: calc(var(--spacing) * 10);
163+
156164
.el-menu-tooltip__trigger {
157165
padding: 11px !important;
158166
}
159167
}
160168
161-
> .el-sub-menu {
162-
> .el-sub-menu__title {
169+
>.el-sub-menu {
170+
>.el-sub-menu__title {
163171
min-height: calc(var(--spacing) * 10);
164172
padding: 11px !important;
165173
}
166-
&.is-active > .el-sub-menu__title {
174+
175+
&.is-active>.el-sub-menu__title {
167176
background-color: white;
168177
}
169178
}
@@ -180,10 +189,12 @@ const getSystemMenuIcon = (systemMenuItem: LayoutMenuItem) => (isSystemMenuActiv
180189
background-color: var(--mk-N200);
181190
background-image: rgb(var(--mk-primary-rgb) / 5%);
182191
border-radius: var(--el-border-radius-base);
192+
183193
.el-menu {
184194
padding: calc(var(--spacing) * 2);
185195
border-radius: var(--el-border-radius-base);
186196
}
197+
187198
.el-menu-item {
188199
padding: 9px calc(var(--spacing) * 4) !important;
189200
}

‎ui/src/permission/core/common.ts‎

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -236,10 +236,11 @@ export class Permission {
236236

237237
/** 非资源权限 key,对应后端 `Permission.__str__`。 */
238238
toString(): string {
239-
const sub = this.subGroup !== this.group ? `_${this.subGroup}` : ''
240-
const flag = this.flag ? `_${this.flag}` : ''
241-
return `${this.group}${sub}_${this.operate}${flag}`
242-
}
239+
const sub = this.subGroup !== this.group ? `_${this.subGroup}` : ''
240+
const flag = this.flag ? `_${this.flag}` : ''
241+
const operate = this.operate ? `:${this.operate}` : ''
242+
return `${this.group}${sub}${operate}${flag}`
243+
}
243244

244245
/** 资源级权限 key,对应后端 `Permission.get_resource_permission_key`。 */
245246
getResourcePermissionKey(): string {
@@ -250,7 +251,7 @@ export class Permission {
250251

251252
/** 判定时使用的最终 key,对应后端 `AggregatePermission._match_permission`。 */
252253
toPermissionKey(): string {
253-
return this.resourceId ? this.getResourcePermissionKey() : this.toString()
254+
return this.resourceId ? this.getResourcePermissionKey() : this.group
254255
}
255256

256257
/** 基于上下文派生出带 workspace / resource 的权限副本。 */

0 commit comments

Comments
 (0)