2026-01-27 15:21:02 +08:00
|
|
|
|
// import Logo from '@/assets/bitcoin.webp';
|
2025-06-27 16:42:11 +08:00
|
|
|
|
import { MyIcons, MyIconsType, PermissionsType, useMyState } from '@/common';
|
|
|
|
|
|
import { Link, RuntimeConfig, history } from '@umijs/max';
|
|
|
|
|
|
import AvatarProps from '../../components/layout/AvatarProps';
|
2026-03-30 14:56:14 +08:00
|
|
|
|
import { CustomHeader, CustomLogo } from '@/common/components/layout';
|
2025-06-27 16:42:11 +08:00
|
|
|
|
|
|
|
|
|
|
const loopMenu = (permissions: PermissionsType[] | undefined) => {
|
|
|
|
|
|
let tree: PermissionsType[] = [];
|
|
|
|
|
|
let map: Record<number, PermissionsType> = {};
|
|
|
|
|
|
permissions?.forEach((permission) => {
|
|
|
|
|
|
map[permission.id] = {
|
|
|
|
|
|
path: permission.type === 'Button' ? 'null' : permission.path,
|
|
|
|
|
|
name: permission.name,
|
|
|
|
|
|
icon: permission.icon && MyIcons[permission.icon as MyIconsType],
|
|
|
|
|
|
children: [],
|
|
|
|
|
|
hideInMenu: permission.type === 'Button',
|
|
|
|
|
|
};
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
permissions?.forEach((permission) => {
|
|
|
|
|
|
let node = map[permission.id];
|
|
|
|
|
|
if (permission.parent_id !== null) {
|
|
|
|
|
|
map[permission.parent_id].children.push(node);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
tree.push(node);
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
return tree?.[0]?.children;
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
export const LayoutConfig: RuntimeConfig['layout'] = () => {
|
|
|
|
|
|
const { snap } = useMyState();
|
|
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
|
title: snap.session.campus?.name ?? '总后台',
|
2026-03-30 14:51:25 +08:00
|
|
|
|
logo: false, // 禁用默认logo,使用自定义
|
|
|
|
|
|
layout: 'side', // 从 'mix' 改为 'side'
|
2025-06-27 16:42:11 +08:00
|
|
|
|
colorPrimary: '#1890ff',
|
|
|
|
|
|
siderWidth: 220,
|
|
|
|
|
|
pure: history.location.pathname === '/login',
|
2026-03-30 16:00:31 +08:00
|
|
|
|
// 禁用顶部导航栏的菜单
|
|
|
|
|
|
navTheme: 'light',
|
2026-03-30 16:03:05 +08:00
|
|
|
|
// 确保header显示
|
|
|
|
|
|
header: true,
|
2026-03-30 14:56:14 +08:00
|
|
|
|
|
2026-03-30 16:53:18 +08:00
|
|
|
|
// 自定义Header渲染 - 使用UmiJS自带header并添加用户信息
|
|
|
|
|
|
headerRender: (props, defaultDom) => {
|
|
|
|
|
|
return (
|
|
|
|
|
|
<div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', paddingRight: 24 }}>
|
|
|
|
|
|
{/* 左侧保留默认内容 */}
|
|
|
|
|
|
<div style={{ flex: 1 }}>
|
|
|
|
|
|
{defaultDom}
|
|
|
|
|
|
</div>
|
|
|
|
|
|
{/* 右侧添加用户信息 */}
|
|
|
|
|
|
<div>
|
|
|
|
|
|
<AvatarProps user={snap.session.user} />
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
);
|
|
|
|
|
|
},
|
2026-03-30 14:56:14 +08:00
|
|
|
|
|
|
|
|
|
|
// 新增:自定义Logo渲染
|
|
|
|
|
|
logoRenderer: (collapsed: boolean) => {
|
|
|
|
|
|
return <CustomLogo collapsed={collapsed} />;
|
|
|
|
|
|
},
|
|
|
|
|
|
|
2026-03-30 16:00:31 +08:00
|
|
|
|
// 完全禁用用户信息在侧边栏底部显示
|
|
|
|
|
|
// avatarProps: false, // 这样可以完全禁用
|
2025-10-10 17:55:46 +08:00
|
|
|
|
//水印设置
|
|
|
|
|
|
// waterMarkProps: {
|
|
|
|
|
|
// content: snap.session.user?.username,
|
|
|
|
|
|
// },
|
2025-06-27 16:42:11 +08:00
|
|
|
|
collapsedButtonRender: false,
|
2026-03-30 16:00:31 +08:00
|
|
|
|
// 禁用底部的版权信息等
|
|
|
|
|
|
footerRender: false,
|
2025-06-27 16:42:11 +08:00
|
|
|
|
token: {
|
2026-03-30 14:52:18 +08:00
|
|
|
|
bgLayout: '#f5f5f5', // 浅灰布局背景
|
2025-06-27 16:42:11 +08:00
|
|
|
|
header: {
|
2026-03-30 14:52:18 +08:00
|
|
|
|
colorBgHeader: '#ffffff', // 白色header背景
|
|
|
|
|
|
colorHeaderTitle: '#262626', // 深色标题文字
|
|
|
|
|
|
colorTextRightActionsItem: '#595959', // 深色操作文字
|
|
|
|
|
|
heightLayoutHeader: 64, // Header高度64px
|
2025-06-27 16:42:11 +08:00
|
|
|
|
},
|
|
|
|
|
|
sider: {
|
2026-03-30 14:52:18 +08:00
|
|
|
|
colorMenuBackground: '#ffffff', // 白色菜单背景
|
|
|
|
|
|
colorMenuText: '#595959', // 深色菜单文字
|
|
|
|
|
|
colorMenuTextSelected: '#1890ff', // 激活菜单文字蓝色
|
|
|
|
|
|
colorMenuItemBgSelected: '#e6f7ff', // 激活菜单背景浅蓝
|
|
|
|
|
|
colorMenuDivider: '#f0f0f0', // 分割线颜色
|
2025-06-27 16:42:11 +08:00
|
|
|
|
},
|
|
|
|
|
|
},
|
|
|
|
|
|
menuItemRender: (item, dom) => <Link to={item.path || '/'}>{dom}</Link>,
|
|
|
|
|
|
menu: {
|
|
|
|
|
|
params: snap.session.permissions,
|
|
|
|
|
|
request: async () => {
|
|
|
|
|
|
let objjs: any = [];
|
|
|
|
|
|
snap.session.permissions?.forEach((res: any) => {
|
|
|
|
|
|
objjs.push(res);
|
|
|
|
|
|
});
|
|
|
|
|
|
let data = objjs.sort((a: any, b: any) => {
|
|
|
|
|
|
return a._lft - b._lft;
|
|
|
|
|
|
});
|
|
|
|
|
|
const menus = loopMenu(data);
|
|
|
|
|
|
return Promise.resolve(menus);
|
|
|
|
|
|
},
|
|
|
|
|
|
},
|
|
|
|
|
|
unAccessible: <div>unAccessible</div>,
|
|
|
|
|
|
};
|
|
|
|
|
|
};
|