Skip to content

Commit e2b23e7

Browse files
authored
Merge pull request #641 from actiontech/feature/availability-zone
Feature/availability zone
2 parents 5f89c1a + 1944bdb commit e2b23e7

File tree

45 files changed

+1589
-52
lines changed

Some content is hidden

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

45 files changed

+1589
-52
lines changed

packages/base/src/App.tsx

Lines changed: 48 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,11 @@
1-
import { ReactNode, Suspense, useEffect, useMemo, useState } from 'react';
1+
import {
2+
ReactNode,
3+
Suspense,
4+
useCallback,
5+
useEffect,
6+
useMemo,
7+
useState
8+
} from 'react';
29
import { RouteObject, useLocation, useRoutes } from 'react-router-dom';
310
import { AuthRouterConfig, unAuthRouterConfig } from './router/router';
411
import { IReduxState } from './store';
@@ -42,7 +49,9 @@ import { updateModuleFeatureSupport } from './store/permission';
4249
import { ROUTE_PATHS } from '@actiontech/shared/lib/data/routePaths';
4350
import useSyncDmsCloudBeaverChannel from './hooks/useSyncDmsCloudBeaverChannel';
4451
import { getSystemModuleStatusModuleNameEnum } from '@actiontech/shared/lib/api/sqle/service/system/index.enum';
45-
52+
import EventEmitter from './utils/EventEmitter';
53+
import EmitterKey from './data/EmitterKey';
54+
import useRecentlySelectedZone from './hooks/useRecentlySelectedZone';
4655
import './index.less';
4756

4857
dayjs.extend(updateLocale);
@@ -93,6 +102,8 @@ function App() {
93102

94103
const dispatch = useDispatch();
95104

105+
const { initializeAvailabilityZone } = useRecentlySelectedZone();
106+
96107
const { notificationContextHolder } = useNotificationContext();
97108

98109
const { getUserBySession } = useSessionUser();
@@ -184,37 +195,49 @@ function App() {
184195
elements
185196
]);
186197

198+
const getInitialData = useCallback(() => {
199+
getUserBySession({});
200+
updateDriverList();
201+
fetchModuleSupportStatus().then((response) => {
202+
if (response) {
203+
dispatch(
204+
updateModuleFeatureSupport({
205+
sqlOptimization:
206+
!!response?.[
207+
getSystemModuleStatusModuleNameEnum.sql_optimization
208+
],
209+
knowledge:
210+
!!response?.[getSystemModuleStatusModuleNameEnum.knowledge_base]
211+
})
212+
);
213+
}
214+
});
215+
}, [dispatch, fetchModuleSupportStatus, getUserBySession, updateDriverList]);
216+
187217
useEffect(() => {
188218
if (token) {
189-
getUserBySession({});
190-
updateDriverList();
191-
fetchModuleSupportStatus().then((response) => {
192-
if (response) {
193-
dispatch(
194-
updateModuleFeatureSupport({
195-
sqlOptimization:
196-
!!response?.[
197-
getSystemModuleStatusModuleNameEnum.sql_optimization
198-
],
199-
knowledge:
200-
!!response?.[getSystemModuleStatusModuleNameEnum.knowledge_base]
201-
})
202-
);
203-
}
204-
});
219+
getInitialData();
205220
}
206-
}, [
207-
getUserBySession,
208-
token,
209-
updateDriverList,
210-
fetchModuleSupportStatus,
211-
dispatch
212-
]);
221+
}, [token, getInitialData]);
213222

214223
useEffect(() => {
215224
i18n.changeLanguage(currentLanguage);
216225
}, [currentLanguage]);
217226

227+
// #if [ee]
228+
useEffect(() => {
229+
const { unsubscribe } = EventEmitter.subscribe(
230+
EmitterKey.DMS_Reload_Initial_Data,
231+
getInitialData
232+
);
233+
234+
return unsubscribe;
235+
}, [getInitialData]);
236+
237+
useEffect(() => {
238+
initializeAvailabilityZone();
239+
}, [initializeAvailabilityZone]);
240+
// #endif
218241
useSyncDmsCloudBeaverChannel();
219242

