修改后台菜单逻辑,默认显示用户全部可见菜单
This commit is contained in:
@@ -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,
|
||||||
|
|||||||
+1
-1
File diff suppressed because one or more lines are too long
Vendored
+36
-36
@@ -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));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user