index.vue 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616
  1. <template>
  2. <div class="manage-root organize-manage">
  3. <Header />
  4. <div class="manage-root-contain">
  5. <nav-menu
  6. class="manage-root-contain-left"
  7. :activeMenuIndex="activeMenuIndex"
  8. ></nav-menu>
  9. <div class="manage-root-contain-right personnel-manage-right">
  10. <div class="top">
  11. <span>数据中心</span>
  12. <b>{{ queryTime }}</b>
  13. </div>
  14. <div class="day-stat-data" v-if="curDayStatData">
  15. <div class="day-item" v-if="curDayStatData.person_count">
  16. <div class="day-item-left">
  17. <p>用户总数</p>
  18. <span
  19. >{{ curDayStatData.person_count.total_count | formatNumber
  20. }}<b>人</b></span
  21. >
  22. </div>
  23. <div class="day-item-center">
  24. <p>较上周</p>
  25. <span
  26. :class="[
  27. curDayStatData.person_count.add_count_pre_week > 0
  28. ? 'add'
  29. : curDayStatData.person_count.add_count_pre_week === 0
  30. ? 'flat'
  31. : 'down',
  32. ]"
  33. >
  34. <img
  35. :src="
  36. curDayStatData.person_count.add_count_pre_week > 0
  37. ? require('../../assets/caret-up.png')
  38. : curDayStatData.person_count.add_count_pre_week === 0
  39. ? require('../../assets/caret-flat.png')
  40. : require('../../assets/caret-down.png')
  41. "
  42. />
  43. <a>{{ curDayStatData.person_count.add_count_pre_week }}</a>
  44. </span>
  45. </div>
  46. <div class="day-item-right">
  47. <p>较上月</p>
  48. <span
  49. :class="[
  50. curDayStatData.person_count.add_count_pre_week > 0
  51. ? 'add'
  52. : curDayStatData.person_count.add_count_pre_week === 0
  53. ? 'flat'
  54. : 'down',
  55. ]"
  56. >
  57. <img
  58. :src="
  59. curDayStatData.person_count.add_count_pre_month > 0
  60. ? require('../../assets/caret-up.png')
  61. : curDayStatData.person_count.add_count_pre_month === 0
  62. ? require('../../assets/caret-flat.png')
  63. : require('../../assets/caret-down.png')
  64. "
  65. />
  66. <a>{{ curDayStatData.person_count.add_count_pre_month }}</a>
  67. </span>
  68. </div>
  69. </div>
  70. <div class="day-item" v-if="curDayStatData.org_count">
  71. <div class="day-item-left">
  72. <p>机构总数</p>
  73. <span
  74. >{{ curDayStatData.org_count.total_count | formatNumber
  75. }}<b>个</b></span
  76. >
  77. </div>
  78. <div class="day-item-center">
  79. <p>较上周</p>
  80. <span
  81. :class="[
  82. curDayStatData.org_count.add_count_pre_week > 0
  83. ? 'add'
  84. : curDayStatData.org_count.add_count_pre_week === 0
  85. ? 'flat'
  86. : 'down',
  87. ]"
  88. >
  89. <img
  90. :src="
  91. curDayStatData.org_count.add_count_pre_week > 0
  92. ? require('../../assets/caret-up.png')
  93. : curDayStatData.org_count.add_count_pre_week === 0
  94. ? require('../../assets/caret-flat.png')
  95. : require('../../assets/caret-down.png')
  96. "
  97. />
  98. <a>{{ curDayStatData.org_count.add_count_pre_week }}</a>
  99. </span>
  100. </div>
  101. <div class="day-item-right">
  102. <p>较上月</p>
  103. <span
  104. :class="[
  105. curDayStatData.org_count.add_count_pre_week > 0
  106. ? 'add'
  107. : curDayStatData.org_count.add_count_pre_week === 0
  108. ? 'flat'
  109. : 'down',
  110. ]"
  111. >
  112. <img
  113. :src="
  114. curDayStatData.org_count.add_count_pre_month > 0
  115. ? require('../../assets/caret-up.png')
  116. : curDayStatData.org_count.add_count_pre_month === 0
  117. ? require('../../assets/caret-flat.png')
  118. : require('../../assets/caret-down.png')
  119. "
  120. />
  121. <a>{{ curDayStatData.org_count.add_count_pre_month }}</a>
  122. </span>
  123. </div>
  124. </div>
  125. <div class="day-item" v-if="curDayStatData.course_play_person_count">
  126. <div class="day-item-left">
  127. <p>累计上课人数</p>
  128. <span
  129. >{{
  130. curDayStatData.course_play_person_count.total_count
  131. | formatNumber
  132. }}<b>人</b></span
  133. >
  134. </div>
  135. <div class="day-item-center">
  136. <p>较上周</p>
  137. <span
  138. :class="[
  139. curDayStatData.course_play_person_count.add_count_pre_week > 0
  140. ? 'add'
  141. : curDayStatData.course_play_person_count
  142. .add_count_pre_week === 0
  143. ? 'flat'
  144. : 'down',
  145. ]"
  146. >
  147. <img
  148. :src="
  149. curDayStatData.course_play_person_count.add_count_pre_week >
  150. 0
  151. ? require('../../assets/caret-up.png')
  152. : curDayStatData.course_play_person_count
  153. .add_count_pre_week === 0
  154. ? require('../../assets/caret-flat.png')
  155. : require('../../assets/caret-down.png')
  156. "
  157. />
  158. <a>{{
  159. curDayStatData.course_play_person_count.add_count_pre_week
  160. }}</a>
  161. </span>
  162. </div>
  163. <div class="day-item-right">
  164. <p>较上月</p>
  165. <span
  166. :class="[
  167. curDayStatData.course_play_person_count.add_count_pre_week > 0
  168. ? 'add'
  169. : curDayStatData.course_play_person_count
  170. .add_count_pre_week === 0
  171. ? 'flat'
  172. : 'down',
  173. ]"
  174. >
  175. <img
  176. :src="
  177. curDayStatData.course_play_person_count
  178. .add_count_pre_month > 0
  179. ? require('../../assets/caret-up.png')
  180. : curDayStatData.course_play_person_count
  181. .add_count_pre_month === 0
  182. ? require('../../assets/caret-flat.png')
  183. : require('../../assets/caret-down.png')
  184. "
  185. />
  186. <a>{{
  187. curDayStatData.course_play_person_count.add_count_pre_month
  188. }}</a>
  189. </span>
  190. </div>
  191. </div>
  192. <div class="day-item" v-if="curDayStatData.course_play_count">
  193. <div class="day-item-left">
  194. <p>累计上课人次</p>
  195. <span
  196. >{{ curDayStatData.course_play_count.total_count | formatNumber
  197. }}<b>人次</b></span
  198. >
  199. </div>
  200. <div class="day-item-center">
  201. <p>较上周</p>
  202. <span
  203. :class="[
  204. curDayStatData.course_play_count.add_count_pre_week > 0
  205. ? 'add'
  206. : curDayStatData.course_play_count.add_count_pre_week === 0
  207. ? 'flat'
  208. : 'down',
  209. ]"
  210. >
  211. <img
  212. :src="
  213. curDayStatData.course_play_count.add_count_pre_week > 0
  214. ? require('../../assets/caret-up.png')
  215. : curDayStatData.course_play_count.add_count_pre_week ===
  216. 0
  217. ? require('../../assets/caret-flat.png')
  218. : require('../../assets/caret-down.png')
  219. "
  220. />
  221. <a>{{ curDayStatData.course_play_count.add_count_pre_week }}</a>
  222. </span>
  223. </div>
  224. <div class="day-item-right">
  225. <p>较上月</p>
  226. <span
  227. :class="[
  228. curDayStatData.course_play_count.add_count_pre_week > 0
  229. ? 'add'
  230. : curDayStatData.course_play_count.add_count_pre_week === 0
  231. ? 'flat'
  232. : 'down',
  233. ]"
  234. >
  235. <img
  236. :src="
  237. curDayStatData.course_play_count.add_count_pre_month > 0
  238. ? require('../../assets/caret-up.png')
  239. : curDayStatData.course_play_count.add_count_pre_month ===
  240. 0
  241. ? require('../../assets/caret-flat.png')
  242. : require('../../assets/caret-down.png')
  243. "
  244. />
  245. <a>{{
  246. curDayStatData.course_play_count.add_count_pre_month
  247. }}</a>
  248. </span>
  249. </div>
  250. </div>
  251. <div class="day-item" v-if="curDayStatData.article_reading_duration">
  252. <div class="day-item-left">
  253. <p>平台总阅读时长</p>
  254. <span
  255. >{{
  256. Math.ceil(
  257. curDayStatData.article_reading_duration.total_duration /
  258. 3600
  259. ) | formatNumber
  260. }}<b>时</b></span
  261. >
  262. </div>
  263. <div class="day-item-center">
  264. <p>较上周</p>
  265. <span
  266. :class="[
  267. curDayStatData.article_reading_duration
  268. .add_duration_pre_week > 0
  269. ? 'add'
  270. : curDayStatData.article_reading_duration
  271. .add_duration_pre_week === 0
  272. ? 'flat'
  273. : 'down',
  274. ]"
  275. >
  276. <img
  277. :src="
  278. curDayStatData.article_reading_duration
  279. .add_duration_pre_week > 0
  280. ? require('../../assets/caret-up.png')
  281. : curDayStatData.article_reading_duration
  282. .add_duration_pre_week === 0
  283. ? require('../../assets/caret-flat.png')
  284. : require('../../assets/caret-down.png')
  285. "
  286. />
  287. <a>{{
  288. curDayStatData.article_reading_duration.add_duration_pre_week
  289. }}</a>
  290. </span>
  291. </div>
  292. <div class="day-item-right">
  293. <p>较上月</p>
  294. <span
  295. :class="[
  296. curDayStatData.article_reading_duration
  297. .add_duration_pre_month > 0
  298. ? 'add'
  299. : curDayStatData.article_reading_duration
  300. .add_duration_pre_month === 0
  301. ? 'flat'
  302. : 'down',
  303. ]"
  304. >
  305. <img
  306. :src="
  307. curDayStatData.article_reading_duration
  308. .add_duration_pre_month > 0
  309. ? require('../../assets/caret-up.png')
  310. : curDayStatData.article_reading_duration
  311. .add_duration_pre_month === 0
  312. ? require('../../assets/caret-flat.png')
  313. : require('../../assets/caret-down.png')
  314. "
  315. />
  316. <a>{{
  317. curDayStatData.article_reading_duration.add_duration_pre_month
  318. }}</a>
  319. </span>
  320. </div>
  321. </div>
  322. <div
  323. class="day-item"
  324. v-if="curDayStatData.article_reading_word_count"
  325. >
  326. <div class="day-item-left">
  327. <p>平台总阅读词数</p>
  328. <span
  329. >{{
  330. curDayStatData.article_reading_word_count.total_count
  331. | formatNumber
  332. }}<b>词</b></span
  333. >
  334. </div>
  335. <div class="day-item-center">
  336. <p>较上周</p>
  337. <span
  338. :class="[
  339. curDayStatData.article_reading_word_count.add_count_pre_week >
  340. 0
  341. ? 'add'
  342. : curDayStatData.article_reading_word_count
  343. .add_count_pre_week === 0
  344. ? 'flat'
  345. : 'down',
  346. ]"
  347. >
  348. <img
  349. :src="
  350. curDayStatData.article_reading_word_count
  351. .add_count_pre_week > 0
  352. ? require('../../assets/caret-up.png')
  353. : curDayStatData.article_reading_word_count
  354. .add_count_pre_week === 0
  355. ? require('../../assets/caret-flat.png')
  356. : require('../../assets/caret-down.png')
  357. "
  358. />
  359. <a>{{
  360. curDayStatData.article_reading_word_count.add_count_pre_week
  361. }}</a>
  362. </span>
  363. </div>
  364. <div class="day-item-right">
  365. <p>较上月</p>
  366. <span
  367. :class="[
  368. curDayStatData.article_reading_word_count.add_count_pre_week >
  369. 0
  370. ? 'add'
  371. : curDayStatData.article_reading_word_count
  372. .add_count_pre_week === 0
  373. ? 'flat'
  374. : 'down',
  375. ]"
  376. >
  377. <img
  378. :src="
  379. curDayStatData.article_reading_word_count
  380. .add_count_pre_month > 0
  381. ? require('../../assets/caret-up.png')
  382. : curDayStatData.article_reading_word_count
  383. .add_count_pre_month === 0
  384. ? require('../../assets/caret-flat.png')
  385. : require('../../assets/caret-down.png')
  386. "
  387. />
  388. <a>{{
  389. curDayStatData.article_reading_word_count.add_count_pre_month
  390. }}</a>
  391. </span>
  392. </div>
  393. </div>
  394. </div>
  395. </div>
  396. </div>
  397. </div>
  398. </template>
  399. <script>
  400. //这里可以导入其它文件(比如:组件,工具js,第三方插件js,json文件,图片文件等等)
  401. //例如:import 《组件名称》from ‘《组件路径》';
  402. import Header from "../../components/Header.vue";
  403. import NavMenu from "../../components/NavMenu.vue";
  404. import { getLogin } from "@/api/ajax";
  405. import { formatNumber } from "@/utils/defined";
  406. export default {
  407. //import引入的组件需要注入到对象中才能使用
  408. components: { Header, NavMenu },
  409. props: {},
  410. filters: {
  411. formatNumber,
  412. },
  413. data() {
  414. //这里存放数据
  415. return {
  416. activeMenuIndex: "data_center",
  417. tableHeight: "", // 表格高度
  418. tableLoading: false,
  419. queryTime: this.getCurrentDateTime(),
  420. curDayStatData: null, // 当日统计数据
  421. };
  422. },
  423. //计算属性 类似于data概念
  424. computed: {},
  425. //监控data中数据变化
  426. watch: {},
  427. //方法集合
  428. methods: {
  429. //计算table高度(动态设置table高度)
  430. getTableHeight() {
  431. let tableH = 420; //距离页面下方的高度
  432. let tableHeightDetil = window.innerHeight - tableH;
  433. if (tableHeightDetil <= 300) {
  434. this.tableHeight = 300;
  435. } else {
  436. this.tableHeight = window.innerHeight - tableH;
  437. }
  438. },
  439. // 获取数据
  440. getData() {
  441. // 得到当日统计数据
  442. let MethodName1 = "/ShopServer/Manager/DataStat/GetCurDayStatData";
  443. getLogin(MethodName1, {}).then((res) => {
  444. if (res.status === 1) {
  445. this.curDayStatData = res;
  446. }
  447. });
  448. // 统计用户区域分布(购买物品的用户)
  449. let MethodName2 =
  450. "/ShopServer/Manager/DataStat/StatUserAreaDistribution_BuyGoods";
  451. getLogin(MethodName2, {
  452. goods_type: -1,
  453. }).then((res) => {});
  454. // 统计每日人员数量
  455. let MethodName3 = "/ShopServer/Manager/DataStat/StatDailyPersonCount";
  456. let data1 = {
  457. province_id_list: ["01", "02"],
  458. city_id_list: ["0101", "0202"],
  459. begin_date: "2024-01-01",
  460. end_date: "2024-02-01",
  461. };
  462. getLogin(MethodName3, data1).then((res) => {});
  463. // 统计每日机构数量
  464. let MethodName4 = "/ShopServer/Manager/DataStat/StatDailyOrgCount";
  465. getLogin(MethodName4, data1).then((res) => {});
  466. // 统计每日累计上课人数
  467. let MethodName5 =
  468. "/ShopServer/Manager/DataStat/StatDailyAccCoursePlayPersonCount";
  469. getLogin(MethodName5, data1).then((res) => {});
  470. // 统计每日累计阅读时长
  471. let MethodName6 =
  472. "/ShopServer/Manager/DataStat/StatDailyAccArticleReadingDuration";
  473. getLogin(MethodName6, data1).then((res) => {});
  474. // 统计每日累计阅读词数
  475. let MethodName7 =
  476. "/ShopServer/Manager/DataStat/StatDailyAccArticleReadingWordCount";
  477. getLogin(MethodName7, data1).then((res) => {});
  478. // 统计每日累计上课人次
  479. let MethodName8 =
  480. "/ShopServer/Manager/DataStat/StatDailyAccCoursePlayCount";
  481. getLogin(MethodName8, data1).then((res) => {});
  482. },
  483. // 获取时间
  484. getCurrentDateTime() {
  485. const now = new Date();
  486. const year = now.getFullYear();
  487. const month = this.padNumber(now.getMonth() + 1); // 月份是从0开始的
  488. const day = this.padNumber(now.getDate());
  489. const hours = this.padNumber(now.getHours());
  490. const minutes = this.padNumber(now.getMinutes());
  491. return `${year}-${month}-${day} ${hours}:${minutes}`;
  492. },
  493. padNumber(num) {
  494. return num < 10 ? "0" + num : num;
  495. },
  496. },
  497. //生命周期 - 创建完成(可以访问当前this实例)
  498. created() {
  499. this.getTableHeight();
  500. this.getData();
  501. },
  502. //生命周期 - 挂载完成(可以访问DOM元素)
  503. mounted() {},
  504. //生命周期-创建之前
  505. beforeCreated() {},
  506. //生命周期-挂载之前
  507. beforeMount() {},
  508. //生命周期-更新之前
  509. beforUpdate() {},
  510. //生命周期-更新之后
  511. updated() {},
  512. //生命周期-销毁之前
  513. beforeDestory() {},
  514. //生命周期-销毁完成
  515. destoryed() {},
  516. //如果页面有keep-alive缓存功能,这个函数会触发
  517. activated() {},
  518. };
  519. </script>
  520. <style lang="scss" scoped>
  521. /* @import url(); 引入css类 */
  522. .manage-root-contain-right {
  523. padding-top: 24px;
  524. }
  525. .top {
  526. border-radius: 6px;
  527. background: #2460ff;
  528. padding: 20px 24px;
  529. display: flex;
  530. justify-content: space-between;
  531. color: #fff;
  532. font-weight: 500;
  533. align-items: center;
  534. span {
  535. font-size: 20px;
  536. line-height: 28px; /* 140% */
  537. }
  538. b {
  539. font-size: 12px;
  540. line-height: 20px; /* 166.667% */
  541. }
  542. }
  543. .day-stat-data {
  544. display: flex;
  545. gap: 16px;
  546. margin-top: 24px;
  547. flex-flow: wrap;
  548. .day-item {
  549. width: calc(50% - 8px);
  550. border-radius: 6px;
  551. background: #fff;
  552. flex-shrink: 0;
  553. display: flex;
  554. justify-content: space-between;
  555. padding: 16px 40px;
  556. column-gap: 24px;
  557. align-items: center;
  558. p {
  559. color: #4e5969;
  560. font-size: 12px;
  561. font-weight: 400;
  562. line-height: 20px;
  563. margin: 0;
  564. }
  565. .day-item-left {
  566. flex: 1;
  567. p {
  568. margin-bottom: 8px;
  569. }
  570. span {
  571. color: #1d2129;
  572. font-size: 22px;
  573. font-weight: 700;
  574. line-height: 24px;
  575. b {
  576. color: #4e5969;
  577. font-size: 12px;
  578. font-weight: 400;
  579. line-height: 20px;
  580. margin-left: 4px;
  581. }
  582. }
  583. }
  584. .day-item-center,
  585. .day-item-right {
  586. width: 80px;
  587. text-align: right;
  588. img {
  589. width: 16px;
  590. height: 16px;
  591. }
  592. a {
  593. font-size: 16px;
  594. font-weight: 600;
  595. line-height: 22px;
  596. }
  597. span {
  598. display: flex;
  599. justify-content: end;
  600. align-items: center;
  601. &.up {
  602. color: #fc4d42;
  603. }
  604. &.flat {
  605. color: #165dff;
  606. }
  607. &.down {
  608. color: #34b531;
  609. }
  610. }
  611. }
  612. }
  613. }
  614. </style>