修改后台菜单逻辑,默认显示用户全部可见菜单

This commit is contained in:
2026-06-26 09:09:33 +08:00
parent 9f8aca5f0d
commit 4efb360b93
4 changed files with 80 additions and 41 deletions
+28 -1
View File
@@ -25,7 +25,34 @@ async def public_list_menu_configs(
) )
.order_by(MenuConfig.sort_order) .order_by(MenuConfig.sort_order)
) )
menus = result.scalars().all() 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)
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]
return [ return [
{ {
"id": m.id, "label": m.label, "path": m.path, "icon": m.icon, "id": m.id, "label": m.label, "path": m.path, "icon": m.icon,
File diff suppressed because one or more lines are too long
+36 -36
View File
@@ -1,37 +1,37 @@
<!doctype html> <!doctype html>
<html lang="zh-CN"> <html lang="zh-CN">
<head> <head>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" /> <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="preconnect" href="https://fonts.googleapis.com" /> <link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin /> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link href="https://fonts.googleapis.com/css2?family=Outfit:wght@300;400;500;600;700&display=swap" rel="stylesheet" /> <link href="https://fonts.googleapis.com/css2?family=Outfit:wght@300;400;500;600;700&display=swap" rel="stylesheet" />
<title>民众智创</title> <title>民众智创</title>
<script> <script>
(function() { (function() {
var cached = localStorage.getItem('siteInfo'); var cached = localStorage.getItem('siteInfo');
if (cached) { if (cached) {
try { try {
var info = JSON.parse(cached); var info = JSON.parse(cached);
if (info.siteName) { if (info.siteName) {
document.title = info.siteName; document.title = info.siteName;
} }
if (info.siteLogo) { if (info.siteLogo) {
var link = document.querySelector('link[rel="icon"]'); var link = document.querySelector('link[rel="icon"]');
if (link) { if (link) {
link.href = info.siteLogo; link.href = info.siteLogo;
link.type = 'image/png'; link.type = 'image/png';
} }
} }
} catch (e) {} } catch (e) {}
} }
})(); })();
</script> </script>
<script type="module" crossorigin src="/assets/index-C1Aswo8N.js"></script> <script type="module" crossorigin src="/assets/index-CV-32V7M.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-eLRg4pQk.css"> <link rel="stylesheet" crossorigin href="/assets/index-eLRg4pQk.css">
</head> </head>
<body> <body>
<div id="root"></div> <div id="root"></div>
</body> </body>
</html> </html>
@@ -485,8 +485,16 @@ const AppLayout: React.FC = () => {
}; };
// Render groups with children // Render groups with children
groups.sort((a, b) => (a.sortOrder ?? 0) - (b.sortOrder ?? 0)).forEach(g => { groups.sort((a, b) => {
const children = (childMap[g.id] || []).sort((a, b) => (a.sortOrder ?? 0) - (b.sortOrder ?? 0)); const orderA = a.sortOrder !== undefined ? a.sortOrder : Infinity;
const orderB = b.sortOrder !== undefined ? 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;
return orderA - orderB;
});
items.push( items.push(
<div key={g.id}> <div key={g.id}>
<div style={{ <div style={{
@@ -501,7 +509,11 @@ const AppLayout: React.FC = () => {
}); });
// Render top-level pages // Render top-level pages
topLevel.sort((a, b) => (a.sortOrder ?? 0) - (b.sortOrder ?? 0)).forEach(m => { topLevel.sort((a, b) => {
const orderA = a.sortOrder !== undefined ? a.sortOrder : Infinity;
const orderB = b.sortOrder !== undefined ? b.sortOrder : Infinity;
return orderA - orderB;
}).forEach(m => {
items.push(renderMenuItem(m)); items.push(renderMenuItem(m));
}); });