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.
Files changed (160) hide show
  1. package/README.md +199 -15
  2. package/bin/mico.js +232 -27
  3. package/generators/micro-react/index.js +200 -18
  4. package/generators/micro-react/meta.json +13 -0
  5. package/generators/micro-react/templates/.commitlintrc.js +1 -0
  6. package/generators/micro-react/templates/.cursor/rules/always-read-docs.mdc +14 -4
  7. package/generators/micro-react/templates/.cursor/rules/cicd-deploy.mdc +10 -8
  8. package/generators/micro-react/templates/.cursor/rules/coding-conventions.mdc +1 -1
  9. package/generators/micro-react/templates/.cursor/rules/development-guide.mdc +3 -4
  10. package/generators/micro-react/templates/.cursor/rules/layout-app.mdc +38 -31
  11. package/generators/micro-react/templates/.cursor/rules/project-overview.mdc +7 -4
  12. package/generators/micro-react/templates/.cursor/rules/theme-system.mdc +10 -12
  13. package/generators/micro-react/templates/.eslintrc.js +25 -1
  14. package/generators/micro-react/templates/AGENTS.md +5 -2
  15. package/generators/micro-react/templates/CICD/before_build.sh +76 -0
  16. package/generators/micro-react/templates/CICD/start_dev.sh +27 -3
  17. package/generators/micro-react/templates/CICD/start_prod.sh +26 -3
  18. package/generators/micro-react/templates/CICD/start_test.sh +28 -3
  19. package/generators/micro-react/templates/CICD/wangsu_fresh_dev.sh +4 -4
  20. package/generators/micro-react/templates/CICD/wangsu_fresh_prod.sh +4 -4
  21. package/generators/micro-react/templates/CICD/wangsu_fresh_test.sh +4 -4
  22. package/generators/micro-react/templates/CLAUDE.md +16 -9
  23. package/generators/micro-react/templates/README.md +42 -4
  24. package/generators/micro-react/templates/_gitignore +4 -0
  25. package/generators/micro-react/templates/_npmrc +4 -0
  26. package/generators/micro-react/templates/apps/layout/config/config.dev.ts +33 -17
  27. package/generators/micro-react/templates/apps/layout/config/config.prod.development.ts +24 -29
  28. package/generators/micro-react/templates/apps/layout/config/config.prod.testing.ts +25 -6
  29. package/generators/micro-react/templates/apps/layout/config/config.prod.ts +16 -7
  30. package/generators/micro-react/templates/apps/layout/config/config.ts +27 -4
  31. package/generators/micro-react/templates/apps/layout/config/routes.ts +10 -5
  32. 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
  33. package/generators/micro-react/templates/apps/layout/docs/arch-/350/257/267/346/261/202/346/250/241/345/235/227.md +1 -1
  34. package/generators/micro-react/templates/apps/layout/docs/common-intl.md +372 -0
  35. 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
  36. package/generators/micro-react/templates/apps/layout/docs/feature-404/351/241/265/351/235/242.md +103 -0
  37. 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
  38. 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
  39. 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
  40. 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
  41. 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
  42. package/generators/micro-react/templates/apps/layout/docs/utils-timezone.md +324 -0
  43. package/generators/micro-react/templates/apps/layout/mock/api.mock.ts +81 -61
  44. package/generators/micro-react/templates/apps/layout/mock/menus.ts +114 -4
  45. package/generators/micro-react/templates/apps/layout/mock/pages.ts +86 -0
  46. package/generators/micro-react/templates/apps/layout/package.json +7 -4
  47. package/generators/micro-react/templates/apps/layout/src/app.tsx +122 -83
  48. package/generators/micro-react/templates/apps/layout/src/common/auth/index.ts +3 -0
  49. package/generators/micro-react/templates/apps/layout/src/common/helpers.ts +177 -0
  50. package/generators/micro-react/templates/apps/layout/src/common/locale.ts +22 -17
  51. package/generators/micro-react/templates/apps/layout/src/common/menu/parser.ts +283 -28
  52. package/generators/micro-react/templates/apps/layout/src/common/menu/types.ts +69 -5
  53. package/generators/micro-react/templates/apps/layout/src/common/micro/index.ts +34 -0
  54. package/generators/micro-react/templates/apps/layout/src/common/micro-prefetch.ts +109 -0
  55. package/generators/micro-react/templates/apps/layout/src/common/portal-data.ts +45 -0
  56. package/generators/micro-react/templates/apps/layout/src/common/request/config.ts +72 -10
  57. package/generators/micro-react/templates/apps/layout/src/common/request/index.ts +2 -2
  58. package/generators/micro-react/templates/apps/layout/src/common/request/interceptors.ts +31 -3
  59. package/generators/micro-react/templates/apps/layout/src/common/request/sso.ts +29 -11
  60. package/generators/micro-react/templates/apps/layout/src/common/request/url-resolver.ts +23 -8
  61. package/generators/micro-react/templates/apps/layout/src/common/route-guard.ts +345 -0
  62. package/generators/micro-react/templates/apps/layout/src/common/theme.ts +2 -4
  63. package/generators/micro-react/templates/apps/layout/src/common/upload/oss.ts +3 -4
  64. package/generators/micro-react/templates/apps/layout/src/common/upload/types.ts +1 -1
  65. package/generators/micro-react/templates/apps/layout/src/common/uploadFiles.ts +1 -1
  66. package/generators/micro-react/templates/apps/layout/src/components/AppTabs/index.less +8 -3
  67. package/generators/micro-react/templates/apps/layout/src/components/AppTabs/index.tsx +25 -8
  68. package/generators/micro-react/templates/apps/layout/src/components/HeaderDropdown/index.tsx +20 -0
  69. package/generators/micro-react/templates/apps/layout/src/components/IconFont/index.tsx +5 -6
  70. package/generators/micro-react/templates/apps/layout/src/components/MicroAppLoader/index.less +21 -6
  71. package/generators/micro-react/templates/apps/layout/src/components/MicroAppLoader/index.tsx +83 -107
  72. package/generators/micro-react/templates/apps/layout/src/components/MicroAppLoader/micro-app-manager.ts +569 -0
  73. package/generators/micro-react/templates/apps/layout/src/components/RightContent/AvatarDropdown.tsx +383 -0
  74. package/generators/micro-react/templates/apps/layout/src/components/RightContent/avatar-dropdown.less +35 -0
  75. package/generators/micro-react/templates/apps/layout/src/components/RightContent/index.ts +2 -0
  76. package/generators/micro-react/templates/apps/layout/src/constants/index.ts +170 -6
  77. package/generators/micro-react/templates/apps/layout/src/global.less +19 -6
  78. package/generators/micro-react/templates/apps/layout/src/hooks/useMenu.ts +3 -2
  79. package/generators/micro-react/templates/apps/layout/src/hooks/useRoutePermissionRefresh.ts +72 -0
  80. package/generators/micro-react/templates/apps/layout/src/layouts/components/header/index.less +3 -1
  81. package/generators/micro-react/templates/apps/layout/src/layouts/components/header/index.tsx +10 -55
  82. package/generators/micro-react/templates/apps/layout/src/layouts/components/menu/index.less +34 -4
  83. package/generators/micro-react/templates/apps/layout/src/layouts/components/menu/index.tsx +33 -9
  84. package/generators/micro-react/templates/apps/layout/src/layouts/index.less +84 -13
  85. package/generators/micro-react/templates/apps/layout/src/layouts/index.tsx +178 -47
  86. package/generators/micro-react/templates/apps/layout/src/locales/en-US.ts +12 -0
  87. package/generators/micro-react/templates/apps/layout/src/locales/zh-CN.ts +12 -0
  88. package/generators/micro-react/templates/apps/layout/src/pages/403/index.tsx +34 -0
  89. package/generators/micro-react/templates/apps/layout/src/pages/404/index.tsx +78 -0
  90. package/generators/micro-react/templates/apps/layout/src/pages/Home/index.less +3 -0
  91. package/generators/micro-react/templates/apps/layout/src/pages/Home/index.tsx +7 -1
  92. package/generators/micro-react/templates/apps/layout/src/pages/User/Login/index.less +1 -1
  93. package/generators/micro-react/templates/apps/layout/src/pages/User/Login/index.tsx +9 -5
  94. package/generators/micro-react/templates/apps/layout/src/requestErrorConfig.ts +1 -1
  95. package/generators/micro-react/templates/apps/layout/src/services/config/index.ts +63 -0
  96. package/generators/micro-react/templates/apps/layout/src/services/config/type.ts +30 -0
  97. package/generators/micro-react/templates/apps/layout/src/services/user.ts +29 -2
  98. package/generators/micro-react/templates/apps/layout/tailwind.config.js +3 -0
  99. package/generators/micro-react/templates/deployDesc.md +3 -3
  100. package/generators/micro-react/templates/dev.preset.json +14 -0
  101. package/generators/micro-react/templates/docs/dev-preset.md +130 -0
  102. package/generators/micro-react/templates/package.json +21 -6
  103. package/generators/micro-react/templates/packages/common-intl/README.md +427 -0
  104. package/generators/micro-react/templates/packages/common-intl/package.json +34 -0
  105. package/generators/micro-react/templates/packages/common-intl/src/index.ts +7 -0
  106. package/generators/micro-react/templates/packages/common-intl/src/indexedDBUtils.ts +51 -0
  107. package/generators/micro-react/templates/packages/common-intl/src/intl.ts +50 -0
  108. package/generators/micro-react/templates/packages/common-intl/src/utils.ts +482 -0
  109. package/generators/micro-react/templates/packages/common-intl/tsconfig.json +22 -0
  110. package/generators/micro-react/templates/packages/common-intl/vite.config.ts +25 -0
  111. package/generators/micro-react/templates/scripts/apply-sentry-plugin.ts +45 -0
  112. package/generators/micro-react/templates/scripts/collect-dist.js +10 -0
  113. package/generators/micro-react/templates/scripts/dev-preset.js +265 -0
  114. package/generators/micro-react/templates/scripts/dev-preset.schema.json +39 -0
  115. package/generators/micro-react/templates/turbo.json +4 -1
  116. package/generators/subapp-react/index.js +326 -40
  117. package/generators/subapp-react/meta.json +10 -0
  118. package/generators/subapp-react/templates/homepage/.env +2 -1
  119. package/generators/subapp-react/templates/homepage/README.md +3 -3
  120. package/generators/subapp-react/templates/homepage/config/config.dev.ts +14 -7
  121. package/generators/subapp-react/templates/homepage/config/config.prod.development.ts +16 -5
  122. package/generators/subapp-react/templates/homepage/config/config.prod.testing.ts +16 -5
  123. package/generators/subapp-react/templates/homepage/config/config.prod.ts +14 -5
  124. package/generators/subapp-react/templates/homepage/config/config.ts +27 -0
  125. package/generators/subapp-react/templates/homepage/config/routes.ts +2 -2
  126. package/generators/subapp-react/templates/homepage/mock/api.mock.ts +2 -2
  127. package/generators/subapp-react/templates/homepage/package.json +7 -4
  128. package/generators/subapp-react/templates/homepage/src/app.tsx +18 -27
  129. package/generators/subapp-react/templates/homepage/src/common/request.ts +29 -2
  130. package/generators/subapp-react/templates/homepage/src/global.less +6 -5
  131. package/generators/subapp-react/templates/homepage/src/pages/index.less +3 -3
  132. package/generators/subapp-react/templates/homepage/src/pages/index.tsx +99 -60
  133. package/generators/subapp-react/templates/homepage/src/styles/theme.less +1 -1
  134. package/generators/subapp-umd/ignore-list.json +5 -0
  135. package/generators/subapp-umd/index.js +309 -0
  136. package/generators/subapp-umd/meta.json +11 -0
  137. package/generators/subapp-umd/templates/README.md +94 -0
  138. package/generators/subapp-umd/templates/package.json +35 -0
  139. package/generators/subapp-umd/templates/public/index.html +34 -0
  140. package/generators/subapp-umd/templates/src/App.less +15 -0
  141. package/generators/subapp-umd/templates/src/App.tsx +13 -0
  142. package/generators/subapp-umd/templates/src/index.ts +2 -0
  143. package/generators/subapp-umd/templates/tsconfig.json +27 -0
  144. package/generators/subapp-umd/templates/webpack.config.js +70 -0
  145. package/lib/utils.js +332 -2
  146. package/package.json +15 -2
  147. package/generators/micro-react/templates/apps/layout/mock/menus.json +0 -100
  148. package/generators/micro-react/templates/apps/layout/src/common/constants.ts +0 -38
  149. package/generators/micro-react/templates/apps/layout/src/components/MicroAppLoader/container-manager.ts +0 -202
  150. package/generators/micro-react/templates/packages/shared-styles/README.md +0 -124
  151. package/generators/micro-react/templates/packages/shared-styles/arco-design-mobile-override.less +0 -91
  152. package/generators/micro-react/templates/packages/shared-styles/arco-override.less +0 -119
  153. package/generators/micro-react/templates/packages/shared-styles/index.d.ts +0 -44
  154. package/generators/micro-react/templates/packages/shared-styles/index.less +0 -13
  155. package/generators/micro-react/templates/packages/shared-styles/package.json +0 -30
  156. package/generators/micro-react/templates/packages/shared-styles/theme-inject.less +0 -10
  157. package/generators/micro-react/templates/packages/shared-styles/themes/dark/custom-var.less +0 -290
  158. package/generators/micro-react/templates/packages/shared-styles/themes/normal/custom-var.less +0 -269
  159. package/generators/micro-react/templates/packages/shared-styles/variables-only.less +0 -433
  160. 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
