Commit 4a234509 by zhaochengxiang

模型改成服务

parent a9565736
......@@ -78,6 +78,6 @@
"last 1 safari version"
]
},
"proxy": "http://139.198.126.96:8089",
"proxy": "http://139.198.127.28:8089",
"homepage": "http://myhost/data-govern"
}
......@@ -11,9 +11,9 @@ import * as datamodel from './datamodel';
import * as assetmanage from './assetmanage';
import * as tag from './tag';
import * as msd from './msd';
import * as psd from './psd';
import * as pds from './pds';
const funcs = Connect({ user, datamodel, map, assetmanage, datasource, tag, msd, psd })
const funcs = Connect({ user, datamodel, map, assetmanage, datasource, tag, msd, pds })
function* request(args) {
const { type, payload, callback, error } = args.args;
......
import * as psd from '../service/psd';
import * as pds from '../service/pds';
import { call } from 'redux-saga/effects';
export function* refreshCatalog(payload) {
return yield call(psd.refreshCatalog, payload);
return yield call(pds.refreshCatalog, payload);
}
export function* loadStateCatalog(payload) {
return yield call(psd.loadStateCatalog, payload);
return yield call(pds.loadStateCatalog, payload);
}
export function* saveCatalog(payload) {
return yield call(psd.saveCatalog, payload);
return yield call(pds.saveCatalog, payload);
}
export function* deleteCatalog(payload) {
return yield call(psd.deleteCatalog, payload);
return yield call(pds.deleteCatalog, payload);
}
export function* upDownCatalog(payload) {
return yield call(psd.upDownCatalog, payload);
return yield call(pds.upDownCatalog, payload);
}
export function* getServices(payload) {
return yield call(psd.getServices, payload);
return yield call(pds.getServices, payload);
}
export function* getStateServices(payload) {
return yield call(pds.getStateServices, payload)
}
export function* searchService(payload) {
return yield call(pds.searchService, payload)
}
export function* deleteService(payload) {
return yield call(psd.deleteService, payload);
return yield call(pds.deleteService, payload);
}
export function* recatalogService(payload) {
return yield call(psd.recatalogService, payload);
return yield call(pds.recatalogService, payload);
}
export function* nextState(payload) {
return yield call(psd.nextState, payload);
return yield call(pds.nextState, payload);
}
export function* getCheckoutService(payload) {
return yield call(pds.getCheckoutService, payload)
}
export function* getServiceDigest(payload) {
return yield call(pds.getServiceDigest, payload)
}
\ No newline at end of file
......@@ -47,10 +47,6 @@ export const routes = [
name: 'msd-manage',
text: '主数据管理'
},
{
name: 'data-service',
text: '数据服务管理'
},
]
}
];
......
......@@ -24,6 +24,14 @@ export function getServices(payload) {
return GetJSON("/pdataservice/pdsCURD/getCurrentDataServiceCatalog", payload)
}
export function getStateServices(payload) {
}
export function searchService(payload) {
}
export function deleteService(payload) {
return PostJSON("/pdataservice/pdsCURD/deleteDataService", payload);
}
......@@ -36,6 +44,14 @@ export function nextState(payload) {
return GetJSON("/pdataservice/pdsCURD/nextState", payload);
}
export function getCheckoutService(payload) {
}
export function getServiceDigest(payload) {
}
......
......@@ -388,13 +388,13 @@ export function getTextWidth(text, font='14px tabular-nums') {
}
export function getDataModelerRole(user) {
if ((user?.roles||[]).indexOf('ROLE_dataModeler_admin') !== -1) {
return DataModelerRoleAdmin;
} else if ((user?.roles||[]).indexOf('ROLE_dataModeler_user') !== -1) {
return DataModelerRoleUser;
} else if ((user?.roles||[]).indexOf('ROLE_dataModeler_reader') !== -1) {
return DataModelerRoleReader;
}
// if ((user?.roles||[]).indexOf('ROLE_dataModeler_admin') !== -1) {
// return DataModelerRoleAdmin;
// } else if ((user?.roles||[]).indexOf('ROLE_dataModeler_user') !== -1) {
// return DataModelerRoleUser;
// } else if ((user?.roles||[]).indexOf('ROLE_dataModeler_reader') !== -1) {
// return DataModelerRoleReader;
// }
return DataModelerRoleAdmin;
}
import { useMemo, useState } from 'react';
import classNames from 'classnames';
import { ResizableBox } from 'react-resizable';
import { CaretLeftOutlined, CaretRightOutlined } from '@ant-design/icons';
import Tree from './tree'
import '../DataMaster/Define/index.less';
const FC = (props) => {
const [collapse, setCollapse] = useState(false);
const classes = useMemo(() => {
return classNames('data-master', {
'data-master-collapse': collapse,
});
}, [collapse]);
const onCollapseClick = () => {
setCollapse(!collapse);
}
return (
<div className={classes}>
<ResizableBox
className='left-wrap'
width={230}
height={Infinity}
axis='x'
minConstraints={[230, Infinity]} maxConstraints={[Infinity, Infinity]}
>
<Tree />
</ResizableBox>
<div className='left-collapse-wrap'>
<div className='left-collapse' onClick={onCollapseClick}>
{ collapse ? <CaretRightOutlined /> : <CaretLeftOutlined /> }
</div>
</div>
<div className='right-wrap'>
</div>
</div>
)
}
export default FC;
\ No newline at end of file
import React, { useState, useEffect } from 'react';
import { Modal, Form, Input, Radio } from 'antd';
import { dispatchLatest } from '../../../model';
class UpdateTreeItemForm extends React.Component {
constructor(props){
super(props);
this.state = {
radioDisable: false
}
}
componentDidMount() {
this.radioState();
}
componentDidUpdate(preProps, preState) {
const { item } = this.props;
if (item!==preProps.item) {
this.radioState();
}
}
radioState = () => {
const { item } = this.props;
this.setState({ radioDisable: item? false: true })
}
render() {
const { type, form } = this.props;
const { radioDisable } = this.state;
const formItemLayout = {
labelCol: {
xs: { span: 24 },
sm: { span: 6 },
},
wrapperCol: {
xs: { span: 24 },
sm: { span: 18 },
},
};
return (
<Form
{...formItemLayout}
form={form}
>
{
type==='add'&&<Form.Item label="目录类型" name="action">
<Radio.Group disabled={radioDisable} >
<Radio value='root'>根目录</Radio>
<Radio value='sub'>子目录</Radio>
</Radio.Group>
</Form.Item>
}
<Form.Item
label="名称"
name="name"
rules={[{ required: true, message: '请输入名称!' }]}
>
<Input />
</Form.Item>
<Form.Item
label="描述"
name="remark"
rules={[{ required: true, message: '请输入描述!' }]}
>
<Input />
</Form.Item>
</Form>
);
}
}
const FC = (props) => {
const { onOk, type, item, onCancel, visible, rootId } = props;
const [ confirmLoading, setConfirmLoading ] = useState(false);
const [form] = Form.useForm();
useEffect(() => {
if (visible) {
let _action = '';
if (type === 'add') {
_action = item ? 'sub' : 'root';
}
form.setFields([{ name: 'name', errors: [] }, { name: 'remark', errors: [] }]);
if (type === 'add') {
form.setFieldsValue({ action: _action, name: '', remark: '' });
} else {
form.setFieldsValue({ action: '', name: item?item.name:'', remark: item?item.remark:'' });
}
}
//eslint-disable-next-line react-hooks/exhaustive-deps
}, [visible])
const handleOk = async () => {
setConfirmLoading(true);
try {
const values = await form.validateFields();
let payload = null;
if (type === 'add' && values.action==='root') {
payload = {
name: values.name||'',
remark: values.remark||'',
parentId: rootId
};
} else if (type === 'add') {
payload = {
name: values.name||'',
remark: values.remark||'',
parentId: item.id
};
} else {
payload = {
...item,
name: values.name||'',
remark: values.remark||'',
}
}
dispatchLatest({
type: 'psd.saveCatalog',
payload: {
data: payload
},
callback: id => {
setConfirmLoading(false);
if (onOk) {
onOk(id, payload);
}
},
error: () => {
setConfirmLoading(false);
}
});
} catch (errInfo) {
setConfirmLoading(false);
}
}
return (
<Modal
forceRender
confirmLoading={confirmLoading}
visible={visible}
title={type==='add'?"新增目录":"更新目录"}
onOk={handleOk}
onCancel={() => {
setConfirmLoading(false);
onCancel && onCancel();
}}
>
<UpdateTreeItemForm form={form} item={item} type={type} />
</Modal>
);
}
export default FC;
\ No newline at end of file
......@@ -22,7 +22,7 @@ const viewModes = [
},
{
key: 'state',
name: '模型状态视角'
name: '服务状态视角'
}
];
......@@ -62,10 +62,10 @@ const ModelTree = (props) => {
const id = getQueryParam(AnchorId, props.location?.search||'');
const did = getQueryParam(AnchorDirId, props.location?.search||'');
useEffect(() => {
getShowSyncAndDomains();
//eslint-disable-next-line react-hooks/exhaustive-deps
}, [])
// useEffect(() => {
// getShowSyncAndDomains();
// //eslint-disable-next-line react-hooks/exhaustive-deps
// }, [])
useEffect(() => {
if (refrence === 'recatalog') {
......@@ -75,7 +75,7 @@ const ModelTree = (props) => {
onViewChange && onViewChange(viewModes[0].key);
if ((id||'') !== '') {
getDataModelLocationThenGetDirTreeData();
// getDataModelLocationThenGetDirTreeData();
} else if ((did||'') !== '') {
getDirTreeData(did);
} else {
......@@ -105,47 +105,47 @@ const ModelTree = (props) => {
//eslint-disable-next-line react-hooks/exhaustive-deps
}, [ keyword ])
const getShowSyncAndDomains = () => {
dispatch({
type: 'datamodel.isSetRootDomainId',
callback: data => {
if (data === 'false') {
dispatch({
type: 'user.getDomains',
callback: _data => {
setDomains(_data||[]);
setIsSetRootId(false);
}
});
} else {
setIsSetRootId(true);
}
}
});
}
const getDataModelLocationThenGetDirTreeData = () => {
setLoading(true);
dispatch({
type: 'datamodel.getDataModelLocation',
payload: {
id
},
callback: data => {
getDirTreeData(data.easyDataModelerDataModelCatalogId||'', data.offset);
},
error: () => {
setLoading(false);
getDirTreeData();
}
});
}
// const getShowSyncAndDomains = () => {
// dispatch({
// type: 'datamodel.isSetRootDomainId',
// callback: data => {
// if (data === 'false') {
// dispatch({
// type: 'user.getDomains',
// callback: _data => {
// setDomains(_data||[]);
// setIsSetRootId(false);
// }
// });
// } else {
// setIsSetRootId(true);
// }
// }
// });
// }
// const getDataModelLocationThenGetDirTreeData = () => {
// setLoading(true);
// dispatch({
// type: 'datamodel.getDataModelLocation',
// payload: {
// id
// },
// callback: data => {
// getDirTreeData(data.easyDataModelerDataModelCatalogId||'', data.offset);
// },
// error: () => {
// setLoading(false);
// getDirTreeData();
// }
// });
// }
const getDirTreeData = (defaultSelectedId='', offset=null, type='refresh') => {
setLoading(true);
dispatch({
type: (type==='refresh')?'datamodel.refreshDataModelCatalog':'datamodel.loadDataModelCatalog',
type: (type==='refresh')?'pds.refreshCatalog':'datamodel.loadDataModelCatalog',
callback: data => {
data.key = data.id||'';
......@@ -218,7 +218,7 @@ const ModelTree = (props) => {
const getStateTreeData = () => {
setLoading(true);
dispatch({
type: 'datamodel.loadDataModelStateCatalog',
type: 'pds.loadStateCatalog',
callback: data => {
setLoading(false);
let _treeData = data?.subCatalogs||[];
......@@ -285,23 +285,23 @@ const ModelTree = (props) => {
}
}
const onSyncMenuClick = ({ key }) => {
// const onSyncMenuClick = ({ key }) => {
setDomainSelectedKey(key);
dispatch({
type: 'datamodel.setRootDomainId',
payload: {
params: {
domainId: key
}
},
callback: () => {
setIsSetRootId(true);
getDirTreeData('', null, 'load');
}
});
// setDomainSelectedKey(key);
// dispatch({
// type: 'datamodel.setRootDomainId',
// payload: {
// params: {
// domainId: key
// }
// },
// callback: () => {
// setIsSetRootId(true);
// getDirTreeData('', null, 'load');
// }
// });
}
// }
const onTreeSelect = (keys,data) => {
......@@ -340,7 +340,7 @@ const ModelTree = (props) => {
const moveNode = (steps) => {
setLoading(true);
dispatch({
type: 'datamodel.upDownModelCatalog',
type: 'pds.upDownCatalog',
payload: {
modelCatalogId: currentRightClickDir.id,
steps
......@@ -358,11 +358,11 @@ const ModelTree = (props) => {
const deleteNode = () => {
modal.confirm({
title: '提示!',
content: '删除目录会删除相关的模型,您确定删除吗?',
content: '删除目录会删除相关的服务,您确定删除吗?',
onOk: () => {
setLoading(true);
dispatch({
type: 'datamodel.deleteDataModelCatalog',
type: 'pds.deleteCatalog',
payload: {
params: {
easyDataModelerCatalogId: currentRightClickDir.id
......@@ -477,17 +477,17 @@ const ModelTree = (props) => {
</Menu>
);
const syncMenu = (
<Menu selectedKeys={[domainSelectedKey]} onClick={onSyncMenuClick}>
{
domains && domains.map(domain => {
return (
<Menu.Item key={domain.domainId} value={domain.domainId} >{domain.domainName}</Menu.Item>
)
})
}
</Menu>
);
// const syncMenu = (
// <Menu selectedKeys={[domainSelectedKey]} onClick={onSyncMenuClick}>
// {
// domains && domains.map(domain => {
// return (
// <Menu.Item key={domain.domainId} value={domain.domainId} >{domain.domainName}</Menu.Item>
// )
// })
// }
// </Menu>
// );
const classes = classnames('model-tree', {
'model-tree-recatalog': (refrence === 'recatalog')
......@@ -503,7 +503,7 @@ const ModelTree = (props) => {
borderBottom: "1px solid #EFEFEF",
height: 57,
alignItems: 'center',
justifyContent: (viewSelectedKey==='dir' && getDataModelerRole(user)===DataModelerRoleAdmin)?'space-between':'',
// justifyContent: (viewSelectedKey==='dir' && getDataModelerRole(user)===DataModelerRoleAdmin)?'space-between':'',
}}
>
<Dropdown overlay={exportMenu} placement="bottomLeft">
......@@ -514,24 +514,24 @@ const ModelTree = (props) => {
{
(viewSelectedKey==='dir' && getDataModelerRole(user)===DataModelerRoleAdmin) && (
<Tooltip title="新增目录" className='ml-2'>
<Tooltip title="新增目录" className='ml-6'>
<PlusOutlined className='default' onClick={add} style={{ fontSize:16,cursor:'pointer' }} />
</Tooltip>
)
}
{
{/* {
(viewSelectedKey==='dir' && getDataModelerRole(user)===DataModelerRoleAdmin) && (
<Tooltip title="存量模型导入" className='ml-2'>
<ImportOutlined className='default' onClick={() => { importStockModel && importStockModel() }} style={{ fontSize:16,cursor:'pointer' }} />
</Tooltip>
)
}
} */}
<Tooltip title="刷新目录" className='ml-2'>
<Tooltip title="刷新目录" className='ml-6'>
<Button type='text' icon={<ReloadOutlined className='default' />} size='small' onClick={refresh} />
</Tooltip>
{
{/* {
(viewSelectedKey==='dir' && getDataModelerRole(user)===DataModelerRoleAdmin) && !isSetRootId && (
<Dropdown overlay={syncMenu} placement="bottomLeft">
<Tooltip title="同步目录">
......@@ -539,15 +539,15 @@ const ModelTree = (props) => {
</Tooltip>
</Dropdown>
)
}
} */}
{
{/* {
(viewSelectedKey==='dir' && getDataModelerRole(user)===DataModelerRoleAdmin) && isSetRootId && (
<Tooltip title="同步目录" className='ml-2'>
<Button type='text' icon={<SyncOutlined className='default' />} size='small' onClick={sync} />
</Tooltip>
)
}
} */}
</div>
}
<div className='p-3'>
......
......@@ -129,7 +129,7 @@ const UpdateTreeItemModal = (props) => {
}
dispatchLatest({
type: 'datamodel.saveDataModelCatalog',
type: 'pds.saveCatalog',
payload: {
data: payload
},
......
......@@ -82,7 +82,7 @@ class Model extends React.Component {
getModelStates = () => {
this.setState({ loadingStates: true }, () => {
dispatch({
type: 'datamodel.loadDataModelStateCatalog',
type: 'pds.loadStateCatalog',
callback: data => {
this.setState({
loadingStates: false,
......@@ -139,7 +139,7 @@ class Model extends React.Component {
if (currentView === 'dir') {
const params = {
easyDataModelerCatalogId: catalogId,
pdsDataServiceCatalogId: catalogId,
};
if (currentModelState !== '') {
......@@ -147,10 +147,10 @@ class Model extends React.Component {
}
dispatchLatestHomepage({
type: 'datamodel.getCurrentDataModelCatalog',
type: 'pds.getServices',
payload: params,
callback: data => {
this.setState({ loadingTableData: false, tableData: data.easyDataModelerDataModels||[], filterTableData: data.easyDataModelerDataModels||[] });
this.setState({ loadingTableData: false, tableData: data.pdsdataServices||[], filterTableData: data.pdsdataServices||[] });
},
error: () => {
this.setState({ loadingTableData: false });
......@@ -158,12 +158,12 @@ class Model extends React.Component {
})
} else {
dispatchLatestHomepage({
type: 'datamodel.getCurrentDataModelStateCatalog',
type: 'pds.getStateServices',
payload: {
easyDataModelerStateCatalogId: catalogId
},
callback: data => {
this.setState({ loadingTableData: false, tableData: data.easyDataModelerDataModels||[], filterTableData: data.easyDataModelerDataModels||[] });
this.setState({ loadingTableData: false, tableData: data.pdsdataServices||[], filterTableData: data.pdsdataServices||[] });
},
error: () => {
this.setState({ loadingTableData: false });
......@@ -181,7 +181,7 @@ class Model extends React.Component {
}
dispatchLatestHomepage({
type: 'datamodel.searchModel',
type: 'pds.searchService',
payload: params,
callback: data => {
this.setState({ loadingTableData: false, tableData: data||[], filterTableData: data||[] });
......@@ -228,11 +228,11 @@ class Model extends React.Component {
onExportDDLBtnClick = () => {
const { selectModelerIds, tableData } = this.state;
if ((selectModelerIds||[]).length === 0) {
showMessage('info', '请先选择模型');
showMessage('info', '请先选择服务');
return;
}
//模型名称在导出ddl的时候有使用
//服务名称在导出ddl的时候有使用
const _selectModelerNames = [];
(selectModelerIds||[]).forEach(id => {
......@@ -255,7 +255,7 @@ class Model extends React.Component {
startFlow = () => {
const { selectModelerIds } = this.state;
if ((selectModelerIds||[]).length === 0) {
showMessage('info', '请先选择模型');
showMessage('info', '请先选择服务');
return;
}
......@@ -265,7 +265,7 @@ class Model extends React.Component {
onRecatalogBtnClick = () => {
const { selectModelerIds } = this.state;
if ((selectModelerIds||[]).length === 0) {
showMessage('info', '请先选择模型');
showMessage('info', '请先选择服务');
return;
}
......@@ -276,7 +276,7 @@ class Model extends React.Component {
const { selectModelerIds } = this.state;
if ((selectModelerIds||[]).length === 0) {
showMessage('info', '请先选择模型');
showMessage('info', '请先选择服务');
return;
}
......@@ -421,7 +421,7 @@ class Model extends React.Component {
const { catalogId } = this.state;
if ((catalogId||'') === '') {
showMessage('info', '请先选择模型目录');
showMessage('info', '请先选择服务目录');
return;
}
......@@ -473,10 +473,10 @@ class Model extends React.Component {
let disableStartFlow = false, startFlowTip = '';
if ((currentView==='dir'&&currentModelState==='2')||(currentView!=='dir'&&catalogId==='2')) {
disableStartFlow = true;
startFlowTip = '只有草稿状态下的模型才能送审';
startFlowTip = '只有草稿状态下的服务才能送审';
} else if ((selectModelerIds||[]).length===0) {
disableStartFlow = true;
startFlowTip = '请先选择模型';
startFlowTip = '请先选择服务';
}
return (
......@@ -510,35 +510,35 @@ class Model extends React.Component {
{
(getDataModelerRole(value?.user)!==DataModelerRoleReader) && <React.Fragment>
<Space>
<Button onClick={() => { this.setState({ importModalVisible: true }); }}>新建</Button>
<Button onClick={() => {}}>新建</Button>
</Space>
<Space>
<Tooltip title={(selectModelerIds||[]).length===0?'请先选择模型':''}>
{/* <Space>
<Tooltip title={(selectModelerIds||[]).length===0?'请先选择服务':''}>
<Button onClick={this.onExportOtherBtnClick} disabled={(selectModelerIds||[]).length===0}>导出</Button>
</Tooltip>
</Space>
</Space> */}
<Space>
{/* <Space>
<Tooltip title={startFlowTip}>
<Button onClick={this.startFlow} disabled={disableStartFlow}>送审</Button>
</Tooltip>
</Space>
</Space> */}
<Space>
<Tooltip title={(selectModelerIds||[]).length===0?'请先选择模型':''}>
<Tooltip title={(selectModelerIds||[]).length===0?'请先选择服务':''}>
<Button onClick={this.onRecatalogBtnClick} disabled={(selectModelerIds||[]).length===0}>变更目录</Button>
</Tooltip>
</Space>
<Space>
<Tooltip title={(selectModelerIds||[]).length===0?'请先选择模型':''}>
{/* <Space>
<Tooltip title={(selectModelerIds||[]).length===0?'请先选择服务':''}>
<Button onClick={this.onBatchDeleteBtnClick} disabled={(selectModelerIds||[]).length===0}>删除</Button>
</Tooltip>
</Space>
<Space>
</Space> */}
{/* <Space>
<Button onClick={this.onVisibleColSettingClick}>可见列设置</Button>
</Space>
</Space> */}
</React.Fragment>
}
</Space>
......@@ -564,15 +564,15 @@ class Model extends React.Component {
</Select>
</Space>
}
<Space>
{/* <Space>
<InputDebounce
placeholder="通过模型名称全文搜索"
placeholder="通过服务名称全文搜索"
allowClear
value={keyword}
onChange={(value) => { this.onSearchInputChange(value); }}
style={{ width: inputWidth, marginLeft: 'auto' }}
/>
</Space>
</Space> */}
</Space>
......@@ -600,35 +600,6 @@ class Model extends React.Component {
</div>
</div>
<ImportModal
view={currentView}
catalogId={catalogId}
visible={importModalVisible}
onCancel={this.onImportModalCancel}
onCancelByWord={this.onImportModalCancelByWord}
onCancelByDDL={this.onImportModalCancelByDDL}
/>
<ImportStockWordDrawer
visible={importStockWordDrawerVisible}
onCancel={this.onImportStockWordDrawerCancel}
catalogId={catalogId}
onSuccess={this.onImportStockWordSuccess}
/>
<ExportDDLModal
visible={exportDDLModalVisible}
reference={exportDDLModalReference}
ids={(exportDDLModalReference==='exportDDL')?selectModelerIds:[currentModel.id]}
names={selectModelerNames}
env={value?.env}
onCancel={this.onExportDDLModalCancel}
/>
<ExportOtherModal
visible={exportOtherModalVisible}
onCancel={this.onExportOtherModalCancel}
/>
<RecatalogModal
visible={recatalogModalVisible}
......@@ -641,23 +612,6 @@ class Model extends React.Component {
visible={historyAndVersionDrawerVisible}
onCancel={this.onHistoryAndVersionDrawerCancel}
/>
<StartFlowModal
ids={selectModelerIds}
visible={startFlowModalVisible}
onCancel={this.onStartFlowModalCancel}
/>
<DeleteTipModal
visible={showDeleteTip}
tip='您确定要删除这些模型吗?'
onCancel={this.onDeleteTipModalCancel}
/>
<ColSettingModal
visible={colSettingModalVisible}
onCancel={this.onColSettingModalCancel}
/>
</div>
}
</AppContext.Consumer>
......
......@@ -14,7 +14,6 @@ import AssetBrowse from './AssetBrowse';
import AssetRecycle from './AssetRecycle';
import DataMasterDefine from "./DataMaster/Define";
import DataMasterManage from "./DataMaster/Manage";
import DataServiceManage from './DataService';
class Manage extends Component {
......@@ -38,7 +37,6 @@ class Manage extends Component {
<Route path={`${match.path}/asset-recycle`} component={AssetRecycle} />
<Route path={`${match.path}/msd-define`} component={DataMasterDefine} />
<Route path={`${match.path}/msd-manage`} component={DataMasterManage} />
<Route path={`${match.path}/data-service`} component={DataServiceManage} />
</Switch>
) : (
<GetSession {...this.props} />
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment