Skip to content

Commit 122ef47

Browse files
committed
Merge branch 'dev'
2 parents c2cdc8d + 2cfc803 commit 122ef47

45 files changed

Lines changed: 905 additions & 970 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.biomeignore

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
node_modules
2+
dist
3+
build
4+
*.min.js
5+
*.bundle.js
6+

biome.json

Lines changed: 10 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,7 @@
66
"useIgnoreFile": true
77
},
88
"files": {
9-
"ignoreUnknown": false,
10-
"ignore": ["node_modules", "dist", "build", "*.min.js", "*.bundle.js"]
9+
"ignoreUnknown": false
1110
},
1211
"formatter": {
1312
"enabled": true,
@@ -18,9 +17,6 @@
1817
"lineWidth": 120,
1918
"attributePosition": "auto"
2019
},
21-
"organizeImports": {
22-
"enabled": true
23-
},
2420
"linter": {
2521
"enabled": true,
2622
"rules": {
@@ -31,21 +27,21 @@
3127
"useKeyWithMouseEvents": "off",
3228
"useValidAnchor": "warn",
3329
"useAltText": "warn",
34-
"useAriaPropsForRole": "warn",
35-
"useAriaProptypes": "warn",
36-
"useAriaProps": "warn"
30+
"useAriaPropsForRole": "warn"
3731
},
3832
"complexity": {
3933
"recommended": true,
40-
"noForEach": "off"
34+
"noForEach": "off",
35+
"useArrowFunction": "error"
4136
},
4237
"correctness": {
4338
"recommended": true,
4439
"noUnusedVariables": "warn",
4540
"noUnusedImports": "error",
4641
"noUnusedPrivateClassMembers": "warn",
47-
"useExhaustiveDependencies": "warn",
48-
"useHookAtTopLevel": "error"
42+
"useExhaustiveDependencies": "off",
43+
"useHookAtTopLevel": "error",
44+
"noUnreachable": "error"
4945
},
5046
"performance": {
5147
"recommended": true
@@ -55,16 +51,10 @@
5551
},
5652
"style": {
5753
"recommended": true,
58-
"noVar": "error",
5954
"useConst": "error",
6055
"useTemplate": "error",
61-
"useArrowFunction": "error",
62-
"useShorthandArrayType": "error",
6356
"useShorthandAssign": "error",
64-
"useSingleCaseStatement": "error",
65-
"useSingleVarDeclarator": "error",
6657
"useBlockStatements": "error",
67-
"useConstAssertions": "off",
6858
"useDefaultParameterLast": "error",
6959
"useExponentiationOperator": "error",
7060
"useFragmentSyntax": "error",
@@ -73,10 +63,8 @@
7363
},
7464
"useNodejsImportProtocol": "off",
7565
"useNumberNamespace": "error",
76-
"useNumericLiterals": "error",
7766
"useSelfClosingElements": "error",
7867
"useShorthandFunctionType": "error",
79-
"useSingleClassPerFile": "off",
8068
"useImportType": "error"
8169
},
8270
"suspicious": {
@@ -88,15 +76,13 @@
8876
"noDuplicateObjectKeys": "error",
8977
"noDuplicateParameters": "error",
9078
"noEmptyBlockStatements": "warn",
91-
"noExtraBooleanCast": "error",
9279
"noFallthroughSwitchClause": "error",
9380
"noPrototypeBuiltins": "error",
9481
"noRedeclare": "error",
9582
"noShadowRestrictedNames": "error",
96-
"noUnreachable": "error",
9783
"noUnsafeNegation": "error",
98-
"useGetterReturn": "error",
99-
"useValidTypeof": "error"
84+
"noVar": "error",
85+
"useGetterReturn": "error"
10086
},
10187
"nursery": {
10288
"useSortedClasses": "off"
@@ -126,7 +112,7 @@
126112
},
127113
"overrides": [
128114
{
129-
"include": ["*.ts", "*.tsx"],
115+
"includes": ["*.ts", "*.tsx"],
130116
"linter": {
131117
"rules": {
132118
"correctness": {

package.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,16 +30,16 @@
3030
"@flowgram.ai/shortcuts-plugin": "^1.0.3",
3131
"@monaco-editor/react": "^4.7.0",
3232
"@tanstack/react-query": "^5.90.11",
33-
"@tanstack/react-router": "^1.139.10",
33+
"@tanstack/react-router": "^1.139.12",
3434
"@zxcvbn-ts/core": "^3.0.4",
3535
"ahooks": "^3.9.6",
36-
"antd": "^6.0.0",
36+
"antd": "^6.0.1",
3737
"axios": "^1.13.2",
3838
"clsx": "^2.1.1",
3939
"crypto-js": "^4.2.0",
4040
"dayjs": "^1.11.19",
4141
"echarts": "^6.0.0",
42-
"i18next": "^25.6.3",
42+
"i18next": "^25.7.1",
4343
"jsencrypt": "^3.5.4",
4444
"keepalive-for-react": "^5.0.2",
4545
"lodash-es": "^4.17.21",
@@ -52,15 +52,15 @@
5252
"react-is": "^19.2.0",
5353
"screenfull": "^6.0.2",
5454
"tailwind-merge": "^3.4.0",
55-
"zustand": "^5.0.8"
55+
"zustand": "^5.0.9"
5656
},
5757
"devDependencies": {
5858
"@babel/plugin-proposal-class-properties": "^7.18.6",
5959
"@babel/plugin-proposal-decorators": "^7.28.0",
6060
"@biomejs/biome": "^2.3.8",
6161
"@iconify/react": "^6.0.2",
6262
"@tailwindcss/vite": "^4.1.17",
63-
"@tanstack/react-router-devtools": "^1.139.10",
63+
"@tanstack/react-router-devtools": "^1.139.12",
6464
"@types/crypto-js": "^4.2.2",
6565
"@types/lodash-es": "^4.17.12",
6666
"@types/node": "^22.19.1",

src/App.tsx

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
1-
import { Router } from '@/router';
2-
import { commonService } from '@/services/common';
3-
import { useMenuStore } from '@/stores/store';
4-
import { useUserStore } from '@/stores/userStore';
5-
import { antdUtils } from '@/utils/antdUtil';
61
import { Icon } from '@iconify/react';
72
import { useQuery, useQueryClient } from '@tanstack/react-query';
83
import { App as AntdApp, Spin } from 'antd';
94
import type React from 'react';
105
import { useEffect } from 'react';
116
import { useShallow } from 'zustand/react/shallow';
7+
import { Router } from '@/router';
8+
import { commonService } from '@/services/common';
9+
import { useMenuStore } from '@/stores/store';
10+
import { useUserStore } from '@/stores/userStore';
11+
import type { RouteItem } from '@/types/route';
12+
import { antdUtils } from '@/utils/antdUtil';
1213

1314
/**
1415
* 主应用
@@ -45,7 +46,7 @@ const App: React.FC = () => {
4546
if (isLogin && roleId) {
4647
const cachedMenu = queryClient.getQueryData(['menuData', roleId]);
4748
if (cachedMenu) {
48-
setMenus(cachedMenu as any);
49+
setMenus(cachedMenu as RouteItem[]);
4950
} else {
5051
refetch();
5152
}

src/components/HotKeyProvider/index.tsx

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,22 @@
1-
import { usePlatformHotkey } from "@/hooks/usePlatformHotkey"
2-
import { useLogout } from "@/hooks/useLogout"
3-
import useGlobalUIStore from "@/stores/globalUIStore"
4-
import { type ReactNode } from "react"
5-
import { useShallow } from "zustand/shallow"
6-
import { usePreferencesStore } from "@/stores/store"
1+
import type { ReactNode } from 'react';
2+
import { useShallow } from 'zustand/shallow';
3+
import { useLogout } from '@/hooks/useLogout';
4+
import { usePlatformHotkey } from '@/hooks/usePlatformHotkey';
5+
import useGlobalUIStore from '@/stores/globalUIStore';
6+
import { usePreferencesStore } from '@/stores/store';
77

88
/**
99
* 快捷键提供者
1010
* @param children 子组件
1111
* @returns 子组件
1212
*/
1313
const HotKeyProvider: React.FC<{ children: ReactNode }> = ({ children }: { children: ReactNode }) => {
14-
1514
const { setSearchMenuModalOpen, setSettingMenuModalOpen } = useGlobalUIStore(
1615
useShallow((state) => ({
1716
setSearchMenuModalOpen: state.setSearchMenuModalOpen,
1817
setSettingMenuModalOpen: state.setSettingMenuModalOpen,
1918
}))
20-
)
19+
);
2120

2221
const { globalLogout, globalLockScreen, globalPreferences, enable, updatePreferences } = usePreferencesStore(
2322
useShallow((state) => ({
@@ -27,7 +26,7 @@ const HotKeyProvider: React.FC<{ children: ReactNode }> = ({ children }: { child
2726
enable: state.preferences.shortcut.enable,
2827
updatePreferences: state.updatePreferences,
2928
}))
30-
)
29+
);
3130

3231
const handleLogout = useLogout();
3332

@@ -45,7 +44,7 @@ const HotKeyProvider: React.FC<{ children: ReactNode }> = ({ children }: { child
4544

4645
// 始终注册全局快捷键(偏好设置),通过 enabled 控制是否启用
4746
usePlatformHotkey({
48-
mac: 'meta+,',
47+
mac: 'alt+,',
4948
windows: 'ctrl+alt+s',
5049
handler: (event) => {
5150
event.preventDefault();
@@ -57,7 +56,7 @@ const HotKeyProvider: React.FC<{ children: ReactNode }> = ({ children }: { child
5756

5857
// 始终注册全局快捷键(退出登录),通过 enabled 控制是否启用
5958
usePlatformHotkey({
60-
mac: 'option+q',
59+
mac: 'alt+q',
6160
windows: 'alt+q',
6261
handler: (event) => {
6362
event.preventDefault();
@@ -69,7 +68,7 @@ const HotKeyProvider: React.FC<{ children: ReactNode }> = ({ children }: { child
6968

7069
// 快捷键锁屏
7170
usePlatformHotkey({
72-
mac: 'option+l',
71+
mac: 'alt+l',
7372
windows: 'alt+l',
7473
handler: (event) => {
7574
event.preventDefault();
@@ -81,6 +80,6 @@ const HotKeyProvider: React.FC<{ children: ReactNode }> = ({ children }: { child
8180

8281
// 直接返回 children 即可
8382
return children;
84-
}
83+
};
8584

86-
export default HotKeyProvider;
85+
export default HotKeyProvider;

src/components/KeepAlive/index.tsx

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1-
import { useTabStore } from '@/stores/tabStore';
2-
import KeepAlive, { useKeepAliveRef, type KeepAliveRef } from 'keepalive-for-react';
3-
import React, { memo, useEffect, useMemo } from 'react';
1+
import { useLocation } from '@tanstack/react-router';
2+
import KeepAlive, { type KeepAliveRef, useKeepAliveRef } from 'keepalive-for-react';
3+
import type React from 'react';
4+
import { memo, useEffect, useMemo } from 'react';
45
import { useShallow } from 'zustand/shallow';
6+
import { useTabStore } from '@/stores/tabStore';
57

68
interface KeepAliveProps {
79
children: React.ReactNode;
@@ -17,14 +19,13 @@ const KeepAliveLayout: React.FC<KeepAliveProps> = memo(({ children }) => {
1719
activeKey: state.activeKey,
1820
}))
1921
);
22+
const location = useLocation();
2023

2124
const aliveRef = useKeepAliveRef();
2225

2326
// Filter tabs that should be kept alive
2427
const keepAliveIncludes = useMemo(() => {
25-
return tabs
26-
.filter((tab) => tab.route?.meta?.keepAlive)
27-
.map((tab) => tab.key);
28+
return tabs.filter((tab) => tab.route?.meta?.keepAlive).map((tab) => tab.key);
2829
}, [tabs]);
2930

3031
// Handle Reload
@@ -53,16 +54,16 @@ const KeepAliveLayout: React.FC<KeepAliveProps> = memo(({ children }) => {
5354
}, [tabs]);
5455

5556
return (
56-
<KeepAlive
57-
viewTransition
58-
aliveRef={aliveRef as React.RefObject<KeepAliveRef | undefined>}
59-
activeCacheKey={activeKey}
60-
include={keepAliveIncludes}
61-
max={10} // Default max, can be configured
62-
cacheNodeClassName="h-full w-full" // Ensure cached nodes take full height/width if needed
63-
>
64-
{children}
65-
</KeepAlive>
57+
<KeepAlive
58+
viewTransition
59+
aliveRef={aliveRef as React.RefObject<KeepAliveRef | undefined>}
60+
activeCacheKey={activeKey || location.pathname}
61+
include={keepAliveIncludes}
62+
max={10} // Default max, can be configured
63+
cacheNodeClassName="h-full w-full" // Ensure cached nodes take full height/width if needed
64+
>
65+
{children}
66+
</KeepAlive>
6667
);
6768
});
6869

src/hooks/usePlatformHotkey.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@ type PlatformHotkeyOptions = {
1616
* @returns 返回当前使用的快捷键
1717
*/
1818
export const usePlatformHotkey = ({ mac, windows, handler, enabled = true }: PlatformHotkeyOptions) => {
19-
const isMacOS = /Mac|iPod|iPhone|iPad/.test(navigator.platform);
20-
const hotkey = isMacOS ? mac : windows;
19+
const isMacOS = (navigator as any).userAgentData?.platform === 'macOS';
20+
const hotkey = isMacOS ? mac.replace('l', 'KeyL').replace('k', 'KeyK').replace(',', 'KeyComma') : windows;
2121

2222
// 使用 enabled 选项控制快捷键是否启用
23-
useHotkeys(hotkey, handler, { enabled });
23+
useHotkeys(hotkey, handler, { enabled, enableOnContentEditable: false });
2424

2525
return hotkey;
2626
};

src/layouts/Content/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ const Content = memo(({ children }: ContentProps) => {
3434

3535
return (
3636
<Layout.Content
37-
className="overflow-x-hidden overflow-y-auto h-full relative flex flex-col p-2"
37+
className="overflow-x-hidden overflow-y-auto h-full relative flex flex-col p-3"
3838
style={{ overscrollBehavior: 'contain' }}
3939
>
4040
<Suspense fallback={loadingFallback}>

src/layouts/Header/component/BreadcrumbNav.tsx

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
1-
import { useMenuStore, usePreferencesStore } from '@/stores/store';
2-
import type { RouteItem } from '@/types/route';
3-
import { getIcon } from '@/utils/optimized-icons';
4-
import { matchPathname, type MenuCaches } from '@/utils/utils';
51
import { Link, useRouterState } from '@tanstack/react-router';
62
import { Breadcrumb } from 'antd';
73
import { t } from 'i18next';
84
import type React from 'react';
9-
import { memo, useEffect, useState } from 'react';
5+
import { useEffect, useState } from 'react';
106
import { useTranslation } from 'react-i18next';
117
import { useShallow } from 'zustand/react/shallow';
8+
import { useMenuStore, usePreferencesStore } from '@/stores/store';
9+
import type { RouteItem } from '@/types/route';
10+
import { getIcon } from '@/utils/optimized-icons';
11+
import { type MenuCaches, matchPathname } from '@/utils/utils';
1212
import '../header.scss';
1313

1414
/**
@@ -42,7 +42,7 @@ const BreadcrumbNav: React.FC = () => {
4242
// 组件的DOM内容
4343
return <Breadcrumb items={items} className="flex justify-between items-center ml-[16px]! nexus-breadcrumb" />;
4444
};
45-
export default memo(BreadcrumbNav);
45+
export default BreadcrumbNav;
4646

4747
/**
4848
* 根据路径生成面包屑的路径内容
@@ -102,17 +102,18 @@ function patchBreadcrumb(
102102
const iconNode = joinIcon && menu.meta?.icon ? getIcon(menu.meta.icon) : null;
103103
const titleContent = t(menu.meta?.title as string);
104104
const isNotRoute = menu.meta?.menuType !== 2;
105-
const title = (isLast || isNotRoute) ? (
106-
<>
107-
{iconNode}
108-
<span className="px-1">{titleContent}</span>
109-
</>
110-
) : (
111-
<>
112-
{iconNode}
113-
<Link to={menu.path}>{titleContent}</Link>
114-
</>
115-
);
105+
const title =
106+
isLast || isNotRoute ? (
107+
<>
108+
{iconNode}
109+
<span className="px-1">{titleContent}</span>
110+
</>
111+
) : (
112+
<>
113+
{iconNode}
114+
<Link to={menu.path}>{titleContent}</Link>
115+
</>
116+
);
116117

117118
breadcrumbItems.push({
118119
key: menu.path,

0 commit comments

Comments
 (0)