+ }
@@ -1,4 +1,4 @@
1
- @import '<%= packageScope %>/shared-styles/variables-only';
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;
@@ -1,64 +1,18 @@
1
- import { useTheme } from '@/hooks/useTheme';
2
- import { logout } from '@/common/auth';
3
- import { ROUTES } from '@/common/constants';
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.__MICO_MENUS__?.appName || 'Mico CENTER'}
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 '<%= packageScope %>/shared-styles/variables-only';
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: 32px;
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
- .<%= projectName %>-sider {
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 { getWindowMenus, parseMenuItems } from '@/common/menu';
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 '@arco-design/web-react';
7
- import * as Icons from '@arco-design/web-react/icon';
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
- * 图标名称到 Arco Icon 组件的映射
17
- * 用于处理自定义图标名称与 Arco 图标名称的差异
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 = getWindowMenus();
109
- return parseMenuItems(menus);
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="<%= projectName %>-sider"
179
+ className="layout-web-sider"
156
180
  trigger={clickTriggerBtn}
157
181
  theme={isDark ? 'dark' : 'light'}
158
182
  >
@@ -1,32 +1,60 @@
1
- @import '<%= packageScope %>/shared-styles/variables-only';
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: 100vw;
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
- display: flex;
15
- flex-direction: row;
26
+ margin-top: @header-height;
16
27
 
17
28
  .layout-content-right {
18
- padding: @spacing-md @spacing-lg;
19
- flex: 1;
20
- display: flex;
21
- flex-direction: column;
22
- overflow: hidden;
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
- .<%= projectName %>-sider {
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
+ }