Commit babe5f83 by zhaochengxiang

去掉资产地图

parent ae34e146
...@@ -8,7 +8,6 @@ import { ContextPath } from './util'; ...@@ -8,7 +8,6 @@ import { ContextPath } from './util';
import Signin from './view/Signin'; import Signin from './view/Signin';
import Home from './view/Home'; import Home from './view/Home';
import Manage from './view/Manage'; import Manage from './view/Manage';
import Map from './view/Manage/Map';
import Model from './view/Manage/Model'; import Model from './view/Manage/Model';
import ModelConfig from './view/Manage/ModelConfig'; import ModelConfig from './view/Manage/ModelConfig';
import AssetManage from './view/Manage/AssetManage'; import AssetManage from './view/Manage/AssetManage';
...@@ -115,7 +114,6 @@ export class App extends React.Component { ...@@ -115,7 +114,6 @@ export class App extends React.Component {
<Route path={'/center-home/view/datasource-manage'} component={DatasourceManage} exact /> <Route path={'/center-home/view/datasource-manage'} component={DatasourceManage} exact />
<Route path={'/center-home/view/data-model'} component={Model} exact /> <Route path={'/center-home/view/data-model'} component={Model} exact />
<Route path={'/center-home/view/model-config'} component={ModelConfig} exact /> <Route path={'/center-home/view/model-config'} component={ModelConfig} exact />
<Route path={'/center-home/view/asset-map'} component={Map} exact />
<Route path={'/center-home/view/asset-manage'} component={AssetManage} exact /> <Route path={'/center-home/view/asset-manage'} component={AssetManage} exact />
<Route path={'/center-home/view/asset-resource-browse'} component={AssetResourceBrowse} exact /> <Route path={'/center-home/view/asset-resource-browse'} component={AssetResourceBrowse} exact />
<Route path={'/center-home/view/asset-browse'} component={AssetBrowse} exact /> <Route path={'/center-home/view/asset-browse'} component={AssetBrowse} exact />
...@@ -124,7 +122,6 @@ export class App extends React.Component { ...@@ -124,7 +122,6 @@ export class App extends React.Component {
<Route path={'/center-home/menu/datasource-manage'} component={DatasourceManage} exact /> <Route path={'/center-home/menu/datasource-manage'} component={DatasourceManage} exact />
<Route path={'/center-home/menu/data-model'} component={Model} exact /> <Route path={'/center-home/menu/data-model'} component={Model} exact />
<Route path={'/center-home/menu/model-config'} component={ModelConfig} exact /> <Route path={'/center-home/menu/model-config'} component={ModelConfig} exact />
<Route path={'/center-home/menu/asset-map'} component={Map} exact />
<Route path={'/center-home/menu/asset-manage'} component={AssetManage} exact /> <Route path={'/center-home/menu/asset-manage'} component={AssetManage} exact />
<Route path={'/center-home/menu/asset-resource-browse'} component={AssetResourceBrowse} exact /> <Route path={'/center-home/menu/asset-resource-browse'} component={AssetResourceBrowse} exact />
<Route path={'/center-home/menu/asset-browse'} component={AssetBrowse} exact /> <Route path={'/center-home/menu/asset-browse'} component={AssetBrowse} exact />
......
...@@ -24,10 +24,6 @@ export const routes = [ ...@@ -24,10 +24,6 @@ export const routes = [
text: '模型配置', text: '模型配置',
}, },
{ {
name: 'asset-map',
text: '资产地图',
},
{
name: 'asset-manage', name: 'asset-manage',
text: '资产管理', text: '资产管理',
}, },
......
import React from 'react';
import { Chart } from '@antv/g2';
class Bar extends React.Component {
componentDidMount() {
const { data, type } = this.props;
setTimeout(() => {
const chart = new Chart({
container: `bar${type||''}`,
autoFit: true,
});
chart.data(data);
chart.scale('value', {
nice: true,
});
chart.tooltip({
showMarkers: false
});
chart.interaction('active-region');
chart.interval().position('name*value');
chart.render();
}, 100);
}
render() {
const { type } = this.props;
return (
<div id={`bar${type||''}`} style={{ width: '100%', height: 150 }}></div>
)
}
}
export default Bar;
\ No newline at end of file
import React from 'react';
import { Chart } from '@antv/g2';
class HorizontalBar extends React.Component {
componentDidMount() {
const { data, type } = this.props;
setTimeout(() => {
const chart = new Chart({
container: `horizontal-bar${type||''}`,
autoFit: true,
});
chart.data(data);
chart.scale('value', { nice: true });
chart.coordinate().transpose();
chart.tooltip({
showMarkers: false
});
chart.interaction('active-region');
chart.interval().position('name*value');
chart.render();
}, 100);
}
render() {
const { type } = this.props;
return (
<div id={`horizontal-bar${type||''}`} style={{ width: '100%', height: 350 }}></div>
)
}
}
export default HorizontalBar;
\ No newline at end of file
import React from 'react';
import G6 from '@antv/g6';
const globalFontSize = 20;
const maxTextWidth = 160;
class Org extends React.Component {
componentDidUpdate(prevProps, prevState) {
const { childData, parentNodeId, data } = this.props;
if (parentNodeId && parentNodeId!== prevProps.parentNodeId) {
const parentData = this.graph?.findDataById(parentNodeId);
if (!parentData.children) {
parentData.children = [];
}
parentData.children = parentData.children.filter(item => item.dbType!=='More');
parentData.children = [...parentData.children, ...childData];
this.graph?.changeData();
this.graph?.updateItem(this.graph?.findById(parentNodeId), {
collapsed: false,
});
} else if (data && data !== prevProps.data && parentNodeId===null) {
this.graph?.destroy();
this.graph = init(this)(this.elem, this.props.data);
}
}
graph = undefined
elem = undefined
render() {
const { styles } = this.props;
return (
<div ref={ref => this.elem = ref} style={styles} />
);
}
}
export default Org;
const init = (ctx) => function (container, data) {
const width = container.scrollWidth;
const height = container.scrollHeight;
const tooltip = new G6.Tooltip({
offsetX: 10,
offsetY: 10,
// the types of items that allow the tooltip show up
// 允许出现 tooltip 的 item 类型
itemTypes: ['node'],
// custom the tooltip's content
// 自定义 tooltip 内容
getContent: (e) => {
const outDiv = document.createElement('div');
outDiv.style.width = 'fit-content';
//outDiv.style.padding = '0px 0px 20px 0px';
outDiv.innerHTML = `
<h4>${e.item.getModel().text||''}</h4>
`;
return outDiv;
},
});
var graph = new G6.TreeGraph({
container,
width,
height,
linkCenter: true,
maxZoom: 1,
plugins: [tooltip],
modes: {
default: [
{
type: 'collapse-expand',
onChange: function onChange(item, collapsed) {
const data = item.get('model');
graph.updateItem(item, {
collapsed,
});
data.collapsed = collapsed;
return true;
},
},
'drag-canvas',
'zoom-canvas',
],
},
defaultNode: {
size: 26,
anchorPoints: [
[0, 0.5],
[1, 0.5],
],
},
defaultEdge: {
type: 'cubic-vertical',
size: 2,
color: '#e2e2e2',
},
layout: {
type: 'compactBox',
direction: 'TB',
getId: function getId(d) {
return d.id;
},
getVGap: function getVGap() {
return 200;
},
getHGap: function getHGap() {
return 40;
},
},
});
const fittingString = (str, maxWidth, fontSize) => {
const ellipsis = '...';
const ellipsisLength = G6.Util.getTextSize(ellipsis, fontSize)[0];
let currentWidth = 0;
let res = str;
const pattern = new RegExp('[\u4E00-\u9FA5]+'); // distinguish the Chinese charactors and letters
str.split('').forEach((letter, i) => {
if (currentWidth > maxWidth - ellipsisLength) return;
if (pattern.test(letter)) {
// Chinese charactors
currentWidth += fontSize;
} else {
// get the width of single letter according to the fontSize
currentWidth += G6.Util.getLetterWidth(letter, fontSize);
}
if (currentWidth > maxWidth - ellipsisLength) {
res = `${str.substr(0, i)}${ellipsis}`;
}
});
return res;
};
graph.node(function (node) {
return {
style: {
fill: (node.dbType==='Dir'||node.dbType==='More')?'#0069AC':'#fff',
stroke: '#096dd9'
},
label: fittingString(node.text||'', maxTextWidth, globalFontSize),
labelCfg: {
position: 'bottom',
offset: 5,
style: {
rotate: 0,
textAlign: 'center',
},
},
};
});
graph.data(data);
graph.render();
graph.fitView();
graph.on('node:click', function (e) {
const node = e.item;
const nodeId = node.get('id');
const model = node.getModel();
if (model.dbType==='Dir') {
const children = model.children;
if (!children ) {
ctx.props?.loadSubLeafData(model.dirId||'', nodeId);
}
} else if (model.dbType === 'Table') {
ctx.props?.onAssetClick(model.tid);
} else if (model.dbType === 'More') {
ctx.props?.loadMoreLeafData(model.pDirId, model.pid, model.index);
}
});
if (typeof window !== 'undefined') {
window.onresize = () => {
if (!graph || graph.get('destroyed')) return;
if (!container || !container.scrollWidth || !container.scrollHeight) return;
graph.changeSize(container.scrollWidth, container.scrollHeight);
};
}
return graph;
}
#left-control-container {
opacity: .5;
position: absolute;
top: 50%;
left: 20px;
width: 400px;
height: 620px;
margin-top: -310px;
background-image: url(./assets/border-left.0932.png);
background-size: cover;
background-position: 0;
-webkit-animation: leftflyin 1s;
animation: leftflyin 1s;
-webkit-animation-fill-mode: both;
animation-fill-mode: both;
pointer-events: none;
}
@-webkit-keyframes leftflyin {
0% {
transform: translate3d(-999px,0,0) scale3d(10,10,1)
}
to {
transform: translateZ(0) scaleX(1)
}
}
@keyframes leftflyin {
0% {
transform: translate3d(-999px,0,0) scale3d(10,10,1)
}
to {
transform: translateZ(0) scaleX(1)
}
}
#right-control-container {
opacity: .5;
position: absolute;
top: 50%;
right: 20px;
width: 400px;
height: 620px;
margin-top: -310px;
background-image: url(./assets/border-right.61f0.png);
background-size: cover;
background-position: 100%;
-webkit-animation: rightflyin 1s;
animation: rightflyin 1s;
-webkit-animation-fill-mode: both;
animation-fill-mode: both;
pointer-events: none
}
@-webkit-keyframes rightflyin {
0% {
transform: translate3d(999px,0,0) scale3d(10,10,1)
}
to {
transform: translateZ(0) scaleX(1)
}
}
@keyframes rightflyin {
0% {
transform: translate3d(999px,0,0) scale3d(10,10,1)
}
to {
transform: translateZ(0) scaleX(1)
}
}
#top-bg-container {
top: -120px;
height: 240px;
/* background-image: url(https://static.allhistory.com/online/common/img/top-bg.7c77.png); */
background-size: 100% 240px
}
#bottom-bg-container,#top-bg-container {
position: absolute;
width: 100%;
-webkit-animation: bottomfadein 1s 1s;
animation: bottomfadein 1s 1s;
-webkit-animation-fill-mode: both;
animation-fill-mode: both;
pointer-events: none
}
#bottom-bg-container {
bottom: 0;
height: 289px;
background-image: url(./assets/bottom-bg.8d9e.png);
background-size: cover;
background-position: top
}
@-webkit-keyframes bottomfadein {
0% {
opacity: 0
}
to {
opacity: 1
}
}
@keyframes bottomfadein {
0% {
opacity: 0
}
to {
opacity: 1
}
}
\ No newline at end of file
import React from 'react';
import { Row, Col } from 'antd';
import classnames from 'classnames';
import './SquareItem.less';
import dirImg from "./assets/1.png";
import assetImg from "./assets/3.png";
class SquareItem extends React.Component {
onItemClick = () => {
const { item, onClick } = this.props;
if (onClick && item) {
if (item.dbType === 'Dir') {
onClick(item);
} else {
}
}
}
render() {
const { item } = this.props;
const title = (item.dbType==='Dir') ? (item.dirName||'') : (item.cnName||'');
const content = (item.dbType==='Dir') ? (item.subDirCount + item.tableModelCount) : (item.enName||'');
const rightClasses = classnames('right', {
'right-asset': (item.dbType!=='Dir')
});
return (
<Row className='map-square-item' onClick={this.onItemClick} style={{ cursor: (item.dbType==='Dir')?'pointer':'default' }}>
<Col span={8} className='left'>
<div className='flex' style={{ height: '100%', justifyContent: 'center', alignItems: 'center' }}>
<img src={(item.dbType==='Dir')?dirImg:assetImg} style={{ width: '38px', height: '38px' }} alt="" />
</div>
</Col>
<Col span={16} className={rightClasses} style={{ backgroundPosition: 'bottom right' }}>
<div className='flex' style={{ height: '100%', alignItems: 'center' }}>
<div className='flex-auto textOverflow'>
<div className='title textOverflow' title={title}>{title}</div>
<div className='content textOverflow' title={content}>{content}</div>
</div>
</div>
</Col>
</Row>
);
}
}
export default SquareItem;
\ No newline at end of file
.map-square-item {
height: 104px;
box-shadow: 0px 0px 7px 1px rgba(0, 0, 0, 0.08);
border-radius: 4px;
.left {
height: 100%;
background: #0069AC;
border-top-left-radius: 4px;
border-bottom-left-radius: 4px;
}
.right {
padding: 0 10px;
background-image: url('./assets/2.png');
background-repeat:no-repeat;
}
.right-asset {
background-image: url('./assets/4.png');
}
.title {
color: #C1C1C1;
font-size: 14px;
}
.content {
font-size: 25px;
font-weight: bold;
color: #575757;
margin-top: 10px;
}
}
\ No newline at end of file
import React from 'react';
import G6 from '@antv/g6';
let graph = null;
const globalFontSize = 20;
const maxTextWidth = 160;
const COLLAPSE_ICON = function COLLAPSE_ICON(x, y, r) {
return [
['M', x - r, y - r],
['a', r, r, 0, 1, 0, r * 2, 0],
['a', r, r, 0, 1, 0, -r * 2, 0],
['M', x + 2 - r, y - r],
['L', x + r - 2, y - r],
];
};
const EXPAND_ICON = function EXPAND_ICON(x, y, r) {
return [
['M', x - r, y - r],
['a', r, r, 0, 1, 0, r * 2, 0],
['a', r, r, 0, 1, 0, -r * 2, 0],
['M', x + 2 - r, y - r],
['L', x + r - 2, y - r],
['M', x, y - 2 * r + 2],
['L', x, y - 2],
];
};
class Tree extends React.Component {
componentDidUpdate(prevProps, prevState){
const { childData, parentNodeId, data } = this.props;
if (parentNodeId && parentNodeId!== prevProps.parentNodeId) {
const parentData = this.graph?.findDataById(parentNodeId);
if (!parentData.children) {
parentData.children = [];
}
parentData.children = parentData.children.filter(item => item.dbType!=='More');
parentData.children = [...parentData.children, ...childData];
this.graph?.changeData();
this.graph?.updateItem(this.graph?.findById(parentNodeId), {
collapsed: false,
});
} else if (data && data !== prevProps.data && parentNodeId===null) {
this.graph?.destroy();
this.graph = init(this)(this.elem, this.props.data);
}
}
graph = undefined
elem = undefined
render() {
const { styles } = this.props;
return (
<div ref={ref => this.elem = ref} style={styles} />
);
}
}
export default Tree;
const init = (ctx) => function (container, data) {
const width = container.scrollWidth;
const height = container.scrollHeight;
const tooltip = new G6.Tooltip({
offsetX: 10,
offsetY: 10,
// the types of items that allow the tooltip show up
// 允许出现 tooltip 的 item 类型
itemTypes: ['node'],
// custom the tooltip's content
// 自定义 tooltip 内容
getContent: (e) => {
const outDiv = document.createElement('div');
outDiv.style.width = 'fit-content';
//outDiv.style.padding = '0px 0px 20px 0px';
outDiv.innerHTML = `
<h4>${e.item.getModel().text||''}</h4>
`;
return outDiv;
},
});
graph = new G6.TreeGraph({
container,
animate: false,
width,
height,
maxZoom: 1,
plugins: [tooltip],
modes: {
default: [
{
type: 'collapse-expand',
onChange: function onChange(item, collapsed) {
const data = item.get('model');
graph.updateItem(item, {
collapsed,
});
data.collapsed = collapsed;
return true;
},
},
'drag-canvas',
'zoom-canvas',
],
},
defaultNode: {
type: 'tree-node',
anchorPoints: [
[0, 0.5],
[1, 0.5],
],
},
defaultEdge: {
type: 'cubic-horizontal',
size: 2,
color: '#e2e2e2',
style: {
endArrow: true
}
},
layout: {
type: 'compactBox',
direction: 'LR', // H / V / LR / RL / TB / BT
getId: function getId(d) {
return d.id;
},
getVGap: function getVGap() {
return 20;
},
getHGap: function getHGap() {
return 200;
},
},
});
const fittingString = (str, maxWidth, fontSize) => {
const ellipsis = '...';
const ellipsisLength = G6.Util.getTextSize(ellipsis, fontSize)[0];
let currentWidth = 0;
let res = str;
const pattern = new RegExp('[\u4E00-\u9FA5]+'); // distinguish the Chinese charactors and letters
str.split('').forEach((letter, i) => {
if (currentWidth > maxWidth - ellipsisLength) return;
if (pattern.test(letter)) {
// Chinese charactors
currentWidth += fontSize;
} else {
// get the width of single letter according to the fontSize
currentWidth += G6.Util.getLetterWidth(letter, fontSize);
}
if (currentWidth > maxWidth - ellipsisLength) {
res = `${str.substr(0, i)}${ellipsis}`;
}
});
return res;
};
graph.node(function (node) {
return {
label: fittingString(node.text||'', maxTextWidth, globalFontSize),
};
});
graph.data(data);
graph.render();
graph.fitView();
graph.on('node:click', function (e) {
const node = e.item;
const nodeId = node.get('id');
const model = node.getModel();
if (model.dbType==='Dir') {
const children = model.children;
if (!children) {
ctx.props?.loadSubLeafData(model.dirId||'', nodeId);
}
} else if (model.dbType === 'Table') {
ctx.props?.onAssetClick(model.tid);
} else if (model.dbType === 'More') {
ctx.props?.loadMoreLeafData(model.pDirId, model.pid, model.index);
}
});
if (typeof window !== 'undefined') {
window.onresize = () => {
if (!graph || graph.get('destroyed')) return;
if (!container || !container.scrollWidth || !container.scrollHeight) return;
graph.changeSize(container.scrollWidth, container.scrollHeight);
};
}
return graph;
}
G6.registerNode(
'tree-node',
{
draw(cfg, group) {
const rect = group.addShape('rect', {
attrs: {
fill: '#fff',
// stroke: '#666',
radius: 2,
shadowOffsetX: 1,
shadowOffsetY: 0,
shadowColor: 'rgba(0, 0, 0, 0.09)',
shadowBlur: 16,
cursor: (cfg.dbType==='Dir'||cfg.dbType==='More')?'pointer':'default',
},
});
const topRect = group.addShape('rect', {
attrs: {
height: 4,
fill: '#0069AC',
}
})
const content = (cfg.label||'').replace(/(.{19})/g, '$1\n');
const text = group.addShape('text', {
attrs: {
x: 0,
y: 8,
fill: '#000',
fontSize: globalFontSize,
textAlign: 'left',
textBaseline: 'middle',
text: content,
cursor: (cfg.dbType==='Dir'||cfg.dbType==='More')?'pointer':'default',
}
});
const bbox = text.getBBox();
if (cfg.dbType==='Dir') {
if (!cfg.children) {
group.addShape('marker', {
attrs: {
x: bbox.maxX + 12,
y: bbox.height/2 + 8 -3,
r: 6,
symbol: EXPAND_ICON,
stroke: '#73d13d',
lineWidth: 2,
cursor: 'pointer'
}
});
} else if ((cfg.children||[]).length>0) {
group.addShape('marker', {
attrs: {
x: bbox.maxX + 12,
y: bbox.height/2 + 8 -3,
r: 6,
symbol: cfg.collapsed ? EXPAND_ICON : COLLAPSE_ICON,
stroke: cfg.collapsed ? '#73d13d' : '#ff4d4f',
lineWidth: 2,
cursor: 'pointer',
}
});
}
}
topRect.attr({
x: bbox.minX - 10,
y: bbox.minY - 10,
width: bbox.width + (cfg.dbType==='Dir'&&(!cfg.children||((cfg.children||[]).length>0)) ? 38 : 20),
})
rect.attr({
x: bbox.minX - 10,
y: bbox.minY - 10,
width: bbox.width + (cfg.dbType==='Dir'&&(!cfg.children||((cfg.children||[]).length>0)) ? 38 : 20),
height: bbox.height + 20,
});
return group;
},
update: undefined,
},
'single-node'
);
\ No newline at end of file
import React from 'react';
import { Spin, Radio, Tooltip, Tag } from 'antd';
import MapContent from './MapContent';
import { dispatchLatest } from '../../../model';
import './index.less';
const { CheckableTag } = Tag;
const graphModes = [
{
title: '方块图',
key: 'square'
},
{
title: '组织图',
key: 'org',
},
{
title: '树形图',
key: 'tree',
},
{
title: '关系图',
key: 'relation'
}
];
class Map extends React.Component {
constructor(props) {
super(props);
this.state = {
type: 'square',
tabKey: '',
loadingTopics: false,
resourceTopics: null,
assetTopics: null,
selectedTopic: {}
};
}
componentDidMount() {
this.setState({ loadingTopics: true }, () => {
dispatchLatest({
type: 'map.getAllTopics',
payload: null,
callback: data => {
this.setState({
loadingTopics: false,
resourceTopics: (data||[]).filter(item=>(item.code==='001'||item.code==='002')),
assetTopics: (data||[]).filter(item=>(item.code!=='001'&&item.code!=='002')),
selectedTopic: (data||[]).length>0?data[0]:{}
});
},
error: () => {
this.setState({ loadingTopics: false });
}
})
})
}
onTypeChange = e => {
this.setState({ type: e.target.value });
};
onTabChange = activeKey => {
this.setState({ tabKey: activeKey });
}
onTagChange = (item, checked) => {
if (checked) {
this.setState({ selectedTopic: item });
}
}
render() {
const { type, resourceTopics, assetTopics, loadingTopics, selectedTopic } = this.state;
const switchMode = <div className=''>
<Radio.Group
value={type}
onChange={this.onTypeChange} size="small"
>
{
graphModes && graphModes.map((mode, index) => {
return (
<Tooltip key={index} title={mode.title || ''} >
<Radio.Button value={mode.key}>{(mode.title || '').substring(0, 1)}</Radio.Button>
</Tooltip>
);
})
}
</Radio.Group>
</div>
return (
<div className='asset-map' style={{ backgroundColor: '#fff' }}>
{
loadingTopics ? <Spin /> : <>
<div
className='flex'
style={{
alignItems: 'center',
justifyContent: 'space-between',
height: 64,
borderBottom: '1px solid #f0f0f0',
margin: '0px 10px'
}}
>
<div>
<span>数据资源: </span>
{
resourceTopics && resourceTopics.map(item => {
return (
<CheckableTag
key={item.id}
checked={selectedTopic?.id===item.id}
onChange={checked => this.onTagChange(item, checked)}
>
{item.name}
</CheckableTag>
);
})
}
</div>
<div>
<span>数据资产: </span>
{
assetTopics && assetTopics.map(item => {
return (
<CheckableTag
key={item.id}
checked={selectedTopic?.id===item.id}
onChange={checked => this.onTagChange(item, checked)}
>
{item.name}
</CheckableTag>
);
})
}
</div>
</div>
<div className='map-container' >
<MapContent type={type} topic={selectedTopic} switchMode={switchMode} {...this.props} />
</div>
</>
}
</div>
);
}
}
export default Map;
\ No newline at end of file
@import '../../../variables.less';
.asset-map {
height: calc(100vh - @header-height - @pm-4);
.yy-tag {
font-size: 14px;
margin-right: 2px;
}
.map-container {
height: calc(100vh - @header-height - @pm-4 - 64px) !important;
overflow: auto !important;
}
}
\ No newline at end of file
...@@ -6,7 +6,6 @@ import { GetSession } from "../../util"; ...@@ -6,7 +6,6 @@ import { GetSession } from "../../util";
import { ManageLayout } from "../../layout"; import { ManageLayout } from "../../layout";
import DatasourceManage from './DatasourceManage'; import DatasourceManage from './DatasourceManage';
import Map from './Map';
import Model from './Model'; import Model from './Model';
import ModelConfig from './ModelConfig'; import ModelConfig from './ModelConfig';
import AssetManage from './AssetManage'; import AssetManage from './AssetManage';
...@@ -30,7 +29,6 @@ class Manage extends Component { ...@@ -30,7 +29,6 @@ class Manage extends Component {
<Route path={`${match.path}/datasource-manage`} component={DatasourceManage} /> <Route path={`${match.path}/datasource-manage`} component={DatasourceManage} />
<Route path={`${match.path}/data-model`} component={Model} /> <Route path={`${match.path}/data-model`} component={Model} />
<Route path={`${match.path}/model-config`} component={ModelConfig} /> <Route path={`${match.path}/model-config`} component={ModelConfig} />
<Route path={`${match.path}/asset-map`} component={Map} />
<Route path={`${match.path}/asset-manage`} component={AssetManage} /> <Route path={`${match.path}/asset-manage`} component={AssetManage} />
<Route path={`${match.path}/asset-resource-browse`} component={AssetResourceBrowse} /> <Route path={`${match.path}/asset-resource-browse`} component={AssetResourceBrowse} />
<Route path={`${match.path}/asset-browse`} component={AssetBrowse} /> <Route path={`${match.path}/asset-browse`} component={AssetBrowse} />
......
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