220243
return (

packages/base/src/data/EmitterKey.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,10 @@ enum EmitterKey {
1414
DMS_Refresh_Sync_Data_Source = 'DMS_Refresh_Sync_Data_Source',
1515
DMS_Refresh_Global_Data_Source = 'DMS_Refresh_Global_Data_Source',
1616
DMS_Batch_Test_Data_Source_Connection = 'DMS_Batch_Test_Data_Source_Connection',
17-
Refresh_Resource_Overview_Page = 'Refresh_Resource_Overview_Page'
17+
Refresh_Resource_Overview_Page = 'Refresh_Resource_Overview_Page',
18+
Refresh_Availability_Zone_Page = 'Refresh_Availability_Zone_Page',
19+
Refresh_Availability_Zone_Selector = 'Refresh_Availability_Zone_Selector',
20+
DMS_Reload_Initial_Data = 'DMS_Reload_Initial_Data'
1821
}
1922

2023
export default EmitterKey;

packages/base/src/data/ModalName.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,5 +28,8 @@ export enum ModalName {
2828
//data export
2929
DMS_UPDATE_EXPORT_TASK_INFO = 'DMS_UPDATE_EXPORT_TASK_INFO',
3030

31-
Cloud_Beaver_Sql_Operation_Audit_Detail = 'Cloud_Beaver_Sql_Operation_Audit_Detail'
31+
Cloud_Beaver_Sql_Operation_Audit_Detail = 'Cloud_Beaver_Sql_Operation_Audit_Detail',
32+
33+
DMS_Create_Availability_zone = 'DMS_Create_Availability_zone',
34+
DMS_Update_Availability_zone = 'DMS_Update_Availability_zone'
3235
}
Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
import { useCallback } from 'react';
2+
import { LocalStorageWrapper } from '@actiontech/shared';
3+
import { StorageKey } from '@actiontech/shared/lib/enum';
4+
import { IUidWithName } from '@actiontech/shared/lib/api/base/service/common';
5+
import { cloneDeep, remove } from 'lodash';
6+
import { useSelector, useDispatch } from 'react-redux';
7+
import { IReduxState } from '../../store';
8+
import {
9+
updateMemorizedAvailabilityZone,
10+
updateRecentlySelectedZoneRecord
11+
} from '../../store/availabilityZone';
12+
13+
export const DEFAULT_MAX_SELECTED_ZONE_NUMBER = 3;
14+
15+
const useRecentlySelectedZone = () => {
16+
const { availabilityZone, recentlySelectedZoneRecord } = useSelector(
17+
(state: IReduxState) => ({
18+
availabilityZone: state.availabilityZone.memorizedAvailabilityZone,
19+
recentlySelectedZoneRecord:
20+
state.availabilityZone.recentlySelectedZoneRecord
21+
})
22+
);
23+
24+
const dispatch = useDispatch();
25+
26+
const setAvailabilityZone = useCallback(
27+
(zone: IUidWithName | undefined) => {
28+
dispatch(
29+
updateMemorizedAvailabilityZone({
30+
memorizedAvailabilityZone: zone
31+
})
32+
);
33+
},
34+
[dispatch]
35+
);
36+
37+
const setRecentlySelectedZoneRecord = useCallback(
38+
(record: IUidWithName[]) => {
39+
dispatch(
40+
updateRecentlySelectedZoneRecord({ recentlySelectedZoneRecord: record })
41+
);
42+
},
43+
[dispatch]
44+
);
45+
46+
const setStorageRecentlySelectedZoneRecord = useCallback(
47+
(record: IUidWithName[]) => {
48+
LocalStorageWrapper.set(
49+
StorageKey.DMS_AVAILABILITY_ZONE,
50+
JSON.stringify(record)
51+
);
52+
},
53+
[]
54+
);
55+
56+
const updateRecentlySelectedZone = useCallback(
57+
(zone: IUidWithName) => {
58+
setAvailabilityZone(zone);
59+
60+
const currentReocrd = cloneDeep(recentlySelectedZoneRecord ?? []);
61+
if (currentReocrd.some((v) => v.uid === zone.uid)) {
62+
remove(currentReocrd, (v) => v.uid === zone.uid);
63+
}
64+
65+
currentReocrd.unshift(zone);
66+
67+
if (currentReocrd.length > DEFAULT_MAX_SELECTED_ZONE_NUMBER) {
68+
currentReocrd.pop();
69+
}
70+
71+
setRecentlySelectedZoneRecord(currentReocrd);
72+
73+
setStorageRecentlySelectedZoneRecord(currentReocrd);
74+
},
75+
[
76+
recentlySelectedZoneRecord,
77+
setAvailabilityZone,
78+
setRecentlySelectedZoneRecord,
79+
setStorageRecentlySelectedZoneRecord
80+
]
81+
);
82+
83+
const verifyRecentlySelectedZoneRecord = (zoneTips: IUidWithName[]) => {
84+
// 如果当前选择的区域在已配置的区域中是不存在的,则从最近选择区域中移除并且删除当前选择的区域
85+
if (!zoneTips?.some((v) => v.uid === availabilityZone?.uid)) {
86+
setAvailabilityZone(undefined);
87+
const currentReocrd = cloneDeep(recentlySelectedZoneRecord ?? []);
88+
currentReocrd.forEach((i) => {
89+
if (i.uid === availabilityZone?.uid) {
90+
remove(currentReocrd, (v) => v.uid === i.uid);
91+
}
92+
});
93+
setRecentlySelectedZoneRecord(currentReocrd);
94+
95+
setStorageRecentlySelectedZoneRecord(currentReocrd);
96+
}
97+
98+
// 如果当前选择的区域在已配置的区域中存在,但是name不相同,则更新name
99+
if (
100+
zoneTips?.some(
101+
(v) =>
102+
v.uid === availabilityZone?.uid && v.name !== availabilityZone?.name
103+
)
104+
) {
105+
const name = zoneTips.find((v) => v.uid === availabilityZone?.uid)?.name;
106+
setAvailabilityZone({
107+
...availabilityZone,
108+
name: zoneTips.find((v) => v.uid === availabilityZone?.uid)?.name
109+
});
110+
const currentReocrd = cloneDeep(recentlySelectedZoneRecord ?? []);
111+
currentReocrd.forEach((i) => {
112+
if (i.uid === availabilityZone?.uid) {
113+
i.name = name;
114+
}
115+
});
116+
setRecentlySelectedZoneRecord(currentReocrd);
117+
118+
setStorageRecentlySelectedZoneRecord(currentReocrd);
119+
}
120+
};
121+
122+
const initializeAvailabilityZone = useCallback(() => {
123+
const data = LocalStorageWrapper.get(StorageKey.DMS_AVAILABILITY_ZONE);
124+
try {
125+
const parsedData = JSON.parse(data || '[]');
126+
setRecentlySelectedZoneRecord(parsedData);
127+
setAvailabilityZone(parsedData?.[0] ?? undefined);
128+
} catch (error) {
129+
// eslint-disable-next-line no-console
130+
console.error(error);
131+
}
132+
}, [setAvailabilityZone, setRecentlySelectedZoneRecord]);
133+
134+
return {
135+
availabilityZone,
136+
setAvailabilityZone,
137+
recentlySelectedZoneRecord,
138+
setRecentlySelectedZoneRecord,
139+
updateRecentlySelectedZone,
140+
initializeAvailabilityZone,
141+
verifyRecentlySelectedZoneRecord
142+
};
143+
};
144+
145+
export default useRecentlySelectedZone;
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
// eslint-disable-next-line import/no-anonymous-default-export
2+
export default {
3+
list: {
4+
title: '可用区配置',
5+
createAvailabilityZone: '新建可用区',
6+
updateAvailabilityZone: '更新可用区',
7+
8+
name: '可用区名称',
9+
address: '服务节点',
10+
11+
deleteConfirmTitle: '确定要删除可用区:{{name}}?',
12+
deleteSuccessTips: '删除成功'
13+
},
14+
wrapper: {
15+
modalTitle: '选择可用区',
16+
modalTips: '暂无最近选择的可用区,请选择一个可用区!'
17+
},
18+
form: {
19+
name: '可用区名称',
20+
node: '服务节点',
21+
identifier: '可用区标识符',
22+
createSuccessTips: '创建成功',
23+
updateSuccessTips: '更新成功'
24+
}
25+
};

packages/base/src/locale/zh-CN/dmsMenu.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,5 +74,8 @@ export default {
7474
copyRight: '© {{year}} 上海爱可生信息技术股份有限公司 版权所有',
7575
quickActions: {
7676
globalDashboard: '全局Dashboard'
77+
},
78+
availabilityZone: {
79+
switchAvailabilityZone: '切换可用区将重新加载数据,是否确认?'
7780
}
7881
};

packages/base/src/locale/zh-CN/dmsProject.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,5 +90,6 @@ export default {
9090
dataSource:
9191
'数据源:数据源是构建在业务基础上的实际操作对象。您可以在数据源层面执行具体的数据操作,如查询、更新和管理数据。'
9292
},
93-
resourceOverview: '资源全景视图'
93+
resourceOverview: '资源全景视图',
94+
availabilityZone: '配置可用区'
9495
};

packages/base/src/locale/zh-CN/index.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import dmsAccount from './dmsAccount';
1414
import dmsDataExport from './dmsDataExport';
1515
import dmsGlobalDataSource from './dmsGlobalDataSource';
1616
import resourceOverview from './resourceOverview';
17+
import availabilityZone from './availabilityZone';
1718
// eslint-disable-next-line import/no-anonymous-default-export
1819
export default {
1920
translation: {
@@ -31,6 +32,7 @@ export default {
3132
dmsAccount,
3233
dmsDataExport,
3334
dmsGlobalDataSource,
34-
resourceOverview
35+
resourceOverview,
36+
availabilityZone
3537
}
3638
};

0 commit comments

Comments
 (0)