|
@@ -14,6 +14,16 @@ import { PieChart } from "echarts/charts";
|
|
|
import { LabelLayout } from "echarts/features";
|
|
|
import HotMap from "./HotMap";
|
|
|
import classNames from "classnames";
|
|
|
+import {
|
|
|
+ getHotInfo1API,
|
|
|
+ getHotInfo2API,
|
|
|
+ getHotInfo3API,
|
|
|
+ getHotInfo4API,
|
|
|
+ getHotInfo5API,
|
|
|
+ getHotInfo6API,
|
|
|
+} from "@/store/action/A1Hot";
|
|
|
+import { HotInfo1Type, HotInfo3Type, HotInfo4Type } from "@/types";
|
|
|
+import { hotChangeObj } from "@/utils/changeData";
|
|
|
|
|
|
echarts.use([
|
|
|
GridComponent,
|
|
@@ -27,6 +37,25 @@ echarts.use([
|
|
|
]);
|
|
|
|
|
|
function Hot() {
|
|
|
+ // 数量总计
|
|
|
+ const [allNum1, setAllNum1] = useState(0);
|
|
|
+ const [allNum2, setAllNum2] = useState(0);
|
|
|
+ const [allNum3, setAllNum3] = useState(0);
|
|
|
+ const [allNum4, setAllNum4] = useState(0);
|
|
|
+ const [allNum5, setAllNum5] = useState(0);
|
|
|
+
|
|
|
+ // 日期下拉框
|
|
|
+ const [select1, setSelect1] = useState<1 | 7 | 30 | "">(7);
|
|
|
+ // 藏品排行下拉框
|
|
|
+ const [select2, setSelect2] = useState("visit");
|
|
|
+ // 场景排行下拉框
|
|
|
+ const [select3, setSelect3] = useState("visit");
|
|
|
+ // 馆藏统计下拉框
|
|
|
+ const [select4, setSelect4] = useState("texture");
|
|
|
+
|
|
|
+ const [likeData, setLikeData] = useState<HotInfo4Type[]>([]);
|
|
|
+ const [likeData2, setLikeData2] = useState<HotInfo4Type[]>([]);
|
|
|
+
|
|
|
// 获取echarts图表的函数
|
|
|
|
|
|
// 折线图
|
|
@@ -82,13 +111,13 @@ function Hot() {
|
|
|
[]
|
|
|
);
|
|
|
|
|
|
- // 饼图
|
|
|
+ // 饼图集合
|
|
|
const echartsFu2 = useCallback(
|
|
|
(dom: any, data: { value: number; name: string }[], obj: any) => {
|
|
|
let chartDom2: any = document.querySelector(dom);
|
|
|
let myChart2 = echarts.init(chartDom2);
|
|
|
let option2 = {
|
|
|
- color:['#11A480','#00BBF6','#F97C7C','#93876D','#ECDFBF'],
|
|
|
+ color: ["#11A480", "#00BBF6", "#F97C7C", "#93876D", "#ECDFBF"],
|
|
|
tooltip: {
|
|
|
trigger: "item",
|
|
|
},
|
|
@@ -142,143 +171,132 @@ function Hot() {
|
|
|
[]
|
|
|
);
|
|
|
|
|
|
- const getInfoFu = useCallback(() => {
|
|
|
- // 第一个折线 echarts----------------------------
|
|
|
- const data1_1 = [
|
|
|
- "2023-2-01",
|
|
|
- "2023-2-02",
|
|
|
- "2023-2-03",
|
|
|
- "2023-2-04",
|
|
|
- "2023-2-05",
|
|
|
- "2023-2-06",
|
|
|
- "2023-2-07",
|
|
|
- "2023-2-08",
|
|
|
- "2023-2-09",
|
|
|
- "2023-2-10",
|
|
|
- "2023-2-11",
|
|
|
- "2023-2-12",
|
|
|
- "2023-2-13",
|
|
|
- "2023-2-14",
|
|
|
- ];
|
|
|
- const data1_2 = [0, 5, 6, 8, 11, 0, 3, 1, 5, 6, 1, 7, 5, 2];
|
|
|
- echartsFu1("#echarts1", data1_1, data1_2, ["#11A480"]);
|
|
|
-
|
|
|
- // 第二个折线 echarts----------------------------
|
|
|
- const data2_1 = [
|
|
|
- "2023-2-08",
|
|
|
- "2023-2-09",
|
|
|
- "2023-2-10",
|
|
|
- "2023-2-11",
|
|
|
- "2023-2-12",
|
|
|
- "2023-2-13",
|
|
|
- "2023-2-14",
|
|
|
- ];
|
|
|
- const data2_2 = [5, 6, 8, 11, 0, 5, 2];
|
|
|
- echartsFu1("#echarts2", data2_1, data2_2, ["#00BBF6"]);
|
|
|
-
|
|
|
- // 第三个折线 echarts----------------------------
|
|
|
- const data3_1 = [
|
|
|
- "2023-2-08",
|
|
|
- "2023-2-09",
|
|
|
- "2023-2-10",
|
|
|
- "2023-2-11",
|
|
|
- "2023-2-12",
|
|
|
- "2023-2-13",
|
|
|
- "2023-2-14",
|
|
|
- ];
|
|
|
- const data3_2 = [0, 5, 6, 8, 11, 20, 1];
|
|
|
- echartsFu1("#echarts3", data3_1, data3_2, ["#F97C7C"]);
|
|
|
-
|
|
|
- // 第一个饼图
|
|
|
- const data4 = [
|
|
|
- {
|
|
|
- icon: "circle",
|
|
|
- value: 10,
|
|
|
- name: "拖拉机",
|
|
|
- },
|
|
|
- {
|
|
|
- icon: "circle",
|
|
|
- value: 1,
|
|
|
- name: "火车",
|
|
|
- },
|
|
|
- {
|
|
|
- icon: "circle",
|
|
|
- value: 30,
|
|
|
- name: "板车",
|
|
|
- },
|
|
|
- ];
|
|
|
-
|
|
|
- // 第一个饼图
|
|
|
- const data7 = [
|
|
|
- {
|
|
|
- icon: "circle",
|
|
|
- value: 10,
|
|
|
- name: "拖拉机",
|
|
|
- },
|
|
|
- {
|
|
|
- icon: "circle",
|
|
|
- value: 3,
|
|
|
- name: "火车",
|
|
|
- },
|
|
|
- {
|
|
|
- icon: "circle",
|
|
|
- value: 30,
|
|
|
- name: "板车",
|
|
|
- },
|
|
|
- {
|
|
|
+ // 第一个饼图--浏览总数
|
|
|
+ const echartsB1 = useCallback(async () => {
|
|
|
+ const res3 = await getHotInfo3API(select1);
|
|
|
+ const data3: HotInfo3Type[] = res3.data;
|
|
|
+ let allNum4 = 0;
|
|
|
+ const data4: any = [];
|
|
|
+ data3.forEach((v) => {
|
|
|
+ data4.push({
|
|
|
icon: "circle",
|
|
|
- value: 3,
|
|
|
- name: "火车1",
|
|
|
- },
|
|
|
- {
|
|
|
- icon: "circle",
|
|
|
- value: 30,
|
|
|
- name: "板车1",
|
|
|
- },
|
|
|
- ];
|
|
|
+ value: v.pcs,
|
|
|
+ name: hotChangeObj[v.groupKey],
|
|
|
+ });
|
|
|
+ allNum4 += v.pcs;
|
|
|
+ });
|
|
|
+ setAllNum4(allNum4);
|
|
|
// 左边饼图配置文件
|
|
|
const data4Obj = {
|
|
|
legend: { left: "center", bottom: 20 },
|
|
|
series: { center: ["50%", "35%"], radius: ["50%", "70%"] },
|
|
|
};
|
|
|
+ echartsFu2("#echarts4", data4, data4Obj);
|
|
|
+ }, [echartsFu2, select1]);
|
|
|
+
|
|
|
+ // 藏品排行
|
|
|
+ const getlikeData1Fu = useCallback(async () => {
|
|
|
+ const res = await getHotInfo4API(select1, select2);
|
|
|
+ const data: HotInfo4Type[] = res.data;
|
|
|
+ setLikeData(data);
|
|
|
+ }, [select1, select2]);
|
|
|
+
|
|
|
+ // 场景排行
|
|
|
+ const getlikeData2Fu = useCallback(async () => {
|
|
|
+ const res = await getHotInfo5API(select1, select3);
|
|
|
+ const data: HotInfo4Type[] = res.data;
|
|
|
+ setLikeData2(data);
|
|
|
+ }, [select1, select3]);
|
|
|
+
|
|
|
+ // 馆藏统计---第二个饼图
|
|
|
+ const getGoodsAllFu = useCallback(async () => {
|
|
|
+ const res = await getHotInfo6API();
|
|
|
+ const data: any = res.data;
|
|
|
+ const data7: any = [];
|
|
|
+ setAllNum5(data.total);
|
|
|
+ for (const k in data) {
|
|
|
+ if (k === select4) {
|
|
|
+ data[k].forEach((v: any) => {
|
|
|
+ data7.push({ icon: "circle", value: v.pcs, name: v.type });
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
// 右边饼图配置文件
|
|
|
const data7Obj = {
|
|
|
legend: { left: "center", bottom: 5 },
|
|
|
series: { center: ["50%", "35%"], radius: ["40%", "60%"] },
|
|
|
};
|
|
|
- // echartsFu2("#echarts4", data4, data4Obj);
|
|
|
- // echartsFu2("#echarts5", data4, data4Obj);
|
|
|
- echartsFu2("#echarts4", data4, data4Obj);
|
|
|
echartsFu2("#echarts7", data7, data7Obj);
|
|
|
- }, [echartsFu1, echartsFu2]);
|
|
|
+ }, [echartsFu2, select4]);
|
|
|
|
|
|
+ // 关于浏览总数改变重新发请求拿数据
|
|
|
useEffect(() => {
|
|
|
- getInfoFu();
|
|
|
- }, [getInfoFu]);
|
|
|
+ echartsB1();
|
|
|
+ }, [echartsB1]);
|
|
|
|
|
|
- // 日期下拉框
|
|
|
- const [select1, setSelect1] = useState<1 | 7 | 30 | "">(7);
|
|
|
- // 藏品排行下拉框
|
|
|
- const [select2, setSelect2] = useState(0);
|
|
|
- // 场景排行下拉框
|
|
|
- const [select3, setSelect3] = useState(0);
|
|
|
- // 馆藏统计下拉框
|
|
|
- const [select4, setSelect4] = useState(0);
|
|
|
+ // 关于藏品排行改变数据重新发请求拿数据
|
|
|
+ useEffect(() => {
|
|
|
+ getlikeData1Fu();
|
|
|
+ }, [getlikeData1Fu]);
|
|
|
|
|
|
- const [likeData, setLikeData] = useState([
|
|
|
- { name: "啊实打实大苏打", pcs: 10 },
|
|
|
- {
|
|
|
- name: "啊实打实大苏打啊实打实大苏打实打实啊实打实大苏打啊实打实大苏打实打实",
|
|
|
- pcs: 10,
|
|
|
- },
|
|
|
- { name: "啊实打实大苏打", pcs: 10 },
|
|
|
- { name: "啊实打实大苏打", pcs: 10 },
|
|
|
- { name: "啊实打实大苏打", pcs: 10 },
|
|
|
- ]);
|
|
|
+ // 关于场景排行改变数据重新发请求拿数据
|
|
|
+ useEffect(() => {
|
|
|
+ getlikeData2Fu();
|
|
|
+ }, [getlikeData2Fu]);
|
|
|
+
|
|
|
+ // 关于馆藏统计改变数据重新发请求拿数据
|
|
|
+ useEffect(() => {
|
|
|
+ getGoodsAllFu();
|
|
|
+ }, [getGoodsAllFu]);
|
|
|
+
|
|
|
+ const getInfoFu = useCallback(async () => {
|
|
|
+ // 第一个折线 echarts----------------------------
|
|
|
+ const res1 = await getHotInfo1API();
|
|
|
+ const data1: HotInfo1Type[] = res1.data.reverse();
|
|
|
+ let allNum1 = 0;
|
|
|
+ const data1_1: string[] = [];
|
|
|
+ const data1_2: number[] = [];
|
|
|
+ data1.forEach((v) => {
|
|
|
+ data1_1.push(v.today);
|
|
|
+ data1_2.push(v.pcsUser);
|
|
|
+ allNum1 += v.pcsUser;
|
|
|
+ });
|
|
|
+ setAllNum1(allNum1);
|
|
|
+ echartsFu1("#echarts1", data1_1, data1_2, ["#11A480"]);
|
|
|
+
|
|
|
+ // 第二、三个折线 echarts----------------------------
|
|
|
+ const res2 = await getHotInfo2API();
|
|
|
+ const data2: HotInfo1Type[] = res2.data.reverse();
|
|
|
+ let allNum2 = 0;
|
|
|
+ const data2_1: string[] = [];
|
|
|
+ const data2_2: number[] = [];
|
|
|
+
|
|
|
+ let allNum3 = 0;
|
|
|
+ const data3_1: string[] = [];
|
|
|
+ const data3_2: number[] = [];
|
|
|
+
|
|
|
+ data2.forEach((v) => {
|
|
|
+ data2_1.push(v.today);
|
|
|
+ data2_2.push(v.pcsWall);
|
|
|
+ allNum2 += v.pcsWall;
|
|
|
+
|
|
|
+ data3_1.push(v.today);
|
|
|
+ data3_2.push(v.pcsWearable);
|
|
|
+ allNum3 += v.pcsWearable;
|
|
|
+ });
|
|
|
+ setAllNum2(allNum2);
|
|
|
+ setAllNum3(allNum3);
|
|
|
+
|
|
|
+ echartsFu1("#echarts2", data2_1, data2_2, ["#00BBF6"]);
|
|
|
+ echartsFu1("#echarts3", data3_1, data3_2, ["#F97C7C"]);
|
|
|
+ }, [echartsFu1]);
|
|
|
+
|
|
|
+ useEffect(() => {
|
|
|
+ getInfoFu();
|
|
|
+ }, [getInfoFu]);
|
|
|
|
|
|
return (
|
|
|
<div className={styles.Hot}>
|
|
|
-
|
|
|
<div className="pageTitlt">热度统计</div>
|
|
|
|
|
|
<div className="hotMainBox">
|
|
@@ -288,7 +306,8 @@ function Hot() {
|
|
|
{/* 线上访客盒子 */}
|
|
|
<div className="topBoxL1">
|
|
|
<div className="hotTit">
|
|
|
- 线上访客 <span style={{ color: "#11A480" }}>58</span>
|
|
|
+ 线上访客
|
|
|
+ <span style={{ color: "#11A480" }}>{allNum1}</span>
|
|
|
<Tooltip title="近14个自然日的访客数;一天内同一访客多次访问记为1">
|
|
|
<div className="inco">
|
|
|
<ExclamationCircleFilled />
|
|
@@ -304,7 +323,7 @@ function Hot() {
|
|
|
<div className="topBoxL2L">
|
|
|
<div className="hotTit">
|
|
|
万物墙热度
|
|
|
- <span style={{ color: "#00BBF6" }}>264</span>
|
|
|
+ <span style={{ color: "#00BBF6" }}>{allNum2}</span>
|
|
|
<Tooltip title="查看场景/文物/视频时,记为1点热度">
|
|
|
<div className="inco">
|
|
|
<ExclamationCircleFilled />
|
|
@@ -319,7 +338,7 @@ function Hot() {
|
|
|
<div className="topBoxL2R">
|
|
|
<div className="hotTit">
|
|
|
穿戴设备热度
|
|
|
- <span style={{ color: "#F97C7C" }}>14</span>
|
|
|
+ <span style={{ color: "#F97C7C" }}>{allNum3}</span>
|
|
|
<Tooltip title="穿戴设备每次启动,记为1点热度">
|
|
|
<div className="inco">
|
|
|
<ExclamationCircleFilled />
|
|
@@ -381,7 +400,7 @@ function Hot() {
|
|
|
<div className="echarts4Box">
|
|
|
<div className="echarts4BoxTxt">
|
|
|
<div>总数</div>
|
|
|
- <p>124</p>
|
|
|
+ <p>{allNum4}</p>
|
|
|
</div>
|
|
|
<div id="echarts4"></div>
|
|
|
</div>
|
|
@@ -395,16 +414,16 @@ function Hot() {
|
|
|
style={{ width: 100 }}
|
|
|
onChange={(e) => setSelect2(e)}
|
|
|
options={[
|
|
|
- { value: 0, label: "按浏览" },
|
|
|
- { value: 1, label: "按点赞" },
|
|
|
- { value: 2, label: "按弹幕" },
|
|
|
+ { value: "visit", label: "按浏览" },
|
|
|
+ { value: "star", label: "按点赞" },
|
|
|
+ { value: "barrage", label: "按弹幕" },
|
|
|
]}
|
|
|
/>
|
|
|
</div>
|
|
|
{likeData.length ? (
|
|
|
<div className="downBoxLMain2LRowBox">
|
|
|
{likeData.map((v, i) => (
|
|
|
- <div className="downBoxLMain2LRow" key={i}>
|
|
|
+ <div className="downBoxLMain2LRow" key={v.name}>
|
|
|
<div className="downBoxLMain2LRow1" title={v.name}>
|
|
|
<div
|
|
|
className={classNames(
|
|
@@ -442,16 +461,16 @@ function Hot() {
|
|
|
style={{ width: 100 }}
|
|
|
onChange={(e) => setSelect3(e)}
|
|
|
options={[
|
|
|
- { value: 0, label: "按浏览" },
|
|
|
- { value: 1, label: "按弹幕" },
|
|
|
+ { value: "visit", label: "按浏览" },
|
|
|
+ { value: "star", label: "按点赞" },
|
|
|
]}
|
|
|
/>
|
|
|
</div>
|
|
|
|
|
|
- {likeData.length ? (
|
|
|
+ {likeData2.length ? (
|
|
|
<div className="downBoxLMain2LRowBox">
|
|
|
- {likeData.map((v, i) => (
|
|
|
- <div className="downBoxLMain2LRow" key={i}>
|
|
|
+ {likeData2.map((v, i) => (
|
|
|
+ <div className="downBoxLMain2LRow" key={v.name}>
|
|
|
<div className="downBoxLMain2LRow1" title={v.name}>
|
|
|
<div
|
|
|
className={classNames(
|
|
@@ -494,9 +513,9 @@ function Hot() {
|
|
|
style={{ width: 100 }}
|
|
|
onChange={(e) => setSelect4(e)}
|
|
|
options={[
|
|
|
- { value: 0, label: "按类别" },
|
|
|
- { value: 1, label: "按年代" },
|
|
|
- { value: 2, label: "按级别" },
|
|
|
+ { value: "texture", label: "按类别" },
|
|
|
+ { value: "age", label: "按年代" },
|
|
|
+ { value: "level", label: "按级别" },
|
|
|
]}
|
|
|
/>
|
|
|
</div>
|
|
@@ -504,7 +523,7 @@ function Hot() {
|
|
|
<div id="echarts7"></div>
|
|
|
<div className="downBoxRBoxTxt">
|
|
|
<div>总数</div>
|
|
|
- <p>9</p>
|
|
|
+ <p>{allNum5}</p>
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|