index.tsx 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352
  1. import React, { useCallback, useEffect, useState } from "react";
  2. import styles from "./index.module.scss";
  3. import { ExclamationOutlined } from "@ant-design/icons";
  4. import * as echarts from "echarts/core";
  5. import { GridComponent } from "echarts/components";
  6. import { LineChart } from "echarts/charts";
  7. import { UniversalTransition } from "echarts/features";
  8. import { CanvasRenderer } from "echarts/renderers";
  9. import { TooltipComponent, LegendComponent } from "echarts/components";
  10. import { PieChart } from "echarts/charts";
  11. import { LabelLayout } from "echarts/features";
  12. import { Button, Empty, message, Select, Tooltip } from "antd";
  13. import ExportJsonExcel from "js-export-excel";
  14. import dayjs from "dayjs";
  15. echarts.use([
  16. GridComponent,
  17. LineChart,
  18. CanvasRenderer,
  19. UniversalTransition,
  20. TooltipComponent,
  21. LegendComponent,
  22. PieChart,
  23. LabelLayout,
  24. ]);
  25. function Hot() {
  26. // 生成4个饼图的方法
  27. const echFu2 = useCallback(
  28. (
  29. dom: any,
  30. data: { value: number; name: string }[],
  31. data2: { name: string; icon: string }[]
  32. ) => {
  33. let chartDom2: any = document.querySelector(dom);
  34. let myChart2 = echarts.init(chartDom2);
  35. let option2 = {
  36. tooltip: {
  37. trigger: "item",
  38. },
  39. legend: {
  40. orient: "vertical",
  41. top: "center",
  42. right: 30,
  43. data: data2,
  44. formatter: (name: string) => {
  45. let resName = "";
  46. data.forEach((v) => {
  47. if (name === v.name) {
  48. if (name.length > 4)
  49. resName = name.slice(0, 4) + "... " + v.value;
  50. else resName = name + " " + v.value;
  51. }
  52. });
  53. return resName;
  54. },
  55. },
  56. series: [
  57. {
  58. name: "",
  59. type: "pie",
  60. center: ["34%", "50%"],
  61. radius: ["40%", "70%"],
  62. avoidLabelOverlap: false,
  63. label: {
  64. show: false,
  65. position: "center",
  66. },
  67. emphasis: {
  68. label: {
  69. show: false,
  70. },
  71. },
  72. labelLine: {
  73. show: false,
  74. },
  75. data,
  76. },
  77. ],
  78. };
  79. option2 && myChart2.setOption(option2);
  80. },
  81. []
  82. );
  83. // 获取图表数据
  84. const getHotInfo = useCallback(async () => {
  85. // 设置折线图图表
  86. const chartDom1: any = document.querySelector(".hotEch1")!;
  87. const myChart1 = echarts.init(chartDom1);
  88. const option1 = {
  89. grid: {
  90. left: "-24", //距左边边框的距离
  91. right: "0%", //距右边边框的距离
  92. bottom: "10", //距下面边框的距离
  93. top: "15", //距上面边框的距离
  94. containLabel: true,
  95. },
  96. xAxis: {
  97. type: "category",
  98. data: [
  99. "1月1日",
  100. "1月2日",
  101. "1月3日",
  102. "1月4日",
  103. "1月5日",
  104. "1月6日",
  105. "1月7日",
  106. "1月8日",
  107. "1月9日",
  108. "1月10日",
  109. "1月11日",
  110. "1月12日",
  111. "1月13日",
  112. "1月14日",
  113. ],
  114. axisLine: {
  115. show: false, //隐藏X轴
  116. },
  117. axisTick: {
  118. show: false, //隐藏刻度线
  119. },
  120. axisLabel: {
  121. show: false, //隐藏X轴文字
  122. },
  123. },
  124. yAxis: {
  125. type: "value",
  126. },
  127. series: [
  128. {
  129. data: [
  130. 150, 230, 224, 218, 135, 147, 260, 150, 230, 224, 218, 135, 147,
  131. 100,
  132. ],
  133. type: "line",
  134. },
  135. ],
  136. tooltip: {
  137. trigger: "axis",
  138. axisPointer: {
  139. type: "cross",
  140. label: {
  141. backgroundColor: "#6a7985",
  142. },
  143. },
  144. // formatter: "{a} <br/>{b} : {c}"
  145. },
  146. };
  147. option1 && myChart1.setOption(option1);
  148. const data = [
  149. { value: 1048, name: "石头" },
  150. { value: 735, name: "玉器" },
  151. { value: 580, name: "陶器" },
  152. { value: 484, name: "快乐的小青蛙" },
  153. { value: 300, name: "其他" },
  154. ];
  155. const data2 = [
  156. { icon: "circle", name: "石头" },
  157. { icon: "circle", name: "玉器" },
  158. { icon: "circle", name: "陶器" },
  159. { icon: "circle", name: "快乐的小青蛙" },
  160. { icon: "circle", name: "其他" },
  161. ];
  162. // 4个饼图
  163. echFu2(".hotEch2", data, data2);
  164. echFu2(".hotEch3", data, data2);
  165. echFu2(".hotEch4", data, data2);
  166. echFu2(".hotEch5", data, data2);
  167. }, [echFu2]);
  168. useEffect(() => {
  169. getHotInfo();
  170. }, [getHotInfo]);
  171. // 馆藏点赞的时间筛选
  172. const [value, setValue] = useState(2);
  173. useEffect(() => {
  174. const dom: any = document.querySelector(".hotRightMain");
  175. if (dom) dom.scrollTop = 0;
  176. if (value === 0) {
  177. setLikeData([
  178. { name: "民国制林则徐手迹玻璃底片", num: 99 },
  179. { name: "民国制林则徐手迹玻璃底片sssssssssssssssssssss", num: 99 },
  180. { name: "民国制林则徐手迹玻璃底片", num: 99 },
  181. ]);
  182. }
  183. }, [value]);
  184. // 馆藏点赞数据
  185. const [likeData, setLikeData] = useState([
  186. { name: "民国制林则徐手迹玻璃底片", num: 99999 },
  187. { name: "民国制林则徐手迹玻璃底片", num: 99 },
  188. { name: "民国制林则徐手迹玻璃底片", num: 99 },
  189. { name: "民国制林则徐手迹玻璃底片", num: 99 },
  190. { name: "民国制林则徐手迹玻璃底片sssssssssssssssssssss", num: 99 },
  191. { name: "民国制林则徐手迹玻璃底片", num: 99 },
  192. { name: "民国制林则徐手迹玻璃底片", num: 99 },
  193. { name: "民国制林则徐手迹玻璃底片", num: 99 },
  194. { name: "民国制林则徐手迹玻璃底片", num: 99 },
  195. { name: "民国制林则徐手迹玻璃底片", num: 99 },
  196. { name: "民国制林则徐手迹玻璃底片", num: 99 },
  197. { name: "民国制林则徐手迹玻璃底片", num: 99 },
  198. { name: "民国制林则徐手迹玻璃底片", num: 99 },
  199. { name: "民国制林则徐手迹玻璃底片", num: 99 },
  200. { name: "民国制林则徐手迹玻璃底片", num: 99 },
  201. { name: "民国制林则徐手迹玻璃底片", num: 99 },
  202. { name: "民国制林则徐手迹玻璃底片", num: 99 },
  203. { name: "民国制林则徐手迹玻璃底片", num: 99 },
  204. { name: "民国制林则徐手迹玻璃底片", num: 99 },
  205. { name: "民国制林则徐手迹玻璃底片", num: 99 },
  206. { name: "民国制林则徐手迹玻璃底片", num: 99 },
  207. { name: "民国制林则徐手迹玻璃底片", num: 99 },
  208. { name: "民国制林则徐手迹玻璃底片", num: 99 },
  209. { name: "民国制林则徐手迹玻璃底片", num: 99 },
  210. { name: "民国制林则徐手迹玻璃底片", num: 99 },
  211. { name: "民国制林则徐手迹玻璃底片", num: 99 },
  212. { name: "民国制林则徐手迹玻璃底片", num: 99 },
  213. { name: "民国制林则徐手迹玻璃底片", num: 99 },
  214. { name: "民国制林则徐手迹玻璃底片", num: 99 },
  215. { name: "民国制林则徐手迹玻璃底片", num: 99 },
  216. { name: "民国制林则徐手迹玻璃底片", num: 99 },
  217. { name: "民国制林则徐手迹玻璃底片", num: 99 },
  218. { name: "民国制林则徐手迹玻璃底片", num: 99 },
  219. ]);
  220. // 点击导出
  221. const deriveFu = useCallback(async () => {
  222. if (likeData.length === 0) return message.warning("当前搜索条件没有数据!");
  223. const name = dayjs(new Date()).format("YYYYMMDD");
  224. const option = {
  225. fileName: name,
  226. datas: [
  227. {
  228. sheetData: likeData.map((v, i) => {
  229. return {
  230. index: i + 1,
  231. ...v,
  232. };
  233. }),
  234. sheetName: name,
  235. sheetFilter: ["index", "name", "num"],
  236. sheetHeader: ["排序", "藏品名称", "点赞数"],
  237. columnWidths: [5, 20, 5],
  238. },
  239. ],
  240. };
  241. const toExcel = new ExportJsonExcel(option); //new
  242. toExcel.saveExcel(); //保存
  243. }, [likeData]);
  244. return (
  245. <div className={styles.Hot}>
  246. <div className="hotLeft">
  247. {/* 第一个盒子 */}
  248. <div className="hotLeft_1">
  249. {/* 标题和!提示 */}
  250. <div className="hotTitle">
  251. <div className="hotTitle1">万物墙使用热度 58</div>
  252. <div className="hotTitleInco">
  253. <Tooltip title=" 游客通过万物墙每查看一次数据,热度值记为1">
  254. <div className="hotTitleInco1">
  255. <ExclamationOutlined />
  256. </div>{" "}
  257. </Tooltip>
  258. </div>
  259. </div>
  260. {/* 折线图 */}
  261. <div className="hotEch1"></div>
  262. {/* 近十四天数据文字 */}
  263. <div className="hotLeft_1Txt">近十四天数据</div>
  264. </div>
  265. {/* 第二个盒子 */}
  266. <div className="hotLeft_2">
  267. <div className="hotTitle">
  268. <div className="hotTitle1">馆藏统计</div>
  269. <div className="hotTitle2">当前文物合计共 124 件</div>
  270. </div>
  271. {/* 4个饼图 */}
  272. <div className="hotEch2Box">
  273. <div className="hotEch2BoxSon">
  274. <div className="txt">类别</div>
  275. <div className="hotEch2 ech2BoxCake"></div>
  276. </div>
  277. <div className="hotEch2BoxSon">
  278. <div className="txt">年代</div>
  279. <div className="hotEch3 ech2BoxCake"></div>
  280. </div>
  281. <div className="hotEch2BoxSon">
  282. <div className="txt">级别</div>
  283. <div className="hotEch4 ech2BoxCake"></div>
  284. </div>
  285. <div className="hotEch2BoxSon">
  286. <div className="txt">来源</div>
  287. <div className="hotEch5 ech2BoxCake"></div>
  288. </div>
  289. </div>
  290. </div>
  291. </div>
  292. <div className="hotRight">
  293. <div className="hotRightTitle">
  294. <div className="hotRightTitle1">馆藏点赞</div>
  295. &emsp;&emsp;
  296. <div>
  297. <Button onClick={deriveFu}>导出数据</Button>
  298. &emsp;
  299. <Select
  300. value={value}
  301. style={{ width: 120 }}
  302. onChange={(e) => setValue(e)}
  303. options={[
  304. { value: 0, label: "今日" },
  305. { value: 1, label: "近七日" },
  306. { value: 2, label: "近三十日" },
  307. { value: 3, label: "所有时间" },
  308. ]}
  309. />
  310. </div>
  311. </div>
  312. {1 + 1 === 2 ? (
  313. <div className="hotRightMain">
  314. {likeData.map((v, i) => (
  315. <div className="hotRightMainRow" key={i}>
  316. <div className="hotRightMainRow1" title="666666">
  317. {i + 1}. {v.name}
  318. </div>
  319. <div className="hotRightMainRow2">{v.num}</div>
  320. </div>
  321. ))}
  322. </div>
  323. ) : (
  324. <div className="noneInfo">
  325. <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} />
  326. </div>
  327. )}
  328. </div>
  329. </div>
  330. );
  331. }
  332. const MemoHot = React.memo(Hot);
  333. export default MemoHot;