Commit 4db77976 by zhaochengxiang

增加数据指标标准界面

parent 048f610d
...@@ -148,5 +148,5 @@ ...@@ -148,5 +148,5 @@
"react-app" "react-app"
] ]
}, },
"proxy": "http://139.198.126.96:9011" "proxy": "http://139.198.127.54:18391"
} }
...@@ -35,7 +35,7 @@ export class _Breadcrumb extends React.Component { ...@@ -35,7 +35,7 @@ export class _Breadcrumb extends React.Component {
} }
getParent(route); getParent(route);
this.unmounted === undefined && this.setState({ routes }); this.setState({ routes });
} }
render() { render() {
......
...@@ -8,8 +8,9 @@ import { Connect } from '../util'; ...@@ -8,8 +8,9 @@ import { Connect } from '../util';
import { reducers } from './reducer'; import { reducers } from './reducer';
import * as user from './user'; import * as user from './user';
import * as assets from './assets'; import * as assets from './assets';
import * as metadata from './metadata';
const funcs = Connect({ user, assets }) const funcs = Connect({ user, assets, metadata })
function* request(args) { function* request(args) {
const { type, payload, callback, error } = args.args; const { type, payload, callback, error } = args.args;
......
import * as service from '../service/metadata';
import { call } from 'redux-saga/effects';
export function* queryTopicAsTree(payload) {
let treeData = yield call(service.queryTopicAsTree, payload);
treeData = treeData || [];
for (let node of treeData) {
let children = yield call(service.queryChildTopicAsTree, {
parentId: node._id,
model: payload.model
});
children = children||[];
children.map(cnode=> {
cnode.title = cnode.name || '';
cnode.key = cnode._id;
return cnode;
})
node.loadData = true;
node.children = children;
node.title = node.name || '';
node.key = node._id;
node.isLeaf = (children.length===0)?true:false;
}
return treeData;
}
export function* queryChildTopicAsTree(payload) {
let childTreeData = yield call(service.queryChildTopicAsTree, payload);
childTreeData = childTreeData||[];
childTreeData.map(cnode=> {
cnode.title = cnode.name || '';
cnode.key = cnode._id;
return cnode;
})
return childTreeData;
}
export function* tableModelsByPage(payload) {
return yield call(service.tableModelsByPage, payload);
}
...@@ -20,3 +20,11 @@ export function* getUserSubscribeTableModels(payload) { ...@@ -20,3 +20,11 @@ export function* getUserSubscribeTableModels(payload) {
export function* listPrivilegeTableModels(payload) { export function* listPrivilegeTableModels(payload) {
return yield call(service.listPrivilegeTableModels, payload); return yield call(service.listPrivilegeTableModels, payload);
} }
export function* questions(payload) {
return yield call(service.questions, payload);
}
export function* domains(payload) {
return yield call(service.domains, payload);
}
...@@ -24,11 +24,11 @@ export const routes = [ ...@@ -24,11 +24,11 @@ export const routes = [
text: '元数据' text: '元数据'
}, },
{ {
name: 'dataindicator', name: 'indicator',
text: '数据指标' text: '数据指标'
}, },
{ {
name: 'datastandard', name: 'standard',
text: '数据标准' text: '数据标准'
}, },
{ {
......
import { GetJSON } from "../util/axios"
export function queryTopicAsTree(payload) {
return GetJSON("/metadatarepo/rest/metadata/getChildByPathAndClass", payload);
}
export function queryChildTopicAsTree(payload) {
return GetJSON("/metadatarepo/rest/metadata/getChild", payload);
}
export function tableModelsByPage(payload) {
return GetJSON("/metadatarepo/rest/metadata/getPageChild", payload)
}
\ No newline at end of file
...@@ -18,3 +18,11 @@ export function getUserSubscribeTableModels(payload) { ...@@ -18,3 +18,11 @@ export function getUserSubscribeTableModels(payload) {
export function listPrivilegeTableModels(payload) { export function listPrivilegeTableModels(payload) {
return GetJSON("/datacatalog/front/listPrivilegeTableModels") return GetJSON("/datacatalog/front/listPrivilegeTableModels")
} }
export async function questions(payload) {
return GetJSON("/questionfeedback/rest/issuetrack/mylist", payload);
}
export async function domains(payload) {
return GetJSON(`/authservice/users/${payload.userId}/domains`, payload);
}
...@@ -104,7 +104,7 @@ export class HomeSearch extends Component { ...@@ -104,7 +104,7 @@ export class HomeSearch extends Component {
} }
const homeMenu = [ const homeMenu = [
{ title: '数据资产', img: menuImg1, url: '/manage/assets' }, { title: '数据资产', img: menuImg1, url: `${ContextPath}/manage/assets` },
{ title: '元数据', img: menuImg2, url: '/center-home/view/metasearch' }, { title: '元数据', img: menuImg2, url: '/center-home/view/metasearch' },
{ title: '数据指标', img: menuImg3 }, { title: '数据指标', img: menuImg3 },
{ title: '数据标准', img: menuImg4 }, { title: '数据标准', img: menuImg4 },
......
...@@ -5,7 +5,7 @@ import { GetSession } from '../../util'; ...@@ -5,7 +5,7 @@ import { GetSession } from '../../util';
import { HomeLayout } from '../../layout'; import { HomeLayout } from '../../layout';
import { HomeSearch, HomeMenu, HomeGrid } from './HomeHelper'; import { HomeSearch, HomeMenu, HomeGrid } from './HomeHelper';
import { dispatchLatest } from '../../model'; import { dispatch } from '../../model';
class Home extends Component { class Home extends Component {
...@@ -17,14 +17,11 @@ class Home extends Component { ...@@ -17,14 +17,11 @@ class Home extends Component {
} }
componentDidMount() { componentDidMount() {
dispatch({
dispatchLatest({
type: 'assets.getDataFlowCount', type: 'assets.getDataFlowCount',
payload: {}, payload: {},
callback: data => { callback: data => {
(this.unmount===undefined) && this.setState({ this.setState({ flowCount: data })
flowCount: data,
})
} }
}) })
} }
......
...@@ -26,7 +26,7 @@ class Assets extends Component { ...@@ -26,7 +26,7 @@ class Assets extends Component {
type: 'assets.queryTopicAsTree', type: 'assets.queryTopicAsTree',
payload: null, payload: null,
callback: data => { callback: data => {
(this.unmount===undefined) && this.setState({ treeData: data }) this.setState({ treeData: data })
} }
}) })
...@@ -35,13 +35,13 @@ class Assets extends Component { ...@@ -35,13 +35,13 @@ class Assets extends Component {
getList = (node, pageNum = 1, pageSize = 10) => { getList = (node, pageNum = 1, pageSize = 10) => {
const { keyword } = this.state; const { keyword } = this.state;
if (node) { if (node) {
(this.unmount===undefined) && this.setState({ currentNode: node, pageNum, pageSize, loading: true }); this.setState({ currentNode: node, pageNum, pageSize, loading: true });
dispatch({ dispatch({
type: 'assets.listCatalogTableModelsByPage', type: 'assets.listCatalogTableModelsByPage',
payload: { dirId: node.nodeId, pageNum, pageSize, keyword }, payload: { dirId: node.nodeId, pageNum, pageSize, keyword },
callback: data => { callback: data => {
(this.unmount===undefined) && this.setState({ this.setState({
loading: false, loading: false,
items: data.data, items: data.data,
total: data.total total: data.total
......
...@@ -24,7 +24,7 @@ export class SearchBar extends Component { ...@@ -24,7 +24,7 @@ export class SearchBar extends Component {
type: 'assets.domains', type: 'assets.domains',
payload: null, payload: null,
callback: data => { callback: data => {
(this.unmount===undefined) && this.setState({ this.setState({
loadingDomain: false, loadingDomain: false,
domains: data domains: data
}); });
...@@ -37,7 +37,7 @@ export class SearchBar extends Component { ...@@ -37,7 +37,7 @@ export class SearchBar extends Component {
type: 'assets.getHotWord', type: 'assets.getHotWord',
payload: { topNum: 5 }, payload: { topNum: 5 },
callback: data => { callback: data => {
(this.unmount===undefined) && this.setState({ this.setState({
loadingHotWord: false, loadingHotWord: false,
hotWords: data hotWords: data
},()=>{ },()=>{
......
...@@ -11,12 +11,12 @@ class SearchResult extends Component { ...@@ -11,12 +11,12 @@ class SearchResult extends Component {
} }
getList = ( keyword, domain, pageNum = 1, pageSize = 10) => { getList = ( keyword, domain, pageNum = 1, pageSize = 10) => {
(this.unmount===undefined) && this.setState({ keyword, domain, pageNum, pageSize, loading: true },() => { this.setState({ keyword, domain, pageNum, pageSize, loading: true },() => {
dispatch({ dispatch({
type: 'assets.searchTableModelsByPage', type: 'assets.searchTableModelsByPage',
payload: { keyword, pageNum, domain, pageSize }, payload: { keyword, pageNum, domain, pageSize },
callback: data => { callback: data => {
(this.unmount===undefined) && this.setState({ this.setState({
loading: false, loading: false,
items: data.data, items: data.data,
total: data.total total: data.total
......
...@@ -8,6 +8,9 @@ import Assets from './Assets'; ...@@ -8,6 +8,9 @@ import Assets from './Assets';
import Search from './Search'; import Search from './Search';
import Subscrible from '../User/Subscrible'; import Subscrible from '../User/Subscrible';
import Authorized from '../User/Authorized'; import Authorized from '../User/Authorized';
import Question from '../User/Question';
import Indicator from '../Metadata/Indicator';
import Standard from '../Metadata/Standard';
class Manage extends Component { class Manage extends Component {
constructor() { constructor() {
...@@ -33,9 +36,11 @@ class Manage extends Component { ...@@ -33,9 +36,11 @@ class Manage extends Component {
component={Search} component={Search}
/> />
<Route path={`${match.path}/assets`} component={Assets} /> <Route path={`${match.path}/assets`} component={Assets} />
<Route path={`${match.path}/indicator`} component={Indicator} />
<Route path={`${match.path}/standard`} component={Standard} />
<Route path={`${match.path}/subscrible`} component={Subscrible} /> <Route path={`${match.path}/subscrible`} component={Subscrible} />
<Route path={`${match.path}/authorized`} component={Authorized} /> <Route path={`${match.path}/authorized`} component={Authorized} />
<Route path={`${match.path}/question`} component={Question} />
</Switch> </Switch>
) : ( ) : (
<GetSession {...this.props} /> <GetSession {...this.props} />
......
import React, { Component } from 'react';
import {
List,
Skeleton,
Row,
Col,
Typography,
Modal,
Tabs
} from 'antd';
import { DataDetail, DataDesc } from "./MetadataListHelper";
const { Text } = Typography;
const { TabPane } = Tabs;
export default class MetadataListCOM extends Component {
constructor(props) {
super(props);
this.state = {
tableModel: null,
showModal: false,
};
}
render() {
const { tableModels, loading } = this.props;
const { tableModel, showModal } = this.state;
const ListContent = ({ item }) => (
<React.Fragment>
<Row>
<Col md={8}>
<Text>类型:</Text>
{'数据指标'}
</Col>
<Col md={8}>
<Text>标签编号:</Text>
{item.name||''}
</Col>
<Col md={24}>
<Text>路径:</Text>
{item.namePath||''}
</Col>
<Col md={8}>
<Text>业务定义:</Text>
</Col>
<Col md={8}>
<Text>更新时间:</Text>
{item.lastUpdateTime||''}
</Col>
</Row>
</React.Fragment>
);
return (
<React.Fragment>
<List
loading={loading}
itemLayout="vertical"
dataSource={tableModels || []}
renderItem={item => (
<List.Item>
<Skeleton title={false} loading={loading} active>
<List.Item.Meta
title={
<div
className="pointer text-primary"
onClick={e => {
this.setState({ showModal: true, tableModel: item });
}}
>
<span dangerouslySetInnerHTML={{ __html: item.cnName || '' }} />
</div>
}
description={<ListContent item={item} />}
/>
</Skeleton>
</List.Item>
)}
/>
{tableModel && (
<Modal
className="modal-lg"
title={<span>数据资产详情:{tableModel.cnName||''}</span>}
visible={showModal}
width="calc(100vw - 50px)"
onCancel={e => {
this.setState({ showModal: false });
}}
>
<DataDetail
tableModel={tableModel}
/>
<Tabs
defaultActiveKey="description"
>
<TabPane tab="属性描述" key="description">
<DataDesc tableModel={tableModel} />
</TabPane>
</Tabs>
</Modal>
)}
</React.Fragment>
);
}
}
import React, { Component } from 'react';
import { Descriptions } from 'antd';
export class DataDetail extends Component {
render() {
const { tableModel } = this.props;
return (
<Descriptions size="small" column={2}>
<Descriptions.Item label="类型">
数据指标
</Descriptions.Item>
<Descriptions.Item label="标签编号">{tableModel.name||''}</Descriptions.Item>
<Descriptions.Item label="路径">{tableModel.namePath||''}</Descriptions.Item>
<Descriptions.Item label="业务定义"></Descriptions.Item>
<Descriptions.Item label="更新时间">{tableModel.lastUpdateTime||''}</Descriptions.Item>
</Descriptions>
);
}
}
export class DataDesc extends Component {
render() {
const { tableModel } = this.props;
const { jsonAttribute, jsonAttributeValue } = tableModel;
let attribute = JSON.parse(jsonAttribute);
const attributeValue = JSON.parse(jsonAttributeValue);
attribute = attribute.filter( item => (item.key!=='other'&&item.key!=='name'&&item.key!=='comment') )
return (
<Descriptions size="small" column={2}>
{
attribute && attribute.map((item,index) => {
return (
<Descriptions.Item key={index} label={item.name||''}>
{attributeValue[item.key]||''}
</Descriptions.Item>
);
})
}
</Descriptions>
);
}
}
\ No newline at end of file
//树形控件异步数据加载:https://codesandbox.io/s/99vcp?file=/index.js:969-1307
import React, { Component } from "react"
import { Tree, Card, Spin, Select } from 'antd';
import { connect } from 'react-redux';
import { dispatch } from '../../../../model';
const { Option } = Select;
class MetadataTreeCOM extends Component {
constructor(props) {
super(props);
this.state = {
treeData: null,
defaultExpandedKeys: [],
defaultSelectedKeys: [],
domains: null,
defaultDomainValue: ''
};
}
componentDidMount() {
this.getDomains();
}
componentDidUpdate(preProps) {
}
getDomains = () => {
const { session } = this.props;
const _this = this;
dispatch({
type: 'user.domains',
payload: {
userId: session.userId
},
callback: data => {
let defaultDomainValue = '';
if (data && data.length>0) {
defaultDomainValue = data[0].domainId;
}
_this.setState({ domains: data||[], defaultDomainValue},()=>{
_this.queryTopicAsTree(defaultDomainValue);
});
}
});
}
onDomainChange = (value) => {
this.queryTopicAsTree(value);
}
updateTreeData = (list, key, children) => {
return list.map(node => {
if (node.key === key) {
return { ...node, children, isLeaf: (children.length===0)?true:false };
}
if (node.children) {
return { ...node, children: this.updateTreeData(node.children, key, children) };
}
return node;
});
}
queryTopicAsTree = (parentNamePath) => {
const { model } = this.props;
const _this = this;
dispatch({
type: 'metadata.queryTopicAsTree',
payload: {
parentClass: 'Catalog',
model: model,
parentNamePath: parentNamePath
},
callback: data => {
const defaultExpandedKeys = data&&data.map((node) => {
return node.key;
});
let defaultSelectedKeys = [];
if (data && data.length>0) {
defaultSelectedKeys.push(data[0].key);
}
_this.setState({treeData: data, defaultExpandedKeys, defaultSelectedKeys},()=>{
_this.onTreeSelect(defaultSelectedKeys);
});
}
});
}
onLoadData = (node) => {
const { model } = this.props;
const { treeData } = this.state;
const { eventKey, children } = node.props;
const isLeaf = node.isLeaf();
const _this = this;
return new Promise(resolve => {
if (isLeaf || children.length>0) {
resolve();
return;
}
dispatch({
type: 'metadata.queryChildTopicAsTree',
payload: {
parentId: eventKey,
model: model,
},
callback: data => {
_this.setState({treeData:_this.updateTreeData(treeData, eventKey, data)});
resolve();
}
});
});
}
onTreeSelect = (selectedKeys, e) => {
const { onSelect } = this.props;
if (onSelect) {
onSelect(selectedKeys[0]);
}
}
render() {
const { treeData, defaultExpandedKeys, defaultSelectedKeys, domains, defaultDomainValue } = this.state;
return (
<Card bordered={false} >
{domains? (
<Select defaultValue={defaultDomainValue} onChange={this.onDomainChange}>
{
domains.map((domain,index)=>{
return <Option key={index} value={domain.domainId}>{domain.domainName}</Option>
})
}
</Select>
) : (
<Spin />
)}
{treeData ? (
<Tree
showLine
defaultExpandedKeys={defaultExpandedKeys}
defaultSelectedKeys={defaultSelectedKeys}
loadData={this.onLoadData}
treeData={treeData}
onSelect={this.onTreeSelect}
/>
) : (
<Spin />
)}
</Card>
);
}
}
export default connect(
state => {
return {session: state.sessionState}
}
)(MetadataTreeCOM);
import React, { Component } from "react";
import { Row, Col, Card, Pagination} from 'antd';
import MetadataTreeCOM from "./components/MetadataTree";
import MetadataListCOM from "./components/MetadataList";
import { dispatch } from "../../../model";
export default class Indicator extends Component {
constructor(props) {
super(props);
this.state = { items: null, total: 0, keyword: '', pageNum: 1, pageSize: 10, loading: false, treeSelectId: '' };
}
getList = (treeSelectId, pageNum = 1, pageSize = 10) => {
const { keyword } = this.state;
this.setState({ treeSelectId, pageNum, pageSize, loading: true });
dispatch({
type: 'metadata.tableModelsByPage',
payload: { parentId: treeSelectId, pageNum, pageSize, name: keyword, model: 'Indicator' },
callback: data => {
this.setState({
loading: false,
items: data.content||[],
total: data.totalElements
})
}
})
};
onTreeSelect = (value) => {
const { pageNum, pageSize } = this.props;
this.getList(value, pageNum, pageSize);
}
render() {
const { treeSelectId, pageNum, pageSize, total, loading, items} = this.state;
return (
<div>
<Row>
<Col md={6}>
<MetadataTreeCOM model="IndicatorCatalog" onSelect={this.onTreeSelect} />
</Col>
<Col md={18}>
<Card bordered={false}>
<MetadataListCOM
loading={loading}
tableModels={items}
/>
<Pagination
className="text-center"
showSizeChanger
showQuickJumper
onChange={(_pageNum, _pageSize) => {
this.getList(treeSelectId, _pageNum, _pageSize);
}}
onShowSizeChange={(_pageNum, _pageSize) => {
this.getList(treeSelectId, _pageNum, _pageSize);
}}
current={pageNum}
pageSize={pageSize}
defaultCurrent={1}
total={total}
/>
</Card>
</Col>
</Row>
</div>
);
}
}
import React, { Component } from "react";
import { Row, Col, Card, Pagination} from 'antd';
import MetadataTreeCOM from "../Indicator/components/MetadataTree";
import MetadataListCOM from "../Indicator/components/MetadataList";
import { dispatch } from "../../../model";
export default class Standard extends Component {
constructor(props) {
super(props);
this.state = { items: null, total: 0, keyword: '', pageNum: 1, pageSize: 10, loading: false, treeSelectId: '' };
}
getList = (treeSelectId, pageNum = 1, pageSize = 10) => {
const { keyword } = this.state;
this.setState({ treeSelectId, pageNum, pageSize, loading: true });
dispatch({
type: 'metadata.tableModelsByPage',
payload: { parentId: treeSelectId, pageNum, pageSize, name: keyword, model: 'DataStandard' },
callback: data => {
this.setState({
loading: false,
items: data.content||[],
total: data.totalElements
})
}
})
};
onTreeSelect = (value) => {
const { pageNum, pageSize } = this.props;
this.getList(value, pageNum, pageSize);
}
render() {
const { treeSelectId, pageNum, pageSize, total, loading, items} = this.state;
return (
<div>
<Row>
<Col md={6}>
<MetadataTreeCOM model="StandardCatalog" onSelect={this.onTreeSelect} />
</Col>
<Col md={18}>
<Card bordered={false}>
<MetadataListCOM
loading={loading}
tableModels={items}
/>
<Pagination
className="text-center"
showSizeChanger
showQuickJumper
onChange={(_pageNum, _pageSize) => {
this.getList(treeSelectId, _pageNum, _pageSize);
}}
onShowSizeChange={(_pageNum, _pageSize) => {
this.getList(treeSelectId, _pageNum, _pageSize);
}}
current={pageNum}
pageSize={pageSize}
defaultCurrent={1}
total={total}
/>
</Card>
</Col>
</Row>
</div>
);
}
}
...@@ -22,7 +22,7 @@ export default class Authorized extends Component { ...@@ -22,7 +22,7 @@ export default class Authorized extends Component {
type: 'user.listPrivilegeTableModels', type: 'user.listPrivilegeTableModels',
payload: { }, payload: { },
callback: data => { callback: data => {
(this.unmount===undefined) && this.setState({ this.setState({
loading: false, loading: false,
items: data || [], items: data || [],
}) })
......
import React, { Component } from "react";
import { Card, Table, Radio, Pagination, Input } from 'antd';
import { dispatch } from '../../../model';
export default class Question extends Component {
constructor(props) {
super(props);
this.state = {
items: null,
loading: false,
total: 0,
pageNum: 1,
pageSize: 10,
keyword: '',
type: 'all',
columns: [
{ key: 'itemNo', title: '项目编号', dataIndex: 'itemNo' },
{ key: 'projectName', title: '项目名称', dataIndex: 'projectName' },
{ key: 'financeAmount', title: '融资金额', dataIndex: 'financeAmount' },
{ key: 'problemDesc', title: '问题描述', dataIndex: 'problemDesc' },
{ key: 'projectManager', title: '项目经理', dataIndex: 'projectManager' },
{ key: 'problemFoundDateStr', title: '发现问题日期', dataIndex: 'problemFoundDateStr' },
{
key: 'performance',
title: '完成情况',
dataIndex: 'performance',
render: (text, record) => {
if (record.performance === 'confirm')
return '确认问题';
if (record.performance === 'dealing')
return '正在解决';
if (record.performance === 'solve')
return '解决问题';
return '';
},
},
{
title: '操作',
render: (text, record) => (
<a onClick={() => { this.onQuestionUpdate(record); }}>
更新
</a>
),
},
]
};
}
componentDidMount() {
const { type, keyword, pageNum, pageSize } = this.state;
this.getList(type, keyword, pageNum, pageSize);
}
getList = ( type, keyword, pageNum = 1, pageSize = 10) => {
this.setState({ keyword, type, pageNum, pageSize, loading: true },() => {
const payload = {
page: pageNum,
size: pageSize,
projectName: keyword,
};
if (type !== 'all') {
payload.performance = type;
}
dispatch({
type: 'user.questions',
payload: payload,
callback: data => {
console.log(data);
this.setState({
loading: false,
items: data.content,
total: data.totalElements
})
}
})
});
};
onSearch = (value) => {
const { type, pageSize } = this.state;
this.getList(type, value, 1, pageSize);
};
onTypeChange = (e) => {
const { keyword, pageSize } = this.state;
this.getList(e.target.value, keyword, 1, pageSize);
}
onQuestionUpdate = (record) => {
};
render() {
const { keyword, type, loading, columns, items, pageNum, pageSize, total } = this.state;
return (
<Card
bordered={false}
title={
<Input.Search
placeholder="请输入项目名称"
value={keyword}
onSearch={this.onSearch}
onChange={e=> {
this.setState({ keyword: e.target.value });
}}
/>
}
extra={
<Radio.Group value={type} onChange={this.onTypeChange}>
<Radio.Button value="all">全部</Radio.Button>
<Radio.Button value="confirm">确认问题</Radio.Button>
<Radio.Button value="dealing">正在解决</Radio.Button>
<Radio.Button value="solve">解决问题</Radio.Button>
</Radio.Group>
}
>
<Table
rowKey="id"
columns={columns}
dataSource={items}
pagination={false}
loading={loading}
/>
<Pagination
className="text-center"
showSizeChanger
showQuickJumper
onChange={(_pageNum, _pageSize) => {
this.getList(type, keyword, _pageNum, _pageSize);
}}
onShowSizeChange={(_pageNum, _pageSize) => {
this.getList(type, keyword, _pageNum, _pageSize);
}}
current={pageNum}
pageSize={pageSize}
defaultCurrent={1}
total={total}
/>
</Card>
);
}
}
...@@ -22,7 +22,7 @@ export default class Subscrible extends Component { ...@@ -22,7 +22,7 @@ export default class Subscrible extends Component {
type: 'user.getUserSubscribeTableModels', type: 'user.getUserSubscribeTableModels',
payload: { }, payload: { },
callback: data => { callback: data => {
(this.unmount===undefined) && this.setState({ this.setState({
loading: false, loading: false,
items: data || [], items: data || [],
}) })
......
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