index.vue 46 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513
  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 class="echart-box">
  396. <div class="echart-require">
  397. <el-cascader
  398. size="medium"
  399. :props="props"
  400. collapse-tags
  401. clearable
  402. :options="$provinceCityList"
  403. v-model="selectedOptions"
  404. class="cascader-option"
  405. >
  406. </el-cascader>
  407. <el-date-picker
  408. v-model="dataValue"
  409. type="daterange"
  410. align="right"
  411. unlink-panels
  412. range-separator="-"
  413. start-placeholder="开始日期"
  414. end-placeholder="结束日期"
  415. :picker-options="pickerOptions"
  416. value-format="yyyy-MM-dd"
  417. >
  418. </el-date-picker>
  419. <el-button type="primary" size="small" @click="searchStatDaily"
  420. >查询</el-button
  421. >
  422. </div>
  423. <div class="echart-item-box">
  424. <div class="echart-item" id="echart1"></div>
  425. <div class="echart-item" id="echart2"></div>
  426. <div class="echart-item" id="echart3"></div>
  427. <div class="echart-item" id="echart4"></div>
  428. <div class="echart-item" id="echart5"></div>
  429. <div class="echart-item" id="echart6"></div>
  430. </div>
  431. <div class="read-info" v-if="readInfo">
  432. <!-- <span>文章数:{{ readInfo.article_count }}篇</span> -->
  433. <el-button
  434. type="primary"
  435. size="small"
  436. @click="handleExport"
  437. :loading="exportLoading"
  438. >导出阅读数据</el-button
  439. >
  440. </div>
  441. <el-table
  442. :data="articleList"
  443. v-loading="tableLoading"
  444. stripe
  445. @sort-change="handleSort"
  446. :default-sort="dataSort"
  447. >
  448. <el-table-column
  449. type="index"
  450. label="#"
  451. width="60"
  452. :index="(pageNumber - 1) * pageSize + 1"
  453. >
  454. </el-table-column>
  455. <el-table-column
  456. prop="person_name"
  457. sortable="custom"
  458. label="人员姓名"
  459. width="100"
  460. >
  461. </el-table-column>
  462. <el-table-column
  463. prop="article_title"
  464. sortable="custom"
  465. label="文章"
  466. >
  467. </el-table-column>
  468. <el-table-column
  469. prop="goods_type"
  470. sortable="custom"
  471. width="100"
  472. label="类型"
  473. >
  474. <template slot-scope="scope">
  475. <span
  476. class="items-type"
  477. :style="{
  478. background: goodsTypeListCss[scope.row.goods_type]
  479. ? goodsTypeListCss[scope.row.goods_type].bg
  480. : '',
  481. color: goodsTypeListCss[scope.row.goods_type]
  482. ? goodsTypeListCss[scope.row.goods_type].color
  483. : '',
  484. }"
  485. >{{ goodsTypeListCss[scope.row.goods_type].text }}</span
  486. >
  487. </template>
  488. </el-table-column>
  489. <el-table-column
  490. prop="study_phase_name"
  491. sortable="custom"
  492. label="学段"
  493. width="81"
  494. >
  495. </el-table-column>
  496. <el-table-column
  497. prop="issue_no_name"
  498. sortable="custom"
  499. label="来源"
  500. width="197"
  501. >
  502. </el-table-column>
  503. <el-table-column prop="words" label="词数/长度" width="140">
  504. <template slot-scope="scope">
  505. {{
  506. scope.row.article_diff_word_count +
  507. "/" +
  508. scope.row.article_word_count
  509. }}
  510. </template>
  511. </el-table-column>
  512. <el-table-column
  513. prop="duration"
  514. sortable="custom"
  515. label="阅读时长"
  516. width="140"
  517. >
  518. <template slot-scope="scope">
  519. {{ formatterDuration(scope.row) }}
  520. </template>
  521. </el-table-column>
  522. <el-table-column
  523. prop="reading_time"
  524. sortable="custom"
  525. label="阅读时间"
  526. width="160"
  527. >
  528. <template slot-scope="scope">
  529. {{
  530. scope.row.reading_time
  531. ? scope.row.reading_time.substring(0, 16)
  532. : "-"
  533. }}
  534. </template>
  535. </el-table-column>
  536. </el-table>
  537. <el-pagination
  538. background
  539. @size-change="
  540. (val) => handleSizeChange(val, 'pageSize', 'pageNumber')
  541. "
  542. @current-change="(val) => handleCurrentChange(val, 'pageNumber')"
  543. :current-page="pageNumber"
  544. :page-sizes="[10, 20, 30, 40, 50]"
  545. :page-size="pageSize"
  546. layout="total, prev, pager, next, sizes, jumper"
  547. :total="total_count_a"
  548. >
  549. </el-pagination>
  550. </div>
  551. </div>
  552. </div>
  553. </div>
  554. </template>
  555. <script>
  556. //这里可以导入其它文件(比如:组件,工具js,第三方插件js,json文件,图片文件等等)
  557. //例如:import 《组件名称》from ‘《组件路径》';
  558. import Header from "../../components/Header.vue";
  559. import NavMenu from "../../components/NavMenu.vue";
  560. import { getLogin } from "@/api/ajax";
  561. import { formatNumber } from "@/utils/defined";
  562. import { mapState } from "vuex";
  563. import * as echarts from "echarts";
  564. import { formatSeconds } from "@/utils/index";
  565. export default {
  566. //import引入的组件需要注入到对象中才能使用
  567. components: { Header, NavMenu },
  568. props: {},
  569. filters: {
  570. formatNumber,
  571. },
  572. data() {
  573. //这里存放数据
  574. return {
  575. activeMenuIndex: "data_center",
  576. tableHeight: "", // 表格高度
  577. tableLoading: false,
  578. queryTime: this.getCurrentDateTime(),
  579. curDayStatData: null, // 当日统计数据
  580. selectedOptions: [],
  581. dataValue: [
  582. new Date(new Date().getTime() - 3600 * 1000 * 24 * 7)
  583. .toISOString()
  584. .split("T")[0],
  585. new Date(new Date()).toISOString().split("T")[0],
  586. ],
  587. pickerOptions: {
  588. shortcuts: [
  589. {
  590. text: "最近一周",
  591. onClick(picker) {
  592. const end = new Date();
  593. const start = new Date();
  594. start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
  595. picker.$emit("pick", [start, end]);
  596. },
  597. },
  598. {
  599. text: "最近一个月",
  600. onClick(picker) {
  601. const end = new Date();
  602. const start = new Date();
  603. start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
  604. picker.$emit("pick", [start, end]);
  605. },
  606. },
  607. {
  608. text: "最近三个月",
  609. onClick(picker) {
  610. const end = new Date();
  611. const start = new Date();
  612. start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
  613. picker.$emit("pick", [start, end]);
  614. },
  615. },
  616. ],
  617. },
  618. props: { multiple: true },
  619. pageSize: 10,
  620. pageNumber: 1,
  621. articleList: [],
  622. tableLoading: false,
  623. total_count_a: 0,
  624. readInfo: null,
  625. dataSort: {},
  626. goodsTypeListCss: {
  627. 2: {
  628. text: "报纸",
  629. color: "#165DFF",
  630. bg: "#E8F7FF",
  631. },
  632. 21: {
  633. text: "文章",
  634. color: "#165DFF",
  635. bg: "#E8F7FF",
  636. },
  637. 3: {
  638. text: "精读",
  639. color: "#0FC6C2",
  640. bg: "#E8FFFB",
  641. },
  642. 0: {
  643. text: "课程",
  644. color: "#722ED1",
  645. bg: "#F5E8FF",
  646. },
  647. 1: {
  648. text: "课程",
  649. color: "#722ED1",
  650. bg: "#F5E8FF",
  651. },
  652. 10: {
  653. text: "课程",
  654. color: "#722ED1",
  655. bg: "#F5E8FF",
  656. },
  657. // '5':{
  658. // text:'报纸专辑',
  659. // color:'#165DFF',
  660. // bg:'#E8F7FF'
  661. // },
  662. 4: {
  663. text: "画刊",
  664. color: "#F53F3F",
  665. bg: "#FFECE8",
  666. },
  667. },
  668. exportLoading: false,
  669. };
  670. },
  671. //计算属性 类似于data概念
  672. computed: {
  673. ...mapState(["$provinceCityList"]),
  674. },
  675. //监控data中数据变化
  676. watch: {},
  677. //方法集合
  678. methods: {
  679. //计算table高度(动态设置table高度)
  680. getTableHeight() {
  681. let tableH = 420; //距离页面下方的高度
  682. let tableHeightDetil = window.innerHeight - tableH;
  683. if (tableHeightDetil <= 300) {
  684. this.tableHeight = 300;
  685. } else {
  686. this.tableHeight = window.innerHeight - tableH;
  687. }
  688. },
  689. // 获取数据
  690. getData() {
  691. // 得到当日统计数据
  692. let MethodName1 = "/ShopServer/Manager/DataStat/GetCurDayStatData";
  693. getLogin(MethodName1, {}).then((res) => {
  694. if (res.status === 1) {
  695. this.curDayStatData = res;
  696. }
  697. });
  698. // 统计用户区域分布(购买物品的用户)
  699. let MethodName2 =
  700. "/ShopServer/Manager/DataStat/StatUserAreaDistribution_BuyGoods";
  701. getLogin(MethodName2, {
  702. goods_type: -1,
  703. }).then((res) => {});
  704. },
  705. // 获取时间
  706. getCurrentDateTime() {
  707. const now = new Date();
  708. const year = now.getFullYear();
  709. const month = this.padNumber(now.getMonth() + 1); // 月份是从0开始的
  710. const day = this.padNumber(now.getDate());
  711. const hours = this.padNumber(now.getHours());
  712. const minutes = this.padNumber(now.getMinutes());
  713. return `${year}-${month}-${day} ${hours}:${minutes}`;
  714. },
  715. padNumber(num) {
  716. return num < 10 ? "0" + num : num;
  717. },
  718. // 折线图数据
  719. searchStatDaily() {
  720. // 统计每日人员数量
  721. let MethodName3 = "/ShopServer/Manager/DataStat/StatDailyPersonCount";
  722. let province_id_list = [];
  723. let city_id_list = [];
  724. this.selectedOptions.forEach((item) => {
  725. if (province_id_list.indexOf(item[0]) === -1) {
  726. province_id_list.push(item[0]);
  727. }
  728. city_id_list.push(item[1] ? item[1] : "");
  729. });
  730. let data1 = {
  731. province_id_list: province_id_list,
  732. city_id_list: city_id_list,
  733. begin_date:
  734. this.dataValue && this.dataValue[0] ? this.dataValue[0] : "",
  735. end_date: this.dataValue && this.dataValue[1] ? this.dataValue[1] : "",
  736. };
  737. getLogin(MethodName3, data1).then((res) => {
  738. let xAxisData = [];
  739. let yAxisData = [];
  740. if (res.status === 1) {
  741. res.date_list.forEach((item) => {
  742. xAxisData.push(item.date);
  743. yAxisData.push(item.count);
  744. });
  745. }
  746. const chartDom = document.getElementById("echart1");
  747. const myChart = echarts.init(chartDom);
  748. let option = {
  749. title: {
  750. text: "用户总数",
  751. },
  752. tooltip: {
  753. trigger: "axis",
  754. },
  755. grid: {
  756. left: "3%",
  757. right: "4%",
  758. bottom: "3%",
  759. containLabel: true,
  760. },
  761. xAxis: {
  762. type: "category",
  763. boundaryGap: false,
  764. data: xAxisData,
  765. splitLine: {
  766. // 设置 y 轴分割线为虚线
  767. show: true,
  768. lineStyle: {
  769. type: "line",
  770. },
  771. },
  772. },
  773. yAxis: {
  774. type: "value",
  775. splitLine: {
  776. // 设置 y 轴分割线为虚线
  777. show: true,
  778. lineStyle: {
  779. type: "dashed",
  780. },
  781. },
  782. },
  783. series: [
  784. {
  785. type: "line",
  786. data: yAxisData,
  787. lineStyle: {
  788. color: "#4080FF", // 这里设置为红色
  789. width: 2, // 线条宽度
  790. },
  791. smooth: true, // 可选,是否平滑曲线
  792. areaStyle: {
  793. color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
  794. {
  795. offset: 0,
  796. color: "rgba(128, 166, 255, 1)", // 渐变颜色,可以设置多个不同的颜色
  797. },
  798. {
  799. offset: 1,
  800. color: "rgba(128, 166, 255, 0)", // 渐变颜色
  801. },
  802. ]),
  803. },
  804. },
  805. ],
  806. };
  807. option && myChart.setOption(option);
  808. });
  809. // 统计每日机构数量
  810. let MethodName4 = "/ShopServer/Manager/DataStat/StatDailyOrgCount";
  811. getLogin(MethodName4, data1).then((res) => {
  812. let xAxisData = [];
  813. let yAxisData = [];
  814. if (res.status === 1) {
  815. res.date_list.forEach((item) => {
  816. xAxisData.push(item.date);
  817. yAxisData.push(item.count);
  818. });
  819. }
  820. const chartDom = document.getElementById("echart2");
  821. const myChart = echarts.init(chartDom);
  822. let option = {
  823. title: {
  824. text: "机构总数",
  825. },
  826. tooltip: {
  827. trigger: "axis",
  828. },
  829. grid: {
  830. left: "3%",
  831. right: "4%",
  832. bottom: "3%",
  833. containLabel: true,
  834. },
  835. xAxis: {
  836. type: "category",
  837. boundaryGap: false,
  838. data: xAxisData,
  839. splitLine: {
  840. // 设置 y 轴分割线为虚线
  841. show: true,
  842. lineStyle: {
  843. type: "line",
  844. },
  845. },
  846. },
  847. yAxis: {
  848. type: "value",
  849. splitLine: {
  850. // 设置 y 轴分割线为虚线
  851. show: true,
  852. lineStyle: {
  853. type: "dashed",
  854. },
  855. },
  856. },
  857. series: [
  858. {
  859. type: "line",
  860. data: yAxisData,
  861. lineStyle: {
  862. color: "#00B2FF", // 这里设置为红色
  863. width: 2, // 线条宽度
  864. },
  865. smooth: true, // 可选,是否平滑曲线
  866. areaStyle: {
  867. color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
  868. {
  869. offset: 0,
  870. color: "rgba(3, 186, 226, 1)", // 渐变颜色,可以设置多个不同的颜色
  871. },
  872. {
  873. offset: 1,
  874. color: "rgba(3, 159, 226, 0)", // 渐变颜色
  875. },
  876. ]),
  877. },
  878. },
  879. ],
  880. };
  881. option && myChart.setOption(option);
  882. });
  883. // 统计每日累计上课人数
  884. let MethodName5 =
  885. "/ShopServer/Manager/DataStat/StatDailyAccCoursePlayPersonCount";
  886. getLogin(MethodName5, data1).then((res) => {
  887. let xAxisData = [];
  888. let yAxisData = [];
  889. if (res.status === 1) {
  890. res.date_list.forEach((item) => {
  891. xAxisData.push(item.date);
  892. yAxisData.push(item.count);
  893. });
  894. }
  895. const chartDom = document.getElementById("echart3");
  896. const myChart = echarts.init(chartDom);
  897. let option = {
  898. title: {
  899. text: "累计上课人数",
  900. },
  901. tooltip: {
  902. trigger: "axis",
  903. },
  904. grid: {
  905. left: "3%",
  906. right: "4%",
  907. bottom: "3%",
  908. containLabel: true,
  909. },
  910. xAxis: {
  911. type: "category",
  912. boundaryGap: false,
  913. data: xAxisData,
  914. splitLine: {
  915. // 设置 y 轴分割线为虚线
  916. show: true,
  917. lineStyle: {
  918. type: "line",
  919. },
  920. },
  921. },
  922. yAxis: {
  923. type: "value",
  924. splitLine: {
  925. // 设置 y 轴分割线为虚线
  926. show: true,
  927. lineStyle: {
  928. type: "dashed",
  929. },
  930. },
  931. },
  932. series: [
  933. {
  934. type: "line",
  935. data: yAxisData,
  936. lineStyle: {
  937. color: "#4080FF", // 这里设置为红色
  938. width: 2, // 线条宽度
  939. },
  940. smooth: true, // 可选,是否平滑曲线
  941. areaStyle: {
  942. color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
  943. {
  944. offset: 0,
  945. color: "rgba(128, 166, 255, 1)", // 渐变颜色,可以设置多个不同的颜色
  946. },
  947. {
  948. offset: 1,
  949. color: "rgba(128, 166, 255, 0)", // 渐变颜色
  950. },
  951. ]),
  952. },
  953. },
  954. ],
  955. };
  956. option && myChart.setOption(option);
  957. });
  958. // 统计每日累计阅读时长
  959. let MethodName6 =
  960. "/ShopServer/Manager/DataStat/StatDailyAccArticleReadingDuration";
  961. getLogin(MethodName6, data1).then((res) => {
  962. let xAxisData = [];
  963. let yAxisData = [];
  964. if (res.status === 1) {
  965. res.date_list.forEach((item) => {
  966. xAxisData.push(item.date);
  967. yAxisData.push(item.duration);
  968. });
  969. }
  970. const chartDom = document.getElementById("echart5");
  971. const myChart = echarts.init(chartDom);
  972. let option = {
  973. title: {
  974. text: "平台总阅读时长",
  975. },
  976. tooltip: {
  977. trigger: "axis",
  978. },
  979. grid: {
  980. left: "3%",
  981. right: "4%",
  982. bottom: "3%",
  983. containLabel: true,
  984. },
  985. xAxis: {
  986. type: "category",
  987. boundaryGap: false,
  988. data: xAxisData,
  989. splitLine: {
  990. // 设置 y 轴分割线为虚线
  991. show: true,
  992. lineStyle: {
  993. type: "line",
  994. },
  995. },
  996. },
  997. yAxis: {
  998. type: "value",
  999. splitLine: {
  1000. // 设置 y 轴分割线为虚线
  1001. show: true,
  1002. lineStyle: {
  1003. type: "dashed",
  1004. },
  1005. },
  1006. },
  1007. series: [
  1008. {
  1009. type: "line",
  1010. data: yAxisData,
  1011. lineStyle: {
  1012. color: "#4080FF", // 这里设置为红色
  1013. width: 2, // 线条宽度
  1014. },
  1015. smooth: true, // 可选,是否平滑曲线
  1016. areaStyle: {
  1017. color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
  1018. {
  1019. offset: 0,
  1020. color: "rgba(128, 166, 255, 1)", // 渐变颜色,可以设置多个不同的颜色
  1021. },
  1022. {
  1023. offset: 1,
  1024. color: "rgba(128, 166, 255, 0)", // 渐变颜色
  1025. },
  1026. ]),
  1027. },
  1028. },
  1029. ],
  1030. };
  1031. option && myChart.setOption(option);
  1032. });
  1033. // 统计每日累计阅读词数
  1034. let MethodName7 =
  1035. "/ShopServer/Manager/DataStat/StatDailyAccArticleReadingWordCount";
  1036. getLogin(MethodName7, data1).then((res) => {
  1037. let xAxisData = [];
  1038. let yAxisData = [];
  1039. if (res.status === 1) {
  1040. res.date_list.forEach((item) => {
  1041. xAxisData.push(item.date);
  1042. yAxisData.push(item.count);
  1043. });
  1044. }
  1045. const chartDom = document.getElementById("echart6");
  1046. const myChart = echarts.init(chartDom);
  1047. let option = {
  1048. title: {
  1049. text: "平台总阅读词数",
  1050. },
  1051. tooltip: {
  1052. trigger: "axis",
  1053. },
  1054. grid: {
  1055. left: "3%",
  1056. right: "4%",
  1057. bottom: "3%",
  1058. containLabel: true,
  1059. },
  1060. xAxis: {
  1061. type: "category",
  1062. boundaryGap: false,
  1063. data: xAxisData,
  1064. splitLine: {
  1065. // 设置 y 轴分割线为虚线
  1066. show: true,
  1067. lineStyle: {
  1068. type: "line",
  1069. },
  1070. },
  1071. },
  1072. yAxis: {
  1073. type: "value",
  1074. splitLine: {
  1075. // 设置 y 轴分割线为虚线
  1076. show: true,
  1077. lineStyle: {
  1078. type: "dashed",
  1079. },
  1080. },
  1081. },
  1082. series: [
  1083. {
  1084. type: "line",
  1085. data: yAxisData,
  1086. lineStyle: {
  1087. color: "#00B2FF", // 这里设置为红色
  1088. width: 2, // 线条宽度
  1089. },
  1090. smooth: true, // 可选,是否平滑曲线
  1091. areaStyle: {
  1092. color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
  1093. {
  1094. offset: 0,
  1095. color: "rgba(3, 186, 226, 1)", // 渐变颜色,可以设置多个不同的颜色
  1096. },
  1097. {
  1098. offset: 1,
  1099. color: "rgba(3, 159, 226, 0)", // 渐变颜色
  1100. },
  1101. ]),
  1102. },
  1103. },
  1104. ],
  1105. };
  1106. option && myChart.setOption(option);
  1107. });
  1108. // 统计每日累计上课人次
  1109. let MethodName8 =
  1110. "/ShopServer/Manager/DataStat/StatDailyAccCoursePlayCount";
  1111. getLogin(MethodName8, data1).then((res) => {
  1112. let xAxisData = [];
  1113. let yAxisData = [];
  1114. if (res.status === 1) {
  1115. res.date_list.forEach((item) => {
  1116. xAxisData.push(item.date);
  1117. yAxisData.push(item.count);
  1118. });
  1119. }
  1120. const chartDom = document.getElementById("echart4");
  1121. const myChart = echarts.init(chartDom);
  1122. let option = {
  1123. title: {
  1124. text: "累计上课人次",
  1125. },
  1126. tooltip: {
  1127. trigger: "axis",
  1128. },
  1129. grid: {
  1130. left: "3%",
  1131. right: "4%",
  1132. bottom: "3%",
  1133. containLabel: true,
  1134. },
  1135. xAxis: {
  1136. type: "category",
  1137. boundaryGap: false,
  1138. data: xAxisData,
  1139. splitLine: {
  1140. // 设置 y 轴分割线为虚线
  1141. show: true,
  1142. lineStyle: {
  1143. type: "line",
  1144. },
  1145. },
  1146. },
  1147. yAxis: {
  1148. type: "value",
  1149. splitLine: {
  1150. // 设置 y 轴分割线为虚线
  1151. show: true,
  1152. lineStyle: {
  1153. type: "dashed",
  1154. },
  1155. },
  1156. },
  1157. series: [
  1158. {
  1159. type: "line",
  1160. data: yAxisData,
  1161. lineStyle: {
  1162. color: "#00B2FF", // 这里设置为红色
  1163. width: 2, // 线条宽度
  1164. },
  1165. smooth: true, // 可选,是否平滑曲线
  1166. areaStyle: {
  1167. color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
  1168. {
  1169. offset: 0,
  1170. color: "rgba(3, 186, 226, 1)", // 渐变颜色,可以设置多个不同的颜色
  1171. },
  1172. {
  1173. offset: 1,
  1174. color: "rgba(3, 159, 226, 0)", // 渐变颜色
  1175. },
  1176. ]),
  1177. },
  1178. },
  1179. ],
  1180. };
  1181. option && myChart.setOption(option);
  1182. });
  1183. this.getReadList();
  1184. },
  1185. formatterDuration(row) {
  1186. let studyCn = "";
  1187. if (row.duration) {
  1188. studyCn = formatSeconds(row.duration);
  1189. } else {
  1190. studyCn = "0";
  1191. }
  1192. return studyCn;
  1193. },
  1194. handleSizeChange(val, type, page) {
  1195. this[type] = val;
  1196. this[page] = 1;
  1197. this.getReadList();
  1198. },
  1199. handleCurrentChange(val, type) {
  1200. this[type] = val;
  1201. this.getReadList();
  1202. },
  1203. handleSort(value) {
  1204. let dataSort = {
  1205. prop: value.prop,
  1206. order: value.order,
  1207. };
  1208. this.dataSort = dataSort;
  1209. this.getReadList();
  1210. },
  1211. getReadList() {
  1212. // 阅读数据
  1213. let order_column_list = [];
  1214. if (this.dataSort != {}) {
  1215. if (this.dataSort.order == "descending") {
  1216. order_column_list = [this.dataSort.prop + ":desc"];
  1217. } else if (this.dataSort.order == "ascending") {
  1218. // 升序不传值
  1219. order_column_list = [this.dataSort.prop];
  1220. } else {
  1221. order_column_list = ["create_time:desc"];
  1222. }
  1223. } else {
  1224. order_column_list = ["create_time:desc"];
  1225. }
  1226. let province_id_list = [];
  1227. let city_id_list = [];
  1228. this.selectedOptions.forEach((item) => {
  1229. if (province_id_list.indexOf(item[0]) === -1) {
  1230. province_id_list.push(item[0]);
  1231. }
  1232. city_id_list.push(item[1] ? item[1] : "");
  1233. });
  1234. let MethodName9 =
  1235. "/ShopServer/Manager/LogManager/PageQueryReadingRecord_Article";
  1236. let data2 = {
  1237. reading_date_begin:
  1238. this.dataValue && this.dataValue[0] ? this.dataValue[0] : "",
  1239. reading_date_end:
  1240. this.dataValue && this.dataValue[1] ? this.dataValue[1] : "",
  1241. page_capacity: this.pageSize,
  1242. cur_page: this.pageNumber,
  1243. order_column_list: order_column_list,
  1244. province_id_list: province_id_list,
  1245. city_id_list: city_id_list,
  1246. };
  1247. getLogin(MethodName9, data2).then((res) => {
  1248. if (res.status === 1) {
  1249. this.readInfo = res.sum_info;
  1250. this.total_count_a = res.total_count;
  1251. this.articleList = res.reading_record_list;
  1252. if (res.sum_info.duration < 3600) {
  1253. this.readInfo.durationStr = "<1";
  1254. } else {
  1255. this.readInfo.durationStr = Math.ceil(res.sum_info.duration / 3600);
  1256. }
  1257. }
  1258. });
  1259. },
  1260. // 导出阅读数据
  1261. handleExport() {
  1262. let _this = this;
  1263. _this.exportLoading = true;
  1264. let MethodName =
  1265. "/ShopServer/Manager/FileExport/StartCreateArticleReadingRecordExportFile";
  1266. let order_column_list = [];
  1267. if (this.dataSort != {}) {
  1268. if (this.dataSort.order == "descending") {
  1269. order_column_list = [this.dataSort.prop + ":desc"];
  1270. } else if (this.dataSort.order == "ascending") {
  1271. // 升序不传值
  1272. order_column_list = [this.dataSort.prop];
  1273. } else {
  1274. order_column_list = ["create_time:desc"];
  1275. }
  1276. } else {
  1277. order_column_list = ["create_time:desc"];
  1278. }
  1279. let province_id_list = [];
  1280. let city_id_list = [];
  1281. this.selectedOptions.forEach((item) => {
  1282. if (province_id_list.indexOf(item[0]) === -1) {
  1283. province_id_list.push(item[0]);
  1284. }
  1285. city_id_list.push(item[1] ? item[1] : "");
  1286. });
  1287. let data2 = {
  1288. reading_date_begin:
  1289. this.dataValue && this.dataValue[0] ? this.dataValue[0] : "",
  1290. reading_date_end:
  1291. this.dataValue && this.dataValue[1] ? this.dataValue[1] : "",
  1292. page_capacity: this.pageSize,
  1293. cur_page: this.pageNumber,
  1294. order_column_list: order_column_list,
  1295. province_id_list: province_id_list,
  1296. city_id_list: city_id_list,
  1297. };
  1298. getLogin(MethodName, data2)
  1299. .then((res) => {
  1300. let MethodName2 =
  1301. "/ShopServer/Manager/FileExport/GetArticleReadingRecordExportFileTaskProgress";
  1302. let timer = setTimeout(() => {
  1303. getLogin(MethodName2, {
  1304. export_file_task_id: res.export_file_task_id,
  1305. })
  1306. .then((res) => {
  1307. if (res.is_finish === "true") {
  1308. clearTimeout(timer);
  1309. timer = null;
  1310. _this.exportLoading = false;
  1311. location.href = res.export_file_url;
  1312. }
  1313. })
  1314. .catch((res) => {
  1315. this.loading = false;
  1316. });
  1317. }, 1000);
  1318. })
  1319. .catch((res) => {
  1320. this.loading = false;
  1321. });
  1322. },
  1323. },
  1324. //生命周期 - 创建完成(可以访问当前this实例)
  1325. created() {},
  1326. //生命周期 - 挂载完成(可以访问DOM元素)
  1327. mounted() {
  1328. this.getTableHeight();
  1329. this.getData();
  1330. this.searchStatDaily();
  1331. },
  1332. //生命周期-创建之前
  1333. beforeCreated() {},
  1334. //生命周期-挂载之前
  1335. beforeMount() {},
  1336. //生命周期-更新之前
  1337. beforUpdate() {},
  1338. //生命周期-更新之后
  1339. updated() {},
  1340. //生命周期-销毁之前
  1341. beforeDestory() {},
  1342. //生命周期-销毁完成
  1343. destoryed() {},
  1344. //如果页面有keep-alive缓存功能,这个函数会触发
  1345. activated() {},
  1346. };
  1347. </script>
  1348. <style lang="scss" scoped>
  1349. /* @import url(); 引入css类 */
  1350. .manage-root-contain-right {
  1351. padding-top: 24px;
  1352. overflow: auto;
  1353. }
  1354. .top {
  1355. border-radius: 6px;
  1356. background: #2460ff;
  1357. padding: 20px 24px;
  1358. display: flex;
  1359. justify-content: space-between;
  1360. color: #fff;
  1361. font-weight: 500;
  1362. align-items: center;
  1363. span {
  1364. font-size: 20px;
  1365. line-height: 28px; /* 140% */
  1366. }
  1367. b {
  1368. font-size: 12px;
  1369. line-height: 20px; /* 166.667% */
  1370. }
  1371. }
  1372. .day-stat-data {
  1373. display: flex;
  1374. gap: 16px;
  1375. margin-top: 24px;
  1376. flex-flow: wrap;
  1377. .day-item {
  1378. width: calc(50% - 8px);
  1379. border-radius: 6px;
  1380. background: #fff;
  1381. flex-shrink: 0;
  1382. display: flex;
  1383. justify-content: space-between;
  1384. padding: 16px 40px;
  1385. column-gap: 24px;
  1386. align-items: center;
  1387. p {
  1388. color: #4e5969;
  1389. font-size: 12px;
  1390. font-weight: 400;
  1391. line-height: 20px;
  1392. margin: 0;
  1393. }
  1394. .day-item-left {
  1395. flex: 1;
  1396. p {
  1397. margin-bottom: 8px;
  1398. }
  1399. span {
  1400. color: #1d2129;
  1401. font-size: 22px;
  1402. font-weight: 700;
  1403. line-height: 24px;
  1404. b {
  1405. color: #4e5969;
  1406. font-size: 12px;
  1407. font-weight: 400;
  1408. line-height: 20px;
  1409. margin-left: 4px;
  1410. }
  1411. }
  1412. }
  1413. .day-item-center,
  1414. .day-item-right {
  1415. width: 80px;
  1416. text-align: right;
  1417. img {
  1418. width: 16px;
  1419. height: 16px;
  1420. }
  1421. a {
  1422. font-size: 16px;
  1423. font-weight: 600;
  1424. line-height: 22px;
  1425. }
  1426. span {
  1427. display: flex;
  1428. justify-content: end;
  1429. align-items: center;
  1430. &.up {
  1431. color: #fc4d42;
  1432. }
  1433. &.flat {
  1434. color: #165dff;
  1435. }
  1436. &.down {
  1437. color: #34b531;
  1438. }
  1439. }
  1440. }
  1441. }
  1442. }
  1443. .echart-box {
  1444. border-radius: 4px;
  1445. background: #fff;
  1446. margin-top: 24px;
  1447. padding: 16px;
  1448. .echart-require {
  1449. display: flex;
  1450. align-items: center;
  1451. width: 100%;
  1452. column-gap: 8px;
  1453. }
  1454. .cascader-option {
  1455. width: 206px;
  1456. height: 37px;
  1457. :deep .el-input {
  1458. width: 206px;
  1459. height: 37px !important;
  1460. }
  1461. }
  1462. :deep .el-range-editor.el-input__inner {
  1463. height: 37px;
  1464. }
  1465. :deep .el-date-editor .el-range-separator {
  1466. line-height: 30px;
  1467. }
  1468. }
  1469. .echart-item-box {
  1470. display: flex;
  1471. flex-wrap: wrap;
  1472. gap: 16px;
  1473. padding-top: 16px;
  1474. .echart-item {
  1475. width: calc(50% - 8px);
  1476. height: 420px;
  1477. border-radius: 4px;
  1478. background: #f8f9fb;
  1479. padding: 24px;
  1480. }
  1481. }
  1482. .read-info {
  1483. margin: 20px 0 10px 0;
  1484. display: flex;
  1485. column-gap: 15px;
  1486. flex-flow: wrap;
  1487. align-items: center;
  1488. }
  1489. :deep th.el-table__cell {
  1490. border-bottom: 1px solid #e5e6eb;
  1491. background: #f2f3f5;
  1492. padding: 8px 0px;
  1493. }
  1494. :deep .cell {
  1495. word-break: normal;
  1496. }
  1497. .items-type {
  1498. padding: 1px 8px;
  1499. font-weight: 500;
  1500. font-size: 14px;
  1501. line-height: 22px;
  1502. border-radius: 2px;
  1503. }
  1504. </style>