generator-mico-cli 0.1.29 → 0.2.2-8.beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +199 -15
- package/bin/mico.js +232 -27
- package/generators/micro-react/index.js +200 -18
- package/generators/micro-react/meta.json +13 -0
- package/generators/micro-react/templates/.commitlintrc.js +1 -0
- package/generators/micro-react/templates/.cursor/rules/always-read-docs.mdc +14 -4
- package/generators/micro-react/templates/.cursor/rules/cicd-deploy.mdc +10 -8
- package/generators/micro-react/templates/.cursor/rules/coding-conventions.mdc +1 -1
- package/generators/micro-react/templates/.cursor/rules/development-guide.mdc +3 -4
- package/generators/micro-react/templates/.cursor/rules/layout-app.mdc +38 -31
- package/generators/micro-react/templates/.cursor/rules/project-overview.mdc +7 -4
- package/generators/micro-react/templates/.cursor/rules/theme-system.mdc +10 -12
- package/generators/micro-react/templates/.eslintrc.js +25 -1
- package/generators/micro-react/templates/AGENTS.md +5 -2
- package/generators/micro-react/templates/CICD/before_build.sh +76 -0
- package/generators/micro-react/templates/CICD/start_dev.sh +27 -3
- package/generators/micro-react/templates/CICD/start_prod.sh +26 -3
- package/generators/micro-react/templates/CICD/start_test.sh +28 -3
- package/generators/micro-react/templates/CICD/wangsu_fresh_dev.sh +4 -4
- package/generators/micro-react/templates/CICD/wangsu_fresh_prod.sh +4 -4
- package/generators/micro-react/templates/CICD/wangsu_fresh_test.sh +4 -4
- package/generators/micro-react/templates/CLAUDE.md +16 -9
- package/generators/micro-react/templates/README.md +42 -4
- package/generators/micro-react/templates/_gitignore +4 -0
- package/generators/micro-react/templates/_npmrc +4 -0
- package/generators/micro-react/templates/apps/layout/config/config.dev.ts +33 -17
- package/generators/micro-react/templates/apps/layout/config/config.prod.development.ts +24 -29
- package/generators/micro-react/templates/apps/layout/config/config.prod.testing.ts +25 -6
- package/generators/micro-react/templates/apps/layout/config/config.prod.ts +16 -7
- package/generators/micro-react/templates/apps/layout/config/config.ts +27 -4
- package/generators/micro-react/templates/apps/layout/config/routes.ts +10 -5
- package/generators/micro-react/templates/apps/layout/docs/arch-/346/227/245/345/277/227/344/270/216/345/270/270/351/207/217.md +2 -2
- package/generators/micro-react/templates/apps/layout/docs/arch-/350/257/267/346/261/202/346/250/241/345/235/227.md +1 -1
- package/generators/micro-react/templates/apps/layout/docs/common-intl.md +372 -0
- package/generators/micro-react/templates/apps/layout/docs/feat-/346/236/204/345/273/272define/344/270/216/345/205/215/350/256/244/350/257/201/345/210/235/345/247/213/346/200/201.md +44 -0
- package/generators/micro-react/templates/apps/layout/docs/feature-404/351/241/265/351/235/242.md +103 -0
- package/generators/micro-react/templates/apps/layout/docs/feature-/344/270/273/351/242/230/350/211/262/345/210/207/346/215/242.md +22 -26
- package/generators/micro-react/templates/apps/layout/docs/feature-/345/276/256/345/211/215/347/253/257/346/250/241/345/274/217.md +185 -28
- package/generators/micro-react/templates/apps/layout/docs/feature-/350/217/234/345/215/225/346/235/203/351/231/220/346/216/247/345/210/266.md +420 -0
- package/generators/micro-react/templates/apps/layout/docs/feature-/350/267/257/347/224/261/344/270/216/350/217/234/345/215/225/350/247/243/350/200/246.md +179 -0
- package/generators/micro-react/templates/apps/layout/docs/fix-SSO/346/227/240/351/231/220/351/207/215/345/256/232/345/220/221.md +88 -0
- package/generators/micro-react/templates/apps/layout/docs/utils-timezone.md +324 -0
- package/generators/micro-react/templates/apps/layout/mock/api.mock.ts +81 -61
- package/generators/micro-react/templates/apps/layout/mock/menus.ts +114 -4
- package/generators/micro-react/templates/apps/layout/mock/pages.ts +86 -0
- package/generators/micro-react/templates/apps/layout/package.json +7 -4
- package/generators/micro-react/templates/apps/layout/src/app.tsx +122 -83
- package/generators/micro-react/templates/apps/layout/src/common/auth/index.ts +3 -0
- package/generators/micro-react/templates/apps/layout/src/common/helpers.ts +177 -0
- package/generators/micro-react/templates/apps/layout/src/common/locale.ts +22 -17
- package/generators/micro-react/templates/apps/layout/src/common/menu/parser.ts +283 -28
- package/generators/micro-react/templates/apps/layout/src/common/menu/types.ts +69 -5
- package/generators/micro-react/templates/apps/layout/src/common/micro/index.ts +34 -0
- package/generators/micro-react/templates/apps/layout/src/common/micro-prefetch.ts +109 -0
- package/generators/micro-react/templates/apps/layout/src/common/portal-data.ts +45 -0
- package/generators/micro-react/templates/apps/layout/src/common/request/config.ts +72 -10
- package/generators/micro-react/templates/apps/layout/src/common/request/index.ts +2 -2
- package/generators/micro-react/templates/apps/layout/src/common/request/interceptors.ts +31 -3
- package/generators/micro-react/templates/apps/layout/src/common/request/sso.ts +29 -11
- package/generators/micro-react/templates/apps/layout/src/common/request/url-resolver.ts +23 -8
- package/generators/micro-react/templates/apps/layout/src/common/route-guard.ts +345 -0
- package/generators/micro-react/templates/apps/layout/src/common/theme.ts +2 -4
- package/generators/micro-react/templates/apps/layout/src/common/upload/oss.ts +3 -4
- package/generators/micro-react/templates/apps/layout/src/common/upload/types.ts +1 -1
- package/generators/micro-react/templates/apps/layout/src/common/uploadFiles.ts +1 -1
- package/generators/micro-react/templates/apps/layout/src/components/AppTabs/index.less +8 -3
- package/generators/micro-react/templates/apps/layout/src/components/AppTabs/index.tsx +25 -8
- package/generators/micro-react/templates/apps/layout/src/components/HeaderDropdown/index.tsx +20 -0
- package/generators/micro-react/templates/apps/layout/src/components/IconFont/index.tsx +5 -6
- package/generators/micro-react/templates/apps/layout/src/components/MicroAppLoader/index.less +21 -6
- package/generators/micro-react/templates/apps/layout/src/components/MicroAppLoader/index.tsx +83 -107
- package/generators/micro-react/templates/apps/layout/src/components/MicroAppLoader/micro-app-manager.ts +569 -0
- package/generators/micro-react/templates/apps/layout/src/components/RightContent/AvatarDropdown.tsx +383 -0
- package/generators/micro-react/templates/apps/layout/src/components/RightContent/avatar-dropdown.less +35 -0
- package/generators/micro-react/templates/apps/layout/src/components/RightContent/index.ts +2 -0
- package/generators/micro-react/templates/apps/layout/src/constants/index.ts +170 -6
- package/generators/micro-react/templates/apps/layout/src/global.less +19 -6
- package/generators/micro-react/templates/apps/layout/src/hooks/useMenu.ts +3 -2
- package/generators/micro-react/templates/apps/layout/src/hooks/useRoutePermissionRefresh.ts +72 -0
- package/generators/micro-react/templates/apps/layout/src/layouts/components/header/index.less +3 -1
- package/generators/micro-react/templates/apps/layout/src/layouts/components/header/index.tsx +10 -55
- package/generators/micro-react/templates/apps/layout/src/layouts/components/menu/index.less +34 -4
- package/generators/micro-react/templates/apps/layout/src/layouts/components/menu/index.tsx +33 -9
- package/generators/micro-react/templates/apps/layout/src/layouts/index.less +84 -13
- package/generators/micro-react/templates/apps/layout/src/layouts/index.tsx +178 -47
- package/generators/micro-react/templates/apps/layout/src/locales/en-US.ts +12 -0
- package/generators/micro-react/templates/apps/layout/src/locales/zh-CN.ts +12 -0
- package/generators/micro-react/templates/apps/layout/src/pages/403/index.tsx +34 -0
- package/generators/micro-react/templates/apps/layout/src/pages/404/index.tsx +78 -0
- package/generators/micro-react/templates/apps/layout/src/pages/Home/index.less +3 -0
- package/generators/micro-react/templates/apps/layout/src/pages/Home/index.tsx +7 -1
- package/generators/micro-react/templates/apps/layout/src/pages/User/Login/index.less +1 -1
- package/generators/micro-react/templates/apps/layout/src/pages/User/Login/index.tsx +9 -5
- package/generators/micro-react/templates/apps/layout/src/requestErrorConfig.ts +1 -1
- package/generators/micro-react/templates/apps/layout/src/services/config/index.ts +63 -0
- package/generators/micro-react/templates/apps/layout/src/services/config/type.ts +30 -0
- package/generators/micro-react/templates/apps/layout/src/services/user.ts +29 -2
- package/generators/micro-react/templates/apps/layout/tailwind.config.js +3 -0
- package/generators/micro-react/templates/deployDesc.md +3 -3
- package/generators/micro-react/templates/dev.preset.json +14 -0
- package/generators/micro-react/templates/docs/dev-preset.md +130 -0
- package/generators/micro-react/templates/package.json +21 -6
- package/generators/micro-react/templates/packages/common-intl/README.md +427 -0
- package/generators/micro-react/templates/packages/common-intl/package.json +34 -0
- package/generators/micro-react/templates/packages/common-intl/src/index.ts +7 -0
- package/generators/micro-react/templates/packages/common-intl/src/indexedDBUtils.ts +51 -0
- package/generators/micro-react/templates/packages/common-intl/src/intl.ts +50 -0
- package/generators/micro-react/templates/packages/common-intl/src/utils.ts +482 -0
- package/generators/micro-react/templates/packages/common-intl/tsconfig.json +22 -0
- package/generators/micro-react/templates/packages/common-intl/vite.config.ts +25 -0
- package/generators/micro-react/templates/scripts/apply-sentry-plugin.ts +45 -0
- package/generators/micro-react/templates/scripts/collect-dist.js +10 -0
- package/generators/micro-react/templates/scripts/dev-preset.js +265 -0
- package/generators/micro-react/templates/scripts/dev-preset.schema.json +39 -0
- package/generators/micro-react/templates/turbo.json +4 -1
- package/generators/subapp-react/index.js +326 -40
- package/generators/subapp-react/meta.json +10 -0
- package/generators/subapp-react/templates/homepage/.env +2 -1
- package/generators/subapp-react/templates/homepage/README.md +3 -3
- package/generators/subapp-react/templates/homepage/config/config.dev.ts +14 -7
- package/generators/subapp-react/templates/homepage/config/config.prod.development.ts +16 -5
- package/generators/subapp-react/templates/homepage/config/config.prod.testing.ts +16 -5
- package/generators/subapp-react/templates/homepage/config/config.prod.ts +14 -5
- package/generators/subapp-react/templates/homepage/config/config.ts +27 -0
- package/generators/subapp-react/templates/homepage/config/routes.ts +2 -2
- package/generators/subapp-react/templates/homepage/mock/api.mock.ts +2 -2
- package/generators/subapp-react/templates/homepage/package.json +7 -4
- package/generators/subapp-react/templates/homepage/src/app.tsx +18 -27
- package/generators/subapp-react/templates/homepage/src/common/request.ts +29 -2
- package/generators/subapp-react/templates/homepage/src/global.less +6 -5
- package/generators/subapp-react/templates/homepage/src/pages/index.less +3 -3
- package/generators/subapp-react/templates/homepage/src/pages/index.tsx +99 -60
- package/generators/subapp-react/templates/homepage/src/styles/theme.less +1 -1
- package/generators/subapp-umd/ignore-list.json +5 -0
- package/generators/subapp-umd/index.js +309 -0
- package/generators/subapp-umd/meta.json +11 -0
- package/generators/subapp-umd/templates/README.md +94 -0
- package/generators/subapp-umd/templates/package.json +35 -0
- package/generators/subapp-umd/templates/public/index.html +34 -0
- package/generators/subapp-umd/templates/src/App.less +15 -0
- package/generators/subapp-umd/templates/src/App.tsx +13 -0
- package/generators/subapp-umd/templates/src/index.ts +2 -0
- package/generators/subapp-umd/templates/tsconfig.json +27 -0
- package/generators/subapp-umd/templates/webpack.config.js +70 -0
- package/lib/utils.js +332 -2
- package/package.json +15 -2
- package/generators/micro-react/templates/apps/layout/mock/menus.json +0 -100
- package/generators/micro-react/templates/apps/layout/src/common/constants.ts +0 -38
- package/generators/micro-react/templates/apps/layout/src/components/MicroAppLoader/container-manager.ts +0 -202
- package/generators/micro-react/templates/packages/shared-styles/README.md +0 -124
- package/generators/micro-react/templates/packages/shared-styles/arco-design-mobile-override.less +0 -91
- package/generators/micro-react/templates/packages/shared-styles/arco-override.less +0 -119
- package/generators/micro-react/templates/packages/shared-styles/index.d.ts +0 -44
- package/generators/micro-react/templates/packages/shared-styles/index.less +0 -13
- package/generators/micro-react/templates/packages/shared-styles/package.json +0 -30
- package/generators/micro-react/templates/packages/shared-styles/theme-inject.less +0 -10
- package/generators/micro-react/templates/packages/shared-styles/themes/dark/custom-var.less +0 -290
- package/generators/micro-react/templates/packages/shared-styles/themes/normal/custom-var.less +0 -269
- package/generators/micro-react/templates/packages/shared-styles/variables-only.less +0 -433
- package/generators/micro-react/templates/packages/shared-styles/variables.less +0 -452
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { useLocation, useModel } from '@umijs/max';
|
|
2
|
+
import { useEffect, useRef, useState } from 'react';
|
|
3
|
+
import { layoutLogger } from '@/common/logger';
|
|
4
|
+
import { isNoAuthRoute } from '@/constants';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* 路由切换时自动刷新用户权限
|
|
8
|
+
*
|
|
9
|
+
* 功能:
|
|
10
|
+
* - 路由变化时自动刷新 initialState(用户信息和权限)
|
|
11
|
+
* - 防抖处理,避免频繁切换路由时重复请求
|
|
12
|
+
* - 跳过首次渲染(getInitialState 已获取过)
|
|
13
|
+
* - 跳过免认证路由
|
|
14
|
+
* - 只响应 pathname 变化,忽略 search/hash
|
|
15
|
+
*/
|
|
16
|
+
export function useRoutePermissionRefresh() {
|
|
17
|
+
const location = useLocation();
|
|
18
|
+
const { refresh } = useModel('@@initialState');
|
|
19
|
+
const [isRefreshing, setIsRefreshing] = useState(false);
|
|
20
|
+
|
|
21
|
+
const isFirstRender = useRef(true);
|
|
22
|
+
const prevPathRef = useRef(location.pathname);
|
|
23
|
+
const refreshRef = useRef(refresh);
|
|
24
|
+
const timerRef = useRef<ReturnType<typeof setTimeout>>();
|
|
25
|
+
refreshRef.current = refresh;
|
|
26
|
+
|
|
27
|
+
useEffect(() => {
|
|
28
|
+
// 跳过首次渲染
|
|
29
|
+
if (isFirstRender.current) {
|
|
30
|
+
isFirstRender.current = false;
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// 路径未变化
|
|
35
|
+
if (prevPathRef.current === location.pathname) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
prevPathRef.current = location.pathname;
|
|
40
|
+
|
|
41
|
+
// 免认证路由不需要刷新
|
|
42
|
+
if (isNoAuthRoute(location.pathname)) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// 清除之前的定时器
|
|
47
|
+
if (timerRef.current) {
|
|
48
|
+
clearTimeout(timerRef.current);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
setIsRefreshing(true);
|
|
52
|
+
layoutLogger.log('Route changed, scheduling user info refresh:', location.pathname);
|
|
53
|
+
|
|
54
|
+
// 防抖 300ms
|
|
55
|
+
timerRef.current = setTimeout(async () => {
|
|
56
|
+
try {
|
|
57
|
+
await refreshRef.current?.();
|
|
58
|
+
layoutLogger.log('User info refreshed');
|
|
59
|
+
} finally {
|
|
60
|
+
setIsRefreshing(false);
|
|
61
|
+
}
|
|
62
|
+
}, 300);
|
|
63
|
+
|
|
64
|
+
return () => {
|
|
65
|
+
if (timerRef.current) {
|
|
66
|
+
clearTimeout(timerRef.current);
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
}, [location.pathname]);
|
|
70
|
+
|
|
71
|
+
return { isRefreshing };
|
|
72
|
+
}
|
package/generators/micro-react/templates/apps/layout/src/layouts/components/header/index.less
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
@import '
|
|
1
|
+
@import '@mico-platform/theme/variables';
|
|
2
2
|
|
|
3
3
|
// Common mixins
|
|
4
4
|
.header-gray-btn-mixin() {
|
|
@@ -22,6 +22,8 @@
|
|
|
22
22
|
z-index: @header-z-index;
|
|
23
23
|
height: @header-height;
|
|
24
24
|
line-height: @header-height;
|
|
25
|
+
position: fixed;
|
|
26
|
+
width: 100vw;
|
|
25
27
|
padding: 0 @spacing-lg;
|
|
26
28
|
display: flex;
|
|
27
29
|
align-items: center;
|
package/generators/micro-react/templates/apps/layout/src/layouts/components/header/index.tsx
CHANGED
|
@@ -1,64 +1,18 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import
|
|
5
|
-
Avatar,
|
|
6
|
-
Divider,
|
|
7
|
-
Dropdown,
|
|
8
|
-
Layout,
|
|
9
|
-
Menu,
|
|
10
|
-
Space,
|
|
11
|
-
} from '@arco-design/web-react';
|
|
12
|
-
import {
|
|
13
|
-
IconMoonFill,
|
|
14
|
-
IconPoweroff,
|
|
15
|
-
IconSettings,
|
|
16
|
-
IconSunFill,
|
|
17
|
-
IconUser,
|
|
18
|
-
} from '@arco-design/web-react/icon';
|
|
19
|
-
import { useModel } from '@umijs/max';
|
|
20
|
-
import React, { useCallback } from 'react';
|
|
1
|
+
import { AvatarDropdown } from '@/components/RightContent';
|
|
2
|
+
import { DEFAULT_NAME } from '@/constants';
|
|
3
|
+
import { Layout, Space } from '@mico-platform/ui';
|
|
4
|
+
import React from 'react';
|
|
21
5
|
import './index.less';
|
|
22
6
|
|
|
23
7
|
const Header = Layout.Header;
|
|
24
8
|
|
|
25
9
|
const LayoutHeader: React.FC = () => {
|
|
26
|
-
const { initialState } = useModel('@@initialState');
|
|
27
|
-
const { theme, toggleTheme } = useTheme();
|
|
28
|
-
|
|
29
|
-
const handleMenuClick = useCallback((key: string) => {
|
|
30
|
-
if (key === 'logout') {
|
|
31
|
-
// 清除本地存储的认证信息
|
|
32
|
-
logout();
|
|
33
|
-
// 跳转到登录页
|
|
34
|
-
window.location.href = ROUTES.LOGIN;
|
|
35
|
-
return;
|
|
36
|
-
} else if (key === 'settings') {
|
|
37
|
-
// TODO: Navigate to settings page
|
|
38
|
-
console.log('settings');
|
|
39
|
-
}
|
|
40
|
-
}, []);
|
|
41
|
-
|
|
42
|
-
const droplist = (
|
|
43
|
-
<Menu onClickMenuItem={handleMenuClick}>
|
|
44
|
-
<Menu.Item key="settings">
|
|
45
|
-
<IconSettings style={{ marginRight: 8 }} />
|
|
46
|
-
设置
|
|
47
|
-
</Menu.Item>
|
|
48
|
-
<Divider style={{ margin: '4px 0' }} />
|
|
49
|
-
<Menu.Item key="logout">
|
|
50
|
-
<IconPoweroff style={{ marginRight: 8 }} />
|
|
51
|
-
退出登录
|
|
52
|
-
</Menu.Item>
|
|
53
|
-
</Menu>
|
|
54
|
-
);
|
|
55
|
-
|
|
56
10
|
return (
|
|
57
11
|
<Header className="layout-header">
|
|
58
12
|
{/* Logo */}
|
|
59
13
|
<div className="layout-header-logo">
|
|
60
14
|
<span className="logo-text">
|
|
61
|
-
{window.
|
|
15
|
+
{window.__MICO_CONFIG__?.appName || DEFAULT_NAME}
|
|
62
16
|
</span>
|
|
63
17
|
</div>
|
|
64
18
|
|
|
@@ -66,18 +20,18 @@ const LayoutHeader: React.FC = () => {
|
|
|
66
20
|
<div className="layout-header-right">
|
|
67
21
|
<Space size="medium">
|
|
68
22
|
{/* Theme toggle */}
|
|
69
|
-
<div
|
|
23
|
+
{/* <div
|
|
70
24
|
className="layout-header-action"
|
|
71
25
|
onClick={toggleTheme}
|
|
72
26
|
title={theme === 'dark' ? '切换到亮色模式' : '切换到暗色模式'}
|
|
73
27
|
>
|
|
74
28
|
{theme === 'dark' ? <IconSunFill /> : <IconMoonFill />}
|
|
75
|
-
</div>
|
|
29
|
+
</div> */}
|
|
76
30
|
|
|
77
31
|
<span className="split-line" />
|
|
78
32
|
|
|
79
33
|
{/* User info */}
|
|
80
|
-
<Dropdown droplist={droplist} position="br" trigger="click">
|
|
34
|
+
{/* <Dropdown droplist={droplist} position="br" trigger="click">
|
|
81
35
|
<div className="layout-header-user">
|
|
82
36
|
{initialState?.currentUser?.avatar && (
|
|
83
37
|
<Avatar size={32} style={{ marginRight: 8 }}>
|
|
@@ -91,7 +45,8 @@ const LayoutHeader: React.FC = () => {
|
|
|
91
45
|
initialState?.currentUser?.email}
|
|
92
46
|
</span>
|
|
93
47
|
</div>
|
|
94
|
-
</Dropdown>
|
|
48
|
+
</Dropdown> */}
|
|
49
|
+
<AvatarDropdown menu />
|
|
95
50
|
</Space>
|
|
96
51
|
</div>
|
|
97
52
|
</Header>
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
@import '
|
|
1
|
+
@import '@mico-platform/theme/variables';
|
|
2
2
|
|
|
3
3
|
.arco-layout-sider-collapsed {
|
|
4
4
|
.layout-menu {
|
|
@@ -9,8 +9,10 @@
|
|
|
9
9
|
}
|
|
10
10
|
}
|
|
11
11
|
|
|
12
|
-
.layout-menu
|
|
12
|
+
.layout-menu.arco-menu-dark,
|
|
13
|
+
.layout-menu.arco-menu {
|
|
13
14
|
font-size: @font-size-base;
|
|
15
|
+
background-color: @color-text-5;
|
|
14
16
|
|
|
15
17
|
// Base menu item styles
|
|
16
18
|
.arco-menu-item {
|
|
@@ -48,7 +50,7 @@
|
|
|
48
50
|
}
|
|
49
51
|
|
|
50
52
|
.arco-menu-indent {
|
|
51
|
-
width:
|
|
53
|
+
width: 12px;
|
|
52
54
|
}
|
|
53
55
|
|
|
54
56
|
.layout-menu-level-3 {
|
|
@@ -133,8 +135,12 @@
|
|
|
133
135
|
}
|
|
134
136
|
|
|
135
137
|
// Sider styles
|
|
136
|
-
|
|
138
|
+
.layout-web-sider {
|
|
137
139
|
box-shadow: none;
|
|
140
|
+
background-color: @color-text-5 !important;
|
|
141
|
+
position: fixed !important;
|
|
142
|
+
height: calc(100vh - @header-height) !important;
|
|
143
|
+
z-index: 999;
|
|
138
144
|
|
|
139
145
|
.arco-layout-sider-trigger {
|
|
140
146
|
display: flex;
|
|
@@ -146,6 +152,10 @@
|
|
|
146
152
|
.click-trigger-btn {
|
|
147
153
|
cursor: pointer;
|
|
148
154
|
display: flex;
|
|
155
|
+
width: 24px;
|
|
156
|
+
height: 24px;
|
|
157
|
+
align-items: center;
|
|
158
|
+
justify-content: center;
|
|
149
159
|
|
|
150
160
|
// 图标颜色适配主题
|
|
151
161
|
.arco-icon {
|
|
@@ -161,4 +171,24 @@
|
|
|
161
171
|
.click-trigger-btn.collapsed {
|
|
162
172
|
justify-content: center;
|
|
163
173
|
}
|
|
174
|
+
|
|
175
|
+
.arco-menu-collapse .arco-menu-item .arco-icon,
|
|
176
|
+
.arco-menu-collapse .arco-menu-pop-header .arco-icon {
|
|
177
|
+
margin-left: 0;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
.arco-menu .arco-menu-item,
|
|
181
|
+
.arco-menu .arco-menu-group-title,
|
|
182
|
+
.arco-menu .arco-menu-pop-header,
|
|
183
|
+
.arco-menu .arco-menu-inline-header .arco-menu-dark .arco-menu-item,
|
|
184
|
+
.arco-menu-dark .arco-menu-group-title,
|
|
185
|
+
.arco-menu-dark .arco-menu-pop-header,
|
|
186
|
+
.arco-menu-dark .arco-menu-inline-header {
|
|
187
|
+
background-color: @color-text-5;
|
|
188
|
+
color: @color-text-2;
|
|
189
|
+
|
|
190
|
+
&.arco-menu-selected {
|
|
191
|
+
color: @Brand1-6;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
164
194
|
}
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import type { ParsedMenuItem } from '@/common/menu';
|
|
2
|
-
import {
|
|
2
|
+
import { filterMenuItems, parseMenuItems } from '@/common/menu';
|
|
3
|
+
import { getMenus } from '@/common/portal-data';
|
|
3
4
|
import IconFont from '@/components/IconFont';
|
|
5
|
+
import { isAuthDisabled } from '@/constants';
|
|
4
6
|
import { useMenuState } from '@/hooks/useMenuState';
|
|
5
7
|
import { useTheme } from '@/hooks/useTheme';
|
|
6
|
-
import { Layout, Menu } from '@
|
|
7
|
-
import * as Icons from '@
|
|
8
|
+
import { Layout, Menu } from '@mico-platform/ui';
|
|
9
|
+
import * as Icons from '@mico-platform/ui/icon';
|
|
10
|
+
import { useModel } from '@umijs/max';
|
|
8
11
|
import React, { useEffect, useMemo, useRef } from 'react';
|
|
9
12
|
import './index.less';
|
|
10
13
|
|
|
@@ -13,8 +16,8 @@ const SubMenu = Menu.SubMenu;
|
|
|
13
16
|
const Sider = Layout.Sider;
|
|
14
17
|
|
|
15
18
|
/**
|
|
16
|
-
* 图标名称到
|
|
17
|
-
* 用于处理自定义图标名称与
|
|
19
|
+
* 图标名称到 @mico-platform/ui Icon 组件的映射
|
|
20
|
+
* 用于处理自定义图标名称与 UI 图标名称的差异
|
|
18
21
|
*/
|
|
19
22
|
const ICON_ALIAS_MAP: Record<string, keyof typeof Icons> = {
|
|
20
23
|
Package: 'IconApps',
|
|
@@ -28,6 +31,16 @@ const ICON_ALIAS_MAP: Record<string, keyof typeof Icons> = {
|
|
|
28
31
|
const getIconComponent = (iconName: string): React.ReactNode => {
|
|
29
32
|
if (!iconName) return null;
|
|
30
33
|
|
|
34
|
+
// 从中台配置的 icon 是有 Icon 前缀的。类似 IconMenu 这种
|
|
35
|
+
const directIconKey = iconName as keyof typeof Icons;
|
|
36
|
+
const DirectIconComponent = Icons[directIconKey] as
|
|
37
|
+
| React.ComponentType
|
|
38
|
+
| undefined;
|
|
39
|
+
|
|
40
|
+
if (DirectIconComponent) {
|
|
41
|
+
return <DirectIconComponent />;
|
|
42
|
+
}
|
|
43
|
+
|
|
31
44
|
// 尝试直接匹配 Icon${name} 格式
|
|
32
45
|
const iconKey = `Icon${iconName}` as keyof typeof Icons;
|
|
33
46
|
const IconComponent = Icons[iconKey] as React.ComponentType | undefined;
|
|
@@ -102,12 +115,23 @@ interface LayoutMenuProps {
|
|
|
102
115
|
const LayoutMenu: React.FC<LayoutMenuProps> = () => {
|
|
103
116
|
const siderRef = useRef<HTMLDivElement>(null);
|
|
104
117
|
const { isDark } = useTheme();
|
|
118
|
+
const { initialState } = useModel('@@initialState');
|
|
119
|
+
const currentUser = initialState?.currentUser;
|
|
105
120
|
|
|
106
121
|
// Parse menu data
|
|
122
|
+
// isMenuAllowed 内部已对每个菜单项单独检查 isNoPermissionRoute,
|
|
123
|
+
// 无需在此按当前页面路径全局跳过过滤,避免菜单可见性随页面变化
|
|
107
124
|
const menuItems = useMemo(() => {
|
|
108
|
-
const menus =
|
|
109
|
-
|
|
110
|
-
|
|
125
|
+
const menus = getMenus();
|
|
126
|
+
if (isAuthDisabled()) {
|
|
127
|
+
return parseMenuItems(menus);
|
|
128
|
+
}
|
|
129
|
+
const filteredMenus = filterMenuItems(menus, {
|
|
130
|
+
isSuperuser: currentUser?.is_superuser,
|
|
131
|
+
sideMenus: (currentUser?.side_menus || []) as string[],
|
|
132
|
+
});
|
|
133
|
+
return parseMenuItems(filteredMenus);
|
|
134
|
+
}, [currentUser?.is_superuser, currentUser?.side_menus]);
|
|
111
135
|
|
|
112
136
|
// 使用菜单状态 Hook
|
|
113
137
|
const {
|
|
@@ -152,7 +176,7 @@ const LayoutMenu: React.FC<LayoutMenuProps> = () => {
|
|
|
152
176
|
onCollapse={handleCollapsed}
|
|
153
177
|
collapsible
|
|
154
178
|
breakpoint="xl"
|
|
155
|
-
className="
|
|
179
|
+
className="layout-web-sider"
|
|
156
180
|
trigger={clickTriggerBtn}
|
|
157
181
|
theme={isDark ? 'dark' : 'light'}
|
|
158
182
|
>
|
|
@@ -1,32 +1,60 @@
|
|
|
1
|
-
@import '
|
|
1
|
+
@import '@mico-platform/theme/variables';
|
|
2
|
+
|
|
3
|
+
.arco-tree-node:hover {
|
|
4
|
+
background-color: @color-fill-2;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
body {
|
|
8
|
+
// 防止触发mac浏览器的双指水平滑动触发后退前进
|
|
9
|
+
overscroll-behavior-x: none;
|
|
10
|
+
}
|
|
2
11
|
|
|
3
12
|
.layout-container {
|
|
4
|
-
min-width:
|
|
13
|
+
min-width: @size-base * 128;
|
|
5
14
|
background: @color-fill-1;
|
|
6
|
-
overflow-x: auto;
|
|
7
|
-
overflow-y: hidden;
|
|
15
|
+
// overflow-x: auto;s
|
|
16
|
+
// overflow-y: hidden;
|
|
8
17
|
display: flex;
|
|
9
18
|
flex-direction: column;
|
|
19
|
+
// 适配子元素高度,覆盖 arco-layout 默认的 flex: 1
|
|
20
|
+
flex: none;
|
|
21
|
+
width: 100%;
|
|
10
22
|
|
|
11
23
|
.layout-content {
|
|
12
|
-
overflow: hidden;
|
|
24
|
+
// overflow: hidden;
|
|
13
25
|
flex: 1;
|
|
14
|
-
|
|
15
|
-
flex-direction: row;
|
|
26
|
+
margin-top: @header-height;
|
|
16
27
|
|
|
17
28
|
.layout-content-right {
|
|
18
|
-
padding: @spacing-md @spacing-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
29
|
+
padding: @spacing-md @spacing-md;
|
|
30
|
+
margin-left: var(--sider-width, @sidebar-width);
|
|
31
|
+
// flex: 1;
|
|
32
|
+
// display: flex;
|
|
33
|
+
// flex-direction: column;
|
|
34
|
+
// min-height: calc(100vh - @header-height);
|
|
35
|
+
// 当菜单折叠时,自适应调整 marginLeft
|
|
36
|
+
transition: margin-left 0.2s ease;
|
|
37
|
+
// overflow-y: auto;
|
|
38
|
+
// overflow: hidden auto;
|
|
39
|
+
|
|
40
|
+
.layout-content-scroll-container {
|
|
41
|
+
display: flex;
|
|
42
|
+
flex-direction: column;
|
|
43
|
+
min-height: 100%;
|
|
44
|
+
}
|
|
23
45
|
|
|
24
46
|
.layout-content-outlet {
|
|
25
47
|
flex: 1;
|
|
48
|
+
// overflow-y: scroll;
|
|
26
49
|
overflow: hidden;
|
|
27
50
|
background: none;
|
|
28
51
|
border-radius: @border-radius-lg;
|
|
29
52
|
position: relative;
|
|
53
|
+
|
|
54
|
+
--layout-content-outlet-margin-top: 32px;
|
|
55
|
+
|
|
56
|
+
margin-top: var(--layout-content-outlet-margin-top);
|
|
57
|
+
height: calc(100% - var(--layout-content-outlet-margin-top));
|
|
30
58
|
}
|
|
31
59
|
}
|
|
32
60
|
}
|
|
@@ -34,6 +62,10 @@
|
|
|
34
62
|
.arco-spin-children::after {
|
|
35
63
|
background-color: color-mix(in srgb, var(--color-text-5) 60%, transparent);
|
|
36
64
|
}
|
|
65
|
+
|
|
66
|
+
.arco-layout-sider-trigger {
|
|
67
|
+
background-color: @color-text-5;
|
|
68
|
+
}
|
|
37
69
|
}
|
|
38
70
|
|
|
39
71
|
.arco-form {
|
|
@@ -47,8 +79,10 @@
|
|
|
47
79
|
}
|
|
48
80
|
}
|
|
49
81
|
|
|
50
|
-
|
|
82
|
+
.layout-web-sider {
|
|
51
83
|
box-shadow: none;
|
|
84
|
+
background-color: @color-text-5;
|
|
85
|
+
z-index: 999;
|
|
52
86
|
|
|
53
87
|
.arco-layout-sider-trigger {
|
|
54
88
|
display: flex;
|
|
@@ -57,6 +91,7 @@
|
|
|
57
91
|
|
|
58
92
|
.click-trigger-btn {
|
|
59
93
|
cursor: pointer;
|
|
94
|
+
// width: 100%;
|
|
60
95
|
display: flex;
|
|
61
96
|
}
|
|
62
97
|
|
|
@@ -69,3 +104,39 @@
|
|
|
69
104
|
justify-content: center;
|
|
70
105
|
}
|
|
71
106
|
}
|
|
107
|
+
|
|
108
|
+
.arco-drawer-header {
|
|
109
|
+
border-bottom: 1px solid @color-line-2;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
.arco-drawer-footer {
|
|
113
|
+
border-top: 1px solid @color-line-2;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
.arco-dropdown-menu {
|
|
117
|
+
border-color: @color-line-2;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
.arco-message-success,
|
|
121
|
+
.arco-message-error,
|
|
122
|
+
.arco-message-warning,
|
|
123
|
+
.arco-message-loading {
|
|
124
|
+
border-color: @color-line-2;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// 按钮样式覆盖
|
|
128
|
+
.arco-btn-secondary:not(.arco-btn-disabled) {
|
|
129
|
+
background-color: @color-fill-2;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
.arco-btn-secondary:not(.arco-btn-disabled):not(.arco-btn-loading):hover {
|
|
133
|
+
background-color: @color-fill-3;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
.arco-btn-secondary:not(.arco-btn-disabled):not(.arco-btn-loading):active {
|
|
137
|
+
background-color: @color-fill-4;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
.arco-btn-secondary.arco-btn-disabled {
|
|
141
|
+
background-color: @color-fill-1;
|
|
142
|
+
}
|