This commit is contained in:
2026-06-26 09:20:50 +08:00
parent 4efb360b93
commit 6fcc3f8a0c
4 changed files with 26 additions and 45 deletions
+17 -22
View File
@@ -28,30 +28,25 @@ async def public_list_menu_configs(
all_menus = result.scalars().all()
# Filter menus based on user permissions
# If user has allowed_menus set, show only those menus
# Otherwise, show all default menus (is_default=True)
# Show default menus + user-specific allowed menus (merged)
user_allowed_paths = set(current_user.allowed_menus or [])
if user_allowed_paths:
# User has explicit menu permissions - show only allowed menus
allowed_ids = set()
for menu in all_menus:
if menu.path in user_allowed_paths:
allowed_ids.add(menu.id)
if menu.parent_id:
allowed_ids.add(menu.parent_id)
menus = [m for m in all_menus if m.id in allowed_ids]
else:
# No explicit permissions - show default menus
default_ids = set()
for menu in all_menus:
if menu.is_default:
default_ids.add(menu.id)
if menu.parent_id:
default_ids.add(menu.parent_id)
menus = [m for m in all_menus if m.id in default_ids]
# Start with default menus
allowed_ids = set()
for menu in all_menus:
if menu.is_default:
allowed_ids.add(menu.id)
if menu.parent_id:
allowed_ids.add(menu.parent_id)
# Add user-specific allowed menus (merge with defaults)
for menu in all_menus:
if menu.path in user_allowed_paths:
allowed_ids.add(menu.id)
if menu.parent_id:
allowed_ids.add(menu.parent_id)
menus = [m for m in all_menus if m.id in allowed_ids]
return [
{
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -28,7 +28,7 @@
}
})();
</script>
<script type="module" crossorigin src="/assets/index-CV-32V7M.js"></script>
<script type="module" crossorigin src="/assets/index-COnmuf9j.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-eLRg4pQk.css">
</head>
<body>
@@ -258,21 +258,7 @@ const AppLayout: React.FC = () => {
useEffect(() => {
getMenuConfigs().then(data => {
let items = data.filter((m: any) => m.is_active !== false && m.isActive !== false);
// Filter by user's allowed menus if set
if (user?.allowedMenus && user.allowedMenus.length > 0) {
const allowed = new Set(user.allowedMenus);
const groupIds = new Set<string>();
items.forEach((m: any) => {
const pid = m.parent_id ?? m.parentId;
if (pid && allowed.has(m.path)) groupIds.add(pid);
});
items = items.filter((m: any) => {
const mt = m.menu_type ?? m.menuType;
if (mt === 'group' && groupIds.has(m.id)) return true;
return allowed.has(m.path);
});
}
const items = data.filter((m: any) => m.is_active !== false && m.isActive !== false);
setMenuItems(items);
}).catch(() => { });
getRechargePackages().then(data => {
@@ -486,13 +472,13 @@ const AppLayout: React.FC = () => {
// Render groups with children
groups.sort((a, b) => {
const orderA = a.sortOrder !== undefined ? a.sortOrder : Infinity;
const orderB = b.sortOrder !== undefined ? b.sortOrder : Infinity;
const orderA = typeof a.sortOrder === 'number' ? a.sortOrder : Infinity;
const orderB = typeof b.sortOrder === 'number' ? b.sortOrder : Infinity;
return orderA - orderB;
}).forEach(g => {
const children = (childMap[g.id] || []).sort((a, b) => {
const orderA = a.sortOrder !== undefined ? a.sortOrder : Infinity;
const orderB = b.sortOrder !== undefined ? b.sortOrder : Infinity;
const orderA = typeof a.sortOrder === 'number' ? a.sortOrder : Infinity;
const orderB = typeof b.sortOrder === 'number' ? b.sortOrder : Infinity;
return orderA - orderB;
});
items.push(
@@ -510,8 +496,8 @@ const AppLayout: React.FC = () => {
// Render top-level pages
topLevel.sort((a, b) => {
const orderA = a.sortOrder !== undefined ? a.sortOrder : Infinity;
const orderB = b.sortOrder !== undefined ? b.sortOrder : Infinity;
const orderA = typeof a.sortOrder === 'number' ? a.sortOrder : Infinity;
const orderB = typeof b.sortOrder === 'number' ? b.sortOrder : Infinity;
return orderA - orderB;
}).forEach(m => {
items.push(renderMenuItem(m));