index.vue 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849
  1. <template>
  2. <div class="content">
  3. <div class="bck">
  4. <el-form :inline="true" :model="queryForm">
  5. <!-- <el-form-item label="">
  6. <el-date-picker
  7. v-model="queryForm.aa"
  8. type="month"
  9. placeholder="月份"
  10. @change="onQuery"
  11. />
  12. </el-form-item>
  13. <el-form-item label="">
  14. <el-radio-group v-model="queryForm.bb" size="large" @change="onQuery">
  15. <el-radio-button label="本日" />
  16. <el-radio-button label="本周" />
  17. <el-radio-button label="本月" />
  18. <el-radio-button label="今年" />
  19. <el-radio-button label="其他" />
  20. </el-radio-group>
  21. </el-form-item> -->
  22. <el-form-item>
  23. <el-date-picker
  24. v-model="queryForm.timeArr"
  25. type="daterange"
  26. unlink-panels
  27. range-separator="-"
  28. start-placeholder="开始日期"
  29. end-placeholder="结束日期"
  30. value-format="YYYY-MM-DD"
  31. @change="onQuery"
  32. />
  33. </el-form-item>
  34. <el-form-item>
  35. <el-button type="primary" @click="onQuery">搜索</el-button>
  36. <el-button type="defualt" @click="onReset">重置</el-button>
  37. </el-form-item>
  38. </el-form>
  39. </div>
  40. <div
  41. class="bck statistics"
  42. style="margin-top: 10px"
  43. v-loading="statisticsLoading"
  44. >
  45. <div class="stat-warp">
  46. <ul>
  47. <li class="theme1">
  48. <div class="num">{{ moneyFormat(allData.salesStatisticsData.amount, 2) }}</div>
  49. <div class="label">销售额(¥)</div>
  50. <div class="icon-box">
  51. <i class="icon iconfont icon-iconx_caiwgl"></i>
  52. </div>
  53. </li>
  54. <li class="theme2">
  55. <div class="num">{{ allData.salesStatisticsData.contractCount }}</div>
  56. <div class="label">订单(单)</div>
  57. <div class="icon-box">
  58. <i class="icon iconfont icon-iconm_fukgl"></i>
  59. </div>
  60. </li>
  61. <li class="theme3">
  62. <div class="num"> {{ allData.salesStatisticsData.customerCount }}</div>
  63. <div class="label">下单客户数(人)</div>
  64. <div class="icon-box">
  65. <i class="icon iconfont icon-iconm_unread"></i>
  66. </div>
  67. </li>
  68. </ul>
  69. </div>
  70. </div>
  71. <div
  72. class="bck scatter"
  73. style="margin-top: 10px"
  74. v-loading="scatterLoading"
  75. >
  76. <el-row>
  77. <el-col :span="8">
  78. <TitleInfo :content="titleList[0]"></TitleInfo>
  79. <div ref="echartDom" style="height: 40vh"></div>
  80. </el-col>
  81. <el-col :span="16">
  82. <byTable
  83. :hideSearch="true"
  84. :tableHeight="tableHeight"
  85. :source="sourceList.scatterData"
  86. :pagination="sourceList.scatterPagination"
  87. :config="scatterConfig"
  88. :loading="scatterLoading"
  89. highlight-current-row
  90. :hidePagination="true"
  91. :selectConfig="[]"
  92. >
  93. <template #flag="{ item }">
  94. <div>
  95. <div>
  96. <svg class="icon" aria-hidden="true">
  97. <use :xlink:href="'#' + item.countryIcon"></use>
  98. </svg>
  99. {{ item.countryName }}
  100. </div>
  101. </div>
  102. </template>
  103. </byTable>
  104. </el-col>
  105. </el-row>
  106. </div>
  107. <div style="margin-top: 10px">
  108. <el-row>
  109. <el-col :span="12" class="bck" v-loading="salesLoading">
  110. <TitleInfo :content="titleList[1]"></TitleInfo>
  111. <div ref="echartDomOne" style="height: 30vh"></div>
  112. <div style="margin-top: 10px">
  113. <byTable
  114. :hideSearch="true"
  115. :tableHeight="300"
  116. :source="sourceList.salesData"
  117. :pagination="sourceList.salesPagination"
  118. :config="salesConfig"
  119. :loading="salesLoading"
  120. highlight-current-row
  121. :selectConfig="[]"
  122. >
  123. </byTable>
  124. </div>
  125. </el-col>
  126. <el-col :span="12" style="padding-left: 10px">
  127. <div class="bck" v-loading="salesmanSalesLoading">
  128. <TitleInfo :content="titleList[2]"></TitleInfo>
  129. <div ref="echartDomTwo" style="height: 30vh"></div>
  130. <div style="margin-top: 10px">
  131. <byTable
  132. :hideSearch="true"
  133. :tableHeight="300"
  134. :source="sourceList.salesmanSalesData"
  135. :pagination="sourceList.salesmanSalesPagination"
  136. :config="salesmanSalesConfig"
  137. :loading="salesmanSalesLoading"
  138. highlight-current-row
  139. :selectConfig="[]"
  140. >
  141. </byTable>
  142. </div>
  143. </div>
  144. </el-col>
  145. </el-row>
  146. </div>
  147. <div style="margin-top: 10px">
  148. <el-row>
  149. <el-col :span="12" class="bck" v-loading="productSalesLoading">
  150. <TitleInfo :content="titleList[3]"></TitleInfo>
  151. <div ref="echartDomThree" style="height: 30vh"></div>
  152. <div style="margin-top: 10px">
  153. <byTable
  154. :hideSearch="true"
  155. :tableHeight="300"
  156. :source="sourceList.productSalesVolumeData"
  157. :pagination="sourceList.productSalesVolumePagination"
  158. :config="productSalesConfig"
  159. :loading="productSalesLoading"
  160. highlight-current-row
  161. :selectConfig="[]"
  162. >
  163. </byTable>
  164. </div>
  165. </el-col>
  166. <el-col :span="12" style="padding-left: 10px">
  167. <div class="bck" v-loading="productSalesOneLoading">
  168. <TitleInfo :content="titleList[4]"></TitleInfo>
  169. <div ref="echartDomFour" style="height: 30vh"></div>
  170. <div style="margin-top: 10px">
  171. <byTable
  172. :hideSearch="true"
  173. :tableHeight="300"
  174. :source="sourceList.productSalesVolumeOneData"
  175. :pagination="sourceList.productSalesVolumeOnePagination"
  176. :config="productSalesOneConfig"
  177. :loading="productSalesOneLoading"
  178. highlight-current-row
  179. :selectConfig="[]"
  180. >
  181. </byTable>
  182. </div>
  183. </div>
  184. </el-col>
  185. </el-row>
  186. </div>
  187. </div>
  188. </template>
  189. <script setup>
  190. import * as echarts from "echarts";
  191. import byTable from "@/components/byTable/index";
  192. import TitleInfo from "@/components/TitleInfo/index.vue";
  193. const titleList = [
  194. "销售分布",
  195. "客户分类",
  196. "业务员销售趋势",
  197. "商品销售额",
  198. "商品销量",
  199. ];
  200. const { proxy } = getCurrentInstance();
  201. const statisticsLoading = ref(false);
  202. const scatterLoading = ref(false);
  203. const salesLoading = ref(false);
  204. const salesmanSalesLoading = ref(false);
  205. const productSalesLoading = ref(false);
  206. const productSalesOneLoading = ref(false);
  207. const queryForm = reactive({
  208. beginTime: "",
  209. endTime: "",
  210. timeArr: "",
  211. });
  212. const sourceList = ref({
  213. scatterData: [],
  214. scatterPagination: {
  215. total: 0,
  216. pageNum: 1,
  217. pageSize: 10,
  218. },
  219. salesData: [],
  220. salesPagination: {
  221. total: 0,
  222. pageNum: 1,
  223. pageSize: 10,
  224. },
  225. salesmanSalesData: [],
  226. salesmanSalesPagination: {
  227. total: 0,
  228. pageNum: 1,
  229. pageSize: 10,
  230. },
  231. productSalesVolumeData: [],
  232. productSalesVolumePagination: {
  233. total: 0,
  234. pageNum: 1,
  235. pageSize: 10,
  236. },
  237. productSalesVolumeOneData: [],
  238. productSalesVolumeOnePagination: {
  239. total: 0,
  240. pageNum: 1,
  241. pageSize: 10,
  242. },
  243. });
  244. const allData = reactive({
  245. salesStatisticsData: {},
  246. });
  247. //图表
  248. const echartDom = ref(null);
  249. const echartDomOne = ref(null);
  250. const echartDomTwo = ref(null);
  251. const echartDomThree = ref(null);
  252. const echartDomFour = ref(null);
  253. let myChart = null;
  254. let myChartOne = null;
  255. let myChartTwo = null;
  256. let myChartThree = null;
  257. let myChartFour = null;
  258. const optionOne = reactive({
  259. data: {
  260. tooltip: {
  261. trigger: "item",
  262. },
  263. legend: {
  264. bottom: "0%",
  265. left: "center",
  266. },
  267. series: [
  268. {
  269. name: "销售分析",
  270. type: "pie",
  271. radius: ["30%", "70%"],
  272. avoidLabelOverlap: false,
  273. itemStyle: {
  274. borderRadius: 10,
  275. borderColor: "#fff",
  276. borderWidth: 2,
  277. },
  278. label: {
  279. show: false,
  280. position: "center",
  281. },
  282. emphasis: {
  283. label: {
  284. show: true,
  285. fontSize: 20,
  286. fontWeight: "bold",
  287. },
  288. },
  289. labelLine: {
  290. show: false,
  291. },
  292. data: [
  293. { value: 1048, name: "Search Engine" },
  294. { value: 735, name: "Direct" },
  295. { value: 580, name: "Email" },
  296. { value: 484, name: "Union Ads" },
  297. { value: 300, name: "Video Ads" },
  298. ],
  299. },
  300. ],
  301. },
  302. });
  303. const optionTwo = reactive({
  304. data: {
  305. tooltip: {
  306. trigger: "axis",
  307. axisPointer: {
  308. type: "shadow",
  309. },
  310. },
  311. grid: {
  312. left: "1%",
  313. right: "1%",
  314. bottom: "1%",
  315. top: "10%",
  316. containLabel: true,
  317. },
  318. xAxis: [
  319. {
  320. type: "category",
  321. data: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"],
  322. axisTick: {
  323. alignWithLabel: true,
  324. },
  325. },
  326. ],
  327. yAxis: [
  328. {
  329. type: "value",
  330. },
  331. ],
  332. series: [
  333. {
  334. name: "名称",
  335. type: "bar",
  336. barWidth: "25%",
  337. data: [10, 52, 200, 334, 390, 330, 220],
  338. itemStyle: {
  339. color: "#0084FF",
  340. },
  341. },
  342. ],
  343. },
  344. });
  345. const scatterConfig = computed(() => {
  346. return [
  347. {
  348. type: "index",
  349. attrs: {
  350. label: "序列",
  351. width: 80,
  352. align: "center",
  353. },
  354. },
  355. {
  356. attrs: {
  357. label: "国旗",
  358. slot: "flag",
  359. },
  360. },
  361. {
  362. attrs: {
  363. label: "订单量(单)",
  364. prop: "count",
  365. },
  366. },
  367. {
  368. attrs: {
  369. label: "交易金额(¥)",
  370. prop: "amount",
  371. },
  372. render(amount) {
  373. return proxy.moneyFormat(amount, 2);
  374. },
  375. },
  376. ];
  377. });
  378. const salesConfig = computed(() => {
  379. return [
  380. {
  381. type: "index",
  382. attrs: {
  383. label: "序列",
  384. width: 80,
  385. align: "center",
  386. },
  387. },
  388. {
  389. attrs: {
  390. label: "客户",
  391. prop: "corporationName",
  392. },
  393. },
  394. {
  395. attrs: {
  396. label: "销售额(¥)",
  397. prop: "amount",
  398. },
  399. render(amount) {
  400. return proxy.moneyFormat(amount, 2);
  401. },
  402. },
  403. ];
  404. });
  405. const salesmanSalesConfig = computed(() => {
  406. return [
  407. {
  408. type: "index",
  409. attrs: {
  410. label: "序列",
  411. width: 80,
  412. align: "center",
  413. },
  414. },
  415. {
  416. attrs: {
  417. label: "业务员",
  418. prop: "userName",
  419. },
  420. },
  421. {
  422. attrs: {
  423. label: "销售额(¥)",
  424. prop: "amount",
  425. },
  426. render(amount) {
  427. return proxy.moneyFormat(amount, 2);
  428. },
  429. },
  430. ];
  431. });
  432. const productSalesConfig = computed(() => {
  433. return [
  434. {
  435. type: "index",
  436. attrs: {
  437. label: "序列",
  438. width: 80,
  439. align: "center",
  440. },
  441. },
  442. {
  443. attrs: {
  444. label: "商品名称",
  445. prop: "productName",
  446. },
  447. },
  448. {
  449. attrs: {
  450. label: "销售额(¥)",
  451. prop: "amount",
  452. },
  453. render(amount) {
  454. return proxy.moneyFormat(amount, 2);
  455. },
  456. },
  457. ];
  458. });
  459. const tableHeight = computed(() => {
  460. return document.documentElement.clientHeight / 10 * 4;
  461. });
  462. const productSalesOneConfig = computed(() => {
  463. return [
  464. {
  465. type: "index",
  466. attrs: {
  467. label: "序列",
  468. width: 80,
  469. align: "center",
  470. },
  471. },
  472. {
  473. attrs: {
  474. label: "商品名称",
  475. prop: "productName",
  476. },
  477. },
  478. {
  479. attrs: {
  480. label: "销售量(个)",
  481. prop: "quantity",
  482. },
  483. render(quantity) {
  484. return proxy.moneyFormat(quantity, 2);
  485. },
  486. },
  487. ];
  488. });
  489. const getData = () => {
  490. statisticsLoading.value = true;
  491. scatterLoading.value = true;
  492. salesLoading.value = true;
  493. salesmanSalesLoading.value = true;
  494. productSalesLoading.value = true;
  495. productSalesOneLoading.value = true;
  496. proxy.post("/contract/salesStatistics", queryForm).then((res) => {
  497. allData.salesStatisticsData = res;
  498. setTimeout(() => {
  499. statisticsLoading.value = false;
  500. }, 200);
  501. });
  502. proxy.post("/contract/countrySalesStatistics", queryForm).then((res) => {
  503. sourceList.value.scatterData = res;
  504. //根据amount字段从大到小
  505. res.sort((a, b) => b.amount - a.amount);
  506. //截取前十条
  507. if(res.length > 10) res = res.slice(0, 10);
  508. optionOne.data.series[0].data = res.map((x) => ({
  509. value: x.amount,
  510. name: x.countryName,
  511. }));
  512. myChart.setOption(optionOne.data);
  513. setTimeout(() => {
  514. scatterLoading.value = false;
  515. }, 200);
  516. });
  517. proxy.post("/contract/customSalesStatistics", queryForm).then((res) => {
  518. sourceList.value.salesData = res;
  519. const option = { ...optionTwo };
  520. option.data.xAxis[0].data = res.map((x) => x.corporationName);
  521. option.data.series[0].data = res.map((x) => x.amount);
  522. option.data.series[0].name = "销售额(¥)";
  523. myChartOne.setOption(option.data);
  524. setTimeout(() => {
  525. salesLoading.value = false;
  526. }, 200);
  527. });
  528. proxy.post("/contract/salesmanSalesStatistics", queryForm).then((res) => {
  529. sourceList.value.salesmanSalesData = res;
  530. const option = { ...optionTwo };
  531. option.data.xAxis[0].data = res.map((x) => x.userName);
  532. option.data.series[0].data = res.map((x) => x.amount);
  533. option.data.series[0].name = "销售额(¥)";
  534. myChartTwo.setOption(option.data);
  535. setTimeout(() => {
  536. salesmanSalesLoading.value = false;
  537. }, 200);
  538. });
  539. proxy.post("/contract/productSalesStatistics", queryForm).then((res) => {
  540. sourceList.value.productSalesVolumeData = res;
  541. const option = { ...optionTwo };
  542. option.data.xAxis[0].data = res.map((x) => x.productName);
  543. option.data.series[0].data = res.map((x) => x.amount);
  544. option.data.series[0].name = "销售额(¥)";
  545. myChartThree.setOption(option.data);
  546. setTimeout(() => {
  547. productSalesLoading.value = false;
  548. }, 200);
  549. });
  550. proxy.post("/contract/salesVolumeStatistics", queryForm).then((res) => {
  551. sourceList.value.productSalesVolumeOneData = res;
  552. const option = { ...optionTwo };
  553. option.data.xAxis[0].data = res.map((x) => x.productName);
  554. option.data.series[0].data = res.map((x) => x.quantity);
  555. option.data.series[0].name = "销售量(个)";
  556. myChartFour.setOption(option.data);
  557. setTimeout(() => {
  558. productSalesOneLoading.value = false;
  559. }, 200);
  560. });
  561. };
  562. const onQuery = () => {
  563. if (queryForm.timeArr.length > 1) {
  564. queryForm.beginTime = queryForm.timeArr[0];
  565. queryForm.endTime = queryForm.timeArr[1];
  566. } else {
  567. queryForm.beginTime = "";
  568. queryForm.endTime = "";
  569. }
  570. getData();
  571. };
  572. const onReset = () => {
  573. queryForm.timeArr = [];
  574. onQuery();
  575. };
  576. onMounted(() => {
  577. myChart = echarts.init(echartDom.value);
  578. window.addEventListener("resize", () => {
  579. myChart.resize();
  580. });
  581. // 客户分类柱状图
  582. myChartOne = echarts.init(echartDomOne.value);
  583. window.addEventListener("resize", () => {
  584. myChartOne.resize();
  585. });
  586. // 业务员销售趋势柱状图
  587. myChartTwo = echarts.init(echartDomTwo.value);
  588. window.addEventListener("resize", () => {
  589. myChartTwo.resize();
  590. });
  591. //商品销售额柱状图
  592. myChartThree = echarts.init(echartDomThree.value);
  593. window.addEventListener("resize", () => {
  594. myChartThree.resize();
  595. });
  596. // 商品销量柱状图
  597. myChartFour = echarts.init(echartDomFour.value);
  598. window.addEventListener("resize", () => {
  599. myChartFour.resize();
  600. });
  601. let endData = new Date();
  602. let beginDate = new Date();
  603. beginDate.setMonth(0);
  604. beginDate.setDate(1);
  605. queryForm.timeArr = [proxy.parseTime(beginDate, "{y}-{m}-{d}"), proxy.parseTime(endData, "{y}-{m}-{d}")];
  606. onQuery();
  607. });
  608. </script>
  609. <style lang="scss" scoped>
  610. .content {
  611. margin: 20px;
  612. }
  613. :deep(.el-form-item) {
  614. margin-bottom: 0px;
  615. }
  616. .bck {
  617. background-color: #fff;
  618. padding: 15px;
  619. }
  620. .statistics {
  621. display: flex;
  622. // justify-content: space-around;
  623. .item {
  624. border-radius: 10px;
  625. margin-right: 20px;
  626. width: 13vw;
  627. height: 70px;
  628. padding: 10px;
  629. box-sizing: border-box;
  630. display: flex;
  631. justify-content: space-between;
  632. .left_ {
  633. display: flex;
  634. flex-direction: column;
  635. justify-content: space-around;
  636. .money {
  637. font-weight: 700;
  638. color: #333333;
  639. font-size: 15px;
  640. }
  641. }
  642. .right_ {
  643. .icon {
  644. img {
  645. width: 20px;
  646. height: 20px;
  647. margin-top: 6px;
  648. }
  649. width: 34px;
  650. height: 34px;
  651. margin-top: 10px;
  652. border-radius: 8px;
  653. background-color: #ffffff;
  654. text-align: center;
  655. line-height: 34px;
  656. }
  657. }
  658. }
  659. .first {
  660. background: linear-gradient(#c7e3fe, #dfecff);
  661. }
  662. .two {
  663. background: linear-gradient(#eae8fb, #ded9ff);
  664. }
  665. .three {
  666. background: linear-gradient(#fcf1e4, #fce5ca);
  667. }
  668. .four {
  669. background: linear-gradient(#e2fbe8, #e2fbe8);
  670. }
  671. .five {
  672. background: linear-gradient(#ffebe9, #ffebe9);
  673. }
  674. }
  675. .stat-warp {
  676. background: #fff;
  677. padding: 20px;
  678. overflow: hidden;
  679. position: relative;
  680. border-radius: 5px;
  681. .title {
  682. height: 60px;
  683. select {
  684. height: 60px;
  685. border: none;
  686. outline: none;
  687. -webkit-appearance: none;
  688. appearance: none;
  689. font-size: 14px;
  690. font-weight: bold;
  691. background: url('@/assets/images/sanjiao.png') no-repeat right
  692. center;
  693. padding-right: 20px;
  694. }
  695. div {
  696. height: 60px;
  697. font-size: 14px;
  698. font-weight: bold;
  699. line-height: 60px;
  700. }
  701. }
  702. ul {
  703. padding: 0;
  704. overflow: hidden;
  705. margin: 0;
  706. li {
  707. list-style: none;
  708. min-width: 285px;
  709. box-sizing: border-box;
  710. margin-right: 20px;
  711. background: linear-gradient(360deg, #C7E3FE 0%, #DFECFF 100%);
  712. float: left;
  713. overflow: hidden;
  714. padding: 20px;
  715. color: #333333;
  716. position: relative;
  717. border-radius: 10px;
  718. cursor: pointer;
  719. .label {
  720. font-size: 14px;
  721. margin-top: 10px;
  722. }
  723. .label::before {
  724. // width: 10px;
  725. // height: 10px;
  726. // content: '';
  727. // border-radius: 50%;
  728. // background: #0084ff;
  729. // display: inline-block;
  730. // margin-right: 10px;
  731. }
  732. .num {
  733. font-size: 24px;
  734. font-weight: bold;
  735. }
  736. .icon-box{
  737. position: absolute;
  738. height: 40px;
  739. width: 40px;
  740. right: 20px;
  741. top: 20px;
  742. background: #fff;
  743. border-radius: 10px;
  744. text-align: center;
  745. line-height: 40px;
  746. i{
  747. font-size: 20px;
  748. color:#0084FF;
  749. }
  750. }
  751. }
  752. //#F5F3FF #9E64ED
  753. .theme2 {
  754. background: linear-gradient(180deg, #EAE8FB 0%, #DED9FF 100%);
  755. .label::before {
  756. background: #7566F0;
  757. }
  758. .icon-box i {
  759. color: #7566F0;
  760. }
  761. }
  762. //#FFF1E1 #FF9315
  763. .theme3 {
  764. background: #fff1e1;
  765. .label::before {
  766. background: #ff9315;
  767. }
  768. .icon-box i {
  769. color: #FF9315;
  770. }
  771. }
  772. //#E2FBE8 #39C55A
  773. .theme4 {
  774. background: #e2fbe8;
  775. .label::before {
  776. background: #39c55a;
  777. }
  778. }
  779. .theme5 {
  780. background: #ffebe9;
  781. .label::before {
  782. background: #f94539;
  783. }
  784. }
  785. .theme6 {
  786. background: #e4f9f9;
  787. .label::before {
  788. background: #53cbcb;
  789. }
  790. }
  791. .multi-data {
  792. .label::before {
  793. display: none;
  794. }
  795. .label {
  796. font-size: 14px;
  797. font-weight: bold;
  798. color: #333;
  799. margin-bottom: 8px;
  800. }
  801. .num-warp {
  802. overflow: hidden;
  803. .num-box {
  804. float: left;
  805. min-width: 80px;
  806. margin-right: 20px;
  807. .num-small {
  808. font-size: 16px;
  809. font-weight: bold;
  810. margin-bottom: 8px;
  811. }
  812. .label-small {
  813. color: #666;
  814. font-size: 14px;
  815. }
  816. }
  817. }
  818. }
  819. }
  820. }
  821. // .scatter {
  822. // display: flex;
  823. // }
  824. .public {
  825. display: flex;
  826. }
  827. </style>