|
@@ -1,32 +1,138 @@
|
|
|
-import React from 'react'
|
|
|
+import React, { useEffect, useMemo, useRef, useState } from 'react'
|
|
|
import Helmet from 'react-helmet'
|
|
|
import Container from 'components/Container'
|
|
|
+import { init, EChartOption, ECharts } from 'echarts'
|
|
|
import styles from './index.less'
|
|
|
-// const styles = require('./index.less')
|
|
|
+import api from 'utils/api'
|
|
|
+import request from 'utils/request'
|
|
|
+
|
|
|
+const DEFAULT_COLORS = [
|
|
|
+ '#5470c6',
|
|
|
+ '#91cc75',
|
|
|
+ '#fac858',
|
|
|
+ '#ee6666',
|
|
|
+ '#73c0de',
|
|
|
+ '#3ba272',
|
|
|
+ '#fc8452',
|
|
|
+ '#9a60b4',
|
|
|
+ '#ea7ccc'
|
|
|
+]
|
|
|
+
|
|
|
+// tslint:disable-next-line:interface-name
|
|
|
+interface DataOverviewState {
|
|
|
+ originDept: number, // 来源部门数量
|
|
|
+ countCatalogue: number, // 近一个月目录增长数量
|
|
|
+ originSystem: number, // 来源系统数量
|
|
|
+ dataSource: number, // 数据资源数量
|
|
|
+ industryData: Array<{ name: string, value: number }>, // 行业分类饼图
|
|
|
+ originDeptData: Array<{ name: string, value: number }>, // 来源部门柱状图
|
|
|
+}
|
|
|
|
|
|
export default function DataOverview() {
|
|
|
+ const pieElementRef = useRef<HTMLDivElement>(null)
|
|
|
+ const barElementRef = useRef<HTMLDivElement>(null)
|
|
|
+ const pieRef = useRef<ECharts>(null)
|
|
|
+ const barRef = useRef<ECharts>(null)
|
|
|
+ const [overview, setOverview] = useState<DataOverviewState>(
|
|
|
+ {
|
|
|
+ originDept: 0,
|
|
|
+ countCatalogue: 0,
|
|
|
+ originSystem: 0,
|
|
|
+ dataSource: 0,
|
|
|
+ industryData: [],
|
|
|
+ originDeptData: []
|
|
|
+ })
|
|
|
+
|
|
|
+ const getDataScreening = async() => {
|
|
|
+ try {
|
|
|
+ const data = await request(api.dataScreening, { method: 'get' })
|
|
|
+ setOverview((data as unknown as DataOverviewState))
|
|
|
+ } catch (e) {
|
|
|
+ console.log(e)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ const pieOption = useMemo<EChartOption>(() => ({
|
|
|
+ tooltip: {
|
|
|
+ trigger: 'item'
|
|
|
+ },
|
|
|
+ color: DEFAULT_COLORS,
|
|
|
+ legend: {
|
|
|
+ orient: 'vertical',
|
|
|
+ right: 10,
|
|
|
+ top: 'middle'
|
|
|
+ },
|
|
|
+ series: [
|
|
|
+ {
|
|
|
+ type: 'pie',
|
|
|
+ radius: '50%',
|
|
|
+ data: overview.industryData,
|
|
|
+ emphasis: {
|
|
|
+ itemStyle: {
|
|
|
+ shadowBlur: 10,
|
|
|
+ shadowOffsetX: 0,
|
|
|
+ shadowColor: 'rgba(0, 0, 0, 0.5)'
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ]
|
|
|
+ }), [overview.industryData])
|
|
|
+ const barOption = useMemo<EChartOption>(() => ({
|
|
|
+ tooltip: {},
|
|
|
+ dataset: {
|
|
|
+ dimensions: ['name', 'value'],
|
|
|
+ source: overview.originDeptData
|
|
|
+ },
|
|
|
+ xAxis: {},
|
|
|
+ yAxis: {
|
|
|
+ type: 'category',
|
|
|
+ data: overview.originDeptData.map((o) => o.name)
|
|
|
+ },
|
|
|
+ series: [{
|
|
|
+ type: 'bar',
|
|
|
+ data: overview.originDeptData.map((o, idx) => ({
|
|
|
+ value: o.value, itemStyle: {
|
|
|
+ color: DEFAULT_COLORS[idx]
|
|
|
+ }
|
|
|
+ }))
|
|
|
+ }]
|
|
|
+ }), [overview.originDeptData])
|
|
|
+
|
|
|
+ useEffect(() => {
|
|
|
+ getDataScreening()
|
|
|
+ }, [])
|
|
|
+
|
|
|
+
|
|
|
+ useEffect(() => {
|
|
|
+ barRef.current = init(barElementRef.current)
|
|
|
+ barRef.current.setOption(barOption)
|
|
|
+ }, [barOption])
|
|
|
+
|
|
|
+ useEffect(() => {
|
|
|
+ pieRef.current = init(pieElementRef.current)
|
|
|
+ pieRef.current.setOption(pieOption)
|
|
|
+ }, [pieOption])
|
|
|
return (
|
|
|
<Container>
|
|
|
- <Helmet title="数据总览" />
|
|
|
+ <Helmet title='数据总览' />
|
|
|
|
|
|
<div className={styles['overview-container']}>
|
|
|
<div className={styles['card-list']}>
|
|
|
{[
|
|
|
{
|
|
|
title: '数据资源数量',
|
|
|
- num: 131
|
|
|
+ num: overview.dataSource
|
|
|
},
|
|
|
{
|
|
|
title: '来源部门数量',
|
|
|
- num: 9
|
|
|
+ num: overview.originDept
|
|
|
},
|
|
|
{
|
|
|
title: '来源系统数量',
|
|
|
- num: 10
|
|
|
+ num: overview.originSystem
|
|
|
},
|
|
|
{
|
|
|
title: '近一月目录新增数量',
|
|
|
- num: 3
|
|
|
+ num: overview.countCatalogue
|
|
|
}
|
|
|
].map((item) => (
|
|
|
<div className={styles.item} key={item.title}>
|
|
@@ -41,10 +147,12 @@ export default function DataOverview() {
|
|
|
<div>
|
|
|
<div className={styles['chart-title']}>行业分类</div>
|
|
|
<div className={styles['chart-desc']}>资源目录各行业资源数量</div>
|
|
|
+ <div ref={pieElementRef} />
|
|
|
</div>
|
|
|
<div>
|
|
|
<div className={styles['chart-title']}>数据资源来源部门</div>
|
|
|
<div className={styles['chart-desc']}>数据资源来源部门TOP10</div>
|
|
|
+ <div ref={barElementRef} />
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|