add hot search term tag-cloud

This commit is contained in:
shiyang 2020-11-21 23:51:13 +08:00
parent b498b8b147
commit 5bc25511dd
2 changed files with 259 additions and 33 deletions

View File

@ -0,0 +1,200 @@
import React, { PureComponent } from 'react';
import _ from 'lodash';
import {
G2,
Chart,
Geom,
Axis,
Tooltip,
Coord,
Label,
Legend,
View,
Guide,
Shape,
Facet,
Util
} from 'bizcharts';
import DataSet from '@antv/data-set';
const data = [{
"name": "北京",
"value": Math.floor((Math.random() * 1000)),
"category": "城市"
}, {
"name": "广州",
"value": Math.floor((Math.random() * 1000)),
"category": "城市"
}, {
"name": "深圳",
"value": Math.floor((Math.random() * 1000)),
"category": "城市"
}, {
"name": "长沙",
"value": Math.floor((Math.random() * 1000)),
"category": "城市"
}, {
"name": "上海",
"value": Math.floor((Math.random() * 1000)),
"category": "城市"
}, {
"name": "成都",
"value": Math.floor((Math.random() * 1000)),
"category": "城市"
}, {
"name": "哈尔滨",
"value": Math.floor((Math.random() * 1000)),
"category": "城市"
}, {
"name": "海口",
"value": Math.floor((Math.random() * 1000)),
"category": "城市"
}, {
"name": "青岛",
"value": Math.floor((Math.random() * 1000)),
"category": "城市"
}, {
"name": "G71",
"value": Math.floor((Math.random() * 1000)),
"category": "车次"
}, {
"name": "G121",
"value": Math.floor((Math.random() * 1000)),
"category": "车次"
}, {
"name": "T109",
"value": Math.floor((Math.random() * 1000)),
"category": "车次"
}, {
"name": "K81",
"value": Math.floor((Math.random() * 1000)),
"category": "车次"
}, {
"name": "Z13",
"value": Math.floor((Math.random() * 1000)),
"category": "车次"
}, {
"name": "Z121",
"value": Math.floor((Math.random() * 1000)),
"category": "车次"
}, {
"name": "G431",
"value": Math.floor((Math.random() * 1000)),
"category": "车次"
}, {
"name": "退票",
"value": Math.floor((Math.random() * 1000)),
"category": "票务"
}, {
"name": "春运",
"value": Math.floor((Math.random() * 1000)),
"category": "票务"
}, {
"name": "学生票",
"value": Math.floor((Math.random() * 1000)),
"category": "票务"
}, {
"name": "二等座",
"value": Math.floor((Math.random() * 1000)),
"category": "其他"
}, {
"name": "订餐",
"value": Math.floor((Math.random() * 1000)),
"category": "其他"
}];
class TagCloud extends PureComponent {
render() {
function getTextAttrs(cfg) {
return _.assign(
{},
cfg.style,
{
fillOpacity: cfg.opacity,
fontSize: cfg.origin._origin.size,
rotate: cfg.origin._origin.rotate,
text: cfg.origin._origin.text,
textAlign: "center",
fontFamily: cfg.origin._origin.font,
fill: cfg.color,
textBaseline: "Alphabetic"
}
);
} // 给point注册一个词云的shape
Shape.registerShape("point", "cloud", {
drawShape(cfg, container) {
const attrs = getTextAttrs(cfg);
return container.addShape("text", {
attrs: _.assign(attrs, {
x: cfg.x,
y: cfg.y
})
});
}
});
const dv = new DataSet.View().source(data);
const range = dv.range("value");
const min = range[0];
const max = range[1];
dv.transform({
type: "tag-cloud",
fields: ["name", "value"],
size: [300, 200],
font: "Verdana",
padding: 0,
timeInterval: 5000,// max execute time
rotate() {
let random = ~~(Math.random() * 4) % 4;
if (random == 2) {
random = 0;
}
return random * 90; // 0, 90, 270
},
fontSize(d) {
if (d.value) {
const divisor = (max - min) !== 0 ? (max - min) : 1;
return ((d.value - min) / divisor) * (40 - 12) + 12;
}
return 0;
}
});
const scale = {
x: {
nice: false
},
y: {
nice: false
}
};
return (
<div>
<Chart
// height={window.innerHeight}
width={window.innerWidth}
height={200}
data={dv}
scale={scale}
padding={0}
forceFit
>
<Tooltip showTitle={false} />
<Coord reflect="y" />
<Geom
type="point"
position="x*y"
color="category"
shape="cloud"
tooltip="value*category"
/>
</Chart>
</div>
);
}
}
export default TagCloud;

View File

@ -1,46 +1,72 @@
import React, { PureComponent } from 'react';
import { connect } from 'dva';
import { formatMessage, FormattedMessage } from 'umi/locale';
import { Row, Col, Card, Tooltip } from 'antd';
import numeral from 'numeral';
import { Pie, WaterWave, Gauge, TagCloud } from '@/components/Charts';
import NumberInfo from '@/components/NumberInfo';
import CountDown from '@/components/CountDown';
import ActiveChart from '@/components/ActiveChart';
import GridContent from '@/components/PageHeaderWrapper/GridContent';
import {
Row,
Col,
Icon,
Card,
Tabs,
Table,
Radio,
DatePicker,
Menu,
Dropdown,
} from 'antd';
import _ from 'lodash';
import {
G2,
Chart,
Geom,
Axis,
Tooltip,
Coord,
Label,
Legend,
View,
Guide,
Shape,
Facet,
Util
} from 'bizcharts';
import DataSet from '@antv/data-set';
import Slider from 'bizcharts-plugin-slider';
import TagCloud from './Search/TagCloud';
import Authorized from '@/utils/Authorized';
import styles from './Monitor.less';
import styles from "./Monitor.less";
const { Secured } = Authorized;
const targetTime = new Date().getTime() + 3900000;
// use permission as a parameter
const havePermissionAsync = new Promise(resolve => {
// Call resolve on behalf of passed
setTimeout(() => resolve(), 300);
});
@Secured(havePermissionAsync)
@connect(({ monitor, loading }) => ({
monitor,
loading: loading.models.monitor,
}))
class SearchMonitor extends PureComponent {
componentDidMount() {
const { dispatch } = this.props;
dispatch({
type: 'monitor/fetchTags',
});
}
render() {
const { monitor, loading } = this.props;
const { tags } = monitor;
return (
<h1>search monitor</h1>
<GridContent>
<Row gutter={24}>
{/*<Col xl={6} lg={12} sm={24} xs={24}>*/}
{/* <Card*/}
{/* title="待定"*/}
{/* loading={false}*/}
{/* bordered={false}*/}
{/* bodyStyle={{ overflow: 'hidden' }}*/}
{/* >*/}
{/* <h1>待定</h1>*/}
{/* </Card>*/}
{/*</Col>*/}
<Col xl={6} lg={12} sm={24} xs={24}>
<Card
title="热门搜索"
loading={false}
bordered={false}
bodyStyle={{ overflow: 'hidden' }}
>
<TagCloud>
</TagCloud>
</Card>
</Col>
</Row>
</GridContent>
);
}
}