index.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763
  1. <template>
  2. <view class="body">
  3. <view class="nav row_align_center" id="nav">
  4. <li class="li_7" style="z-index: 999;font-size: 50rpx;" :class="['iconfont icon-zuojiantou back']" @click="gotoBack()">
  5. </li>
  6. </view>
  7. <view class="head">
  8. <view class="title">运动报告</view>
  9. <view class="customer_img">
  10. <!-- <open-data type="userAvatarUrl" class="img"></open-data> -->
  11. <image class="img" src="https://s1.ax1x.com/2022/11/16/zZUoK1.jpg" mode="widthFix"></image>
  12. </view>
  13. </view>
  14. <view class="score_view">
  15. <view class="title">本次评分</view>
  16. <view class="detail">
  17. <view class="socre">98</view>
  18. <li class="li_7" :class="['iconfont icon-up text-green']" @click="gotoBack()"></li>
  19. <view class="up_socre">0.4</view>
  20. </view>
  21. </view>
  22. <view class="census_view">
  23. <view class="left">
  24. <view class="text_gray small_text">消耗(千卡)</view>
  25. <view class="middle_text text_wide_900">165</view>
  26. </view>
  27. <view class="right">
  28. <view class="text_gray small_text">心率主要集中在</view>
  29. <view style="font-size: 30rpx;">燃烧脂肪</view>
  30. </view>
  31. </view>
  32. <view class="census_view">
  33. <view class="left">
  34. <view class="text_gray small_text">时长(分钟)</view>
  35. <view class="middle_text text_wide_900">75</view>
  36. </view>
  37. <view class="center">
  38. <view class="text_gray small_text">累计打卡(天)</view>
  39. <view class="middle_text text_wide_900">24</view>
  40. </view>
  41. <view class="right">
  42. <view class="text_gray small_text">平均心率(次/分钟)</view>
  43. <view class="middle_text text_wide_900">98</view>
  44. </view>
  45. </view>
  46. <view class="consume_view">
  47. <view class="wrap"><span class="consume_tip">身体消耗</span></view>
  48. <li class="li_7" :class="['iconfont icon-niunai consume_icon']"></li>
  49. <view class="desc">
  50. <view class="small_text">约消耗</view>
  51. <view class="text_wide_900"><text class="left">1000</text><text class="right">毫升牛奶</text></view>
  52. </view>
  53. </view>
  54. <view class="heart_rate_view">
  55. <view class="left">
  56. <li class="li_7" :class="['iconfont icon-zhexiantu']"></li>
  57. <text class="title">心率变化曲线</text>
  58. </view>
  59. <view class="right text_gray">心率变化</view>
  60. </view>
  61. <view v-if="heartRateData.series" class="heart_rate_chart">
  62. <view class="charts-box">
  63. <qiun-data-charts type="tline" canvasId="sport_a" :canvas2d="isCanvas2d" :resshow="delayload"
  64. :opts="{ padding: [0, 20, 10, 0], legend: { position: 'top', lineHeight: 20 }, xAxis: { disableGrid: true, format: 'xAxisDemo3' }, yAxis: { data: [{ min: 0, max: 175 }], gridType: 'solid' }, dataLabel: false, dataPointShape: false }"
  65. :chartData="heartRateData" />
  66. </view>
  67. </view>
  68. <view class="title_view">
  69. <view class="left">
  70. <li class="li_7" :class="['iconfont icon-xinlv']"></li>
  71. <text class="title">心率区间</text>
  72. </view>
  73. </view>
  74. <view class="heart_rate_range">
  75. <view class="top">
  76. <view class="item" v-for="(item, index) in heatRateRange" :key="index">
  77. <view class="name text_gray">{{ item.name }}</view>
  78. <view class="data">{{ item.type }}{{ item.data }}<text class="unit text_gray">分钟</text></view>
  79. </view>
  80. </view>
  81. <view v-if="heartRateRangeData" class="charts-box">
  82. <qiun-data-charts type="ring" canvasId="sport_b" :canvas2d="isCanvas2d" :resshow="delayload"
  83. :opts="{ legend: { position: 'bottom' }, extra: { ring: { border: false, centerColor: '#312C34' } }, title: { name: '' }, subtitle: { name: '' } }"
  84. :chartData="heartRateRangeData" />
  85. </view>
  86. </view>
  87. <view class="title_view">
  88. <view class="left">
  89. <li class="li_7" :class="['iconfont icon-pie']"></li>
  90. <text class="title">运动分析</text>
  91. </view>
  92. </view>
  93. <view class="sport_analysis_view">
  94. <view class="top">
  95. <li class="iconfont icon-feiji li_7"></li>
  96. <text class="title font-s-34">跑步机</text>
  97. </view>
  98. <view class="middle">
  99. <view class="left">
  100. <li class="iconfont icon-clock li_7"></li>
  101. <view>3.24P.M</view>
  102. </view>
  103. <view class="right">
  104. <li class="iconfont icon-huo li_7"></li>
  105. <view>热量消耗(千卡)</view>
  106. </view>
  107. </view>
  108. <view class="bottom">
  109. <view class="left">
  110. <li class="iconfont icon-kongxinyuan li_7"></li>
  111. <view>燃烧脂肪</view>
  112. </view>
  113. <view class="right">
  114. <view class="text_wide_600 font-s-40">637</view>
  115. </view>
  116. </view>
  117. </view>
  118. <view class="box_view speed_rank_view">
  119. <view class="top">
  120. <view class="item" v-for="(item, index) in speedRank" :key="index">
  121. <view class="name text_gray">{{ item.name }}</view>
  122. <view class="data">{{ item.data }}<text class="unit text_gray">{{ item.unit }}</text></view>
  123. </view>
  124. </view>
  125. <view v-if="speedRankData" class="charts-box">
  126. <qiun-data-charts type="bar" canvasId="sport_c" :canvas2d="isCanvas2d" :resshow="delayload"
  127. :chartData="speedRankData" background="none"
  128. :opts="{ xAxis: { disabled: true, disableGrid: true }, extra: { bar: { barBorderCircle: true, width: 20 } }, legend: { show: false } }" />
  129. </view>
  130. </view>
  131. <view class="box_view">
  132. <view v-if="speedAndRateData.series" class="charts-box">
  133. <qiun-data-charts type="tline" canvasId="sport_d" :canvas2d="isCanvas2d" :resshow="delayload"
  134. :opts="{ padding: [0, 20, 10, 0], legend: { position: 'top', lineHeight: 20 }, xAxis: { disableGrid: true, format: 'xAxisDemo3' }, yAxis: { data: [{ position: 'left', min: 0, max: 25 }, { position: 'right', min: 50, max: 175 }], gridType: 'solid' }, dataLabel: false, dataPointShape: false }"
  135. :chartData="speedAndRateData" />
  136. </view>
  137. </view>
  138. </view>
  139. </template>
  140. <script>
  141. import heartRateData from "../../static/json/sport/1.json"
  142. import heartRateRangeData from "../../static/json/sport/2.json"
  143. import speedRankData from "../../static/json/sport/3.json"
  144. import speedAndRateData from "../../static/json/sport/4.json"
  145. import Config from '../../static/js/config'
  146. import Common from '../../static/js/common'
  147. export default {
  148. components: {
  149. },
  150. data() {
  151. return {
  152. info: '大便超人', //用户数据
  153. isCanvas2d: Config.ISCANVAS2D,
  154. heartRateData: {},
  155. speedRankData: {},
  156. speedAndRateData: {},
  157. delayload: null,
  158. heartRateRangeData: {},
  159. heatRateRange: [{
  160. name: "激活放松",
  161. data: "5",
  162. type: "≤"
  163. },
  164. {
  165. name: "动态热身",
  166. data: "13",
  167. type: ""
  168. },
  169. {
  170. name: "脂肪燃烧",
  171. data: "24",
  172. type: ""
  173. },
  174. {
  175. name: "糖分消耗",
  176. data: "8",
  177. type: "≤"
  178. },
  179. {
  180. name: "心肺训练",
  181. data: "7",
  182. type: ""
  183. },
  184. {
  185. name: "极限锻炼",
  186. data: "16",
  187. type: ""
  188. },
  189. ],
  190. speedRank: [{
  191. name: "距离",
  192. data: "5",
  193. unit: "公里"
  194. },
  195. {
  196. name: "时长",
  197. data: "12",
  198. unit: "分钟"
  199. },
  200. {
  201. name: "平均配速",
  202. data: "6\'05\"",
  203. unit: ""
  204. }
  205. ]
  206. };
  207. },
  208. watch: {
  209. },
  210. methods: {
  211. async getData() {
  212. uni.showLoading();
  213. /*将钟点时间随机转成某一天的具体时间戳*/
  214. if (typeof heartRateData.series[0].data[0][0] == 'string') {
  215. for (let i = 0; i < heartRateData.series.length; i++) {
  216. heartRateData.series[i].data.map(x => {
  217. x[0] = "2018/08/08 " + x[0];
  218. x[0] = this.tranTimestamp(x[0]);
  219. return x[0];
  220. })
  221. }
  222. }
  223. if (typeof speedAndRateData.series[0].data[0][0] == 'string') {
  224. for (let i = 0; i < speedAndRateData.series.length; i++) {
  225. speedAndRateData.series[i].data.map(x => {
  226. x[0] = "2018/08/08 " + x[0];
  227. x[0] = this.tranTimestamp(x[0]);
  228. return x[0];
  229. })
  230. }
  231. }
  232. this.heartRateData = heartRateData;
  233. this.heartRateRangeData = heartRateRangeData;
  234. this.speedRankData = speedRankData;
  235. this.speedAndRateData = speedAndRateData;
  236. this.delayload = true;
  237. uni.hideLoading();
  238. },
  239. tranTimestamp(date) {
  240. return new Date(date).getTime()
  241. },
  242. gotoBack() {
  243. Common.navigateBack("/index/index");
  244. },
  245. },
  246. onReady() {
  247. //#ifndef H5
  248. uni.showShareMenu();
  249. //#endif
  250. this.getData()
  251. }
  252. }
  253. </script>
  254. <style scoped lang="scss">
  255. .body {
  256. height: 100%;
  257. background-color: #1C191F;
  258. margin: 0;
  259. color: #fff;
  260. padding: 80rpx 20rpx 0 20rpx;
  261. width: 100%;
  262. box-sizing: border-box;
  263. padding-bottom: 50rpx;
  264. .box_view {
  265. width: 100%;
  266. padding: 20rpx;
  267. position: relative;
  268. background-color: #312C34;
  269. color: #FFFFFF;
  270. box-sizing: border-box;
  271. border-radius: 20rpx;
  272. overflow: hidden;
  273. margin-top: 30rpx;
  274. }
  275. .speed_rank_view {
  276. .top {
  277. width: 100%;
  278. &:after {
  279. content: "";
  280. clear: both;
  281. display: block;
  282. }
  283. .item {
  284. float: left;
  285. width: 33%;
  286. box-sizing: border-box;
  287. padding: 30rpx 20rpx;
  288. text-align: left;
  289. .name {
  290. font-size: 26rpx;
  291. }
  292. .data {
  293. font-size: 40rpx;
  294. margin-top: 10rpx;
  295. .unit {
  296. font-size: 24rpx;
  297. margin-left: 14rpx;
  298. }
  299. }
  300. }
  301. }
  302. }
  303. .sport_analysis_view {
  304. width: 100%;
  305. padding: 20rpx;
  306. position: relative;
  307. background-color: #312C34;
  308. color: #FFFFFF;
  309. box-sizing: border-box;
  310. border-radius: 20rpx;
  311. overflow: hidden;
  312. .top {
  313. width: 100%;
  314. height: 120rpx;
  315. display: flex;
  316. align-items: center;
  317. .icon-feiji {
  318. margin-top: 10rpx;
  319. }
  320. .title {
  321. margin-left: 10rpx;
  322. }
  323. }
  324. .middle {
  325. width: 100%;
  326. display: flex;
  327. justify-content: space-between;
  328. font-size: 28rpx;
  329. .iconfont {
  330. font-size: 28rpx;
  331. margin-right: 10rpx;
  332. margin-top: 4rpx;
  333. }
  334. .left {
  335. width: 50%;
  336. height: 60rpx;
  337. display: flex;
  338. align-items: center;
  339. justify-content: flex-start;
  340. }
  341. .right {
  342. width: 50%;
  343. height: 60rpx;
  344. display: flex;
  345. align-items: center;
  346. justify-content: flex-end;
  347. }
  348. }
  349. .bottom {
  350. width: 100%;
  351. display: flex;
  352. justify-content: space-between;
  353. font-size: 28rpx;
  354. .iconfont {
  355. font-size: 28rpx;
  356. margin-right: 10rpx;
  357. margin-top: 4rpx;
  358. }
  359. .left {
  360. width: 50%;
  361. height: 60rpx;
  362. display: flex;
  363. align-items: center;
  364. justify-content: flex-start;
  365. .icon-kongxinyuan {
  366. color: #6FCEF7;
  367. }
  368. }
  369. .right {
  370. width: 50%;
  371. height: 60rpx;
  372. display: flex;
  373. align-items: center;
  374. justify-content: flex-end;
  375. }
  376. }
  377. }
  378. .heart_rate_range {
  379. width: 100%;
  380. position: relative;
  381. background-color: #312C34;
  382. color: #FFFFFF;
  383. box-sizing: border-box;
  384. border-radius: 20rpx;
  385. overflow: hidden;
  386. .top {
  387. width: 100%;
  388. &:after {
  389. content: "";
  390. clear: both;
  391. display: block;
  392. }
  393. .item {
  394. float: left;
  395. width: 33%;
  396. box-sizing: border-box;
  397. padding: 30rpx 20rpx;
  398. text-align: center;
  399. .name {
  400. font-size: 26rpx;
  401. }
  402. .data {
  403. font-size: 40rpx;
  404. margin-top: 10rpx;
  405. .unit {
  406. font-size: 24rpx;
  407. margin-left: 14rpx;
  408. }
  409. }
  410. }
  411. }
  412. }
  413. .heart_rate_chart {
  414. display: flex;
  415. justify-content: center;
  416. width: 100%;
  417. position: relative;
  418. background-color: #312C34;
  419. color: #FFFFFF;
  420. box-sizing: border-box;
  421. border-radius: 20rpx;
  422. overflow: hidden;
  423. }
  424. .title_view {
  425. display: flex;
  426. width: 100%;
  427. align-items: center;
  428. height: 150rpx;
  429. .left {
  430. display: flex;
  431. align-items: center;
  432. .iconfont {
  433. font-size: 40rpx !important;
  434. }
  435. .title {
  436. font-size: 34rpx;
  437. margin-left: 20rpx;
  438. }
  439. }
  440. }
  441. .heart_rate_view {
  442. display: flex;
  443. width: 100%;
  444. justify-content: space-around;
  445. align-items: center;
  446. height: 150rpx;
  447. .left {
  448. display: flex;
  449. align-items: center;
  450. .icon-zhexiantu {
  451. font-size: 26rpx;
  452. }
  453. .title {
  454. font-size: 34rpx;
  455. margin-left: 20rpx;
  456. }
  457. }
  458. .right {
  459. font-size: 22rpx;
  460. padding: 10rpx 30rpx;
  461. border-radius: 40rpx;
  462. background-color: #342E39;
  463. }
  464. }
  465. .consume_view {
  466. display: flex;
  467. justify-content: center;
  468. width: 100%;
  469. height: 190rpx;
  470. position: relative;
  471. margin-top: 100rpx;
  472. background-color: #312C34;
  473. color: #FFFFFF;
  474. box-sizing: border-box;
  475. border-radius: 10rpx;
  476. .consume_img {
  477. width: 240rpx;
  478. height: auto;
  479. position: absolute;
  480. top: -80rpx;
  481. left: 20rpx;
  482. }
  483. .consume_icon {
  484. font-size: 220rpx;
  485. position: absolute;
  486. top: -80rpx;
  487. left: 20rpx;
  488. }
  489. .desc {
  490. position: absolute;
  491. right: 80rpx;
  492. top: 20rpx;
  493. view {
  494. padding: 10rpx 0;
  495. display: flex;
  496. align-items: center;
  497. }
  498. .left {
  499. font-size: 50rpx;
  500. }
  501. .right {
  502. font-size: 30rpx;
  503. margin-left: 10rpx;
  504. font-weight: 400;
  505. }
  506. }
  507. }
  508. .text-green {
  509. color: #10A764;
  510. }
  511. .text_gray {
  512. color: #8E8B8B;
  513. }
  514. .small_text {
  515. font-size: 24rpx;
  516. }
  517. .font-s-34 {
  518. font-size: 34rpx;
  519. }
  520. .font-s-36 {
  521. font-size: 36rpx;
  522. }
  523. .font-s-38 {
  524. font-size: 38rpx;
  525. }
  526. .font-s-40 {
  527. font-size: 40rpx;
  528. }
  529. .middle_text {
  530. font-size: 36rpx;
  531. }
  532. .text_wide_900 {
  533. font-weight: 900;
  534. }
  535. .text_wide_600 {
  536. font-weight: 600;
  537. }
  538. .census_view {
  539. width: 100%;
  540. display: flex;
  541. justify-content: space-around;
  542. .left {
  543. text-align: left;
  544. view {
  545. padding: 10rpx 0;
  546. }
  547. }
  548. .center {
  549. text-align: center;
  550. view {
  551. padding: 10rpx 0;
  552. }
  553. }
  554. .right {
  555. text-align: right;
  556. view {
  557. padding: 10rpx 0;
  558. }
  559. }
  560. }
  561. .score_view {
  562. width: 100%;
  563. .title {
  564. color: #8E8B8B;
  565. font-size: 24rpx;
  566. }
  567. .detail {
  568. height: 120rpx;
  569. width: 100%;
  570. display: flex;
  571. align-items: flex-end;
  572. .icon-up {
  573. margin-left: 40rpx;
  574. height: 54rpx;
  575. font-weight: 600;
  576. }
  577. .socre {
  578. font-size: 80rpx;
  579. font-weight: 900;
  580. }
  581. .up_socre {
  582. color: #10A764;
  583. height: 50rpx;
  584. font-size: 24rpx;
  585. font-weight: 600;
  586. }
  587. }
  588. }
  589. .head {
  590. height: 140rpx;
  591. line-height: 140rpx;
  592. position: relative;
  593. .title {
  594. font-size: 40rpx;
  595. margin-left: 20rpx;
  596. }
  597. .customer_img {
  598. position: absolute;
  599. bottom: 0rpx;
  600. right: 20rpx;
  601. width: 100rpx;
  602. height: 100rpx;
  603. margin: 0;
  604. padding: 0;
  605. background-size: 100% 100%;
  606. border-radius: 100%;
  607. overflow: hidden;
  608. .img {
  609. height: auto;
  610. width: 100%;
  611. }
  612. }
  613. }
  614. .li_7 {
  615. list-style-type: none;
  616. }
  617. .nav {
  618. position: fixed;
  619. top: 50rpx;
  620. left: 20rpx;
  621. }
  622. }
  623. .consume_view:nth-child(even) {
  624. margin-right: 4%;
  625. }
  626. .consume_tip {
  627. display: inline-block;
  628. text-align: center;
  629. width: 188rpx;
  630. height: 30rpx;
  631. line-height: 30rpx;
  632. position: absolute;
  633. top: 36rpx;
  634. right: -44rpx;
  635. z-index: 2;
  636. overflow: hidden;
  637. transform: rotate(45deg);
  638. -ms-transform: rotate(45deg);
  639. -moz-transform: rotate(45deg);
  640. -webkit-transform: rotate(45deg);
  641. -o-transform: rotate(45deg);
  642. border: 1px dashed;
  643. box-shadow: 0 0 0 3px #10A764, 0px 21px 5px -18px rgba(0, 0, 0, 0.6);
  644. background: #10A764;
  645. font-size: 16rpx;
  646. }
  647. .wrap {
  648. width: 100%;
  649. height: 100%;
  650. position: absolute;
  651. top: -12rpx;
  652. left: 12rpx;
  653. overflow: hidden;
  654. }
  655. .wrap:before {
  656. content: "";
  657. display: block;
  658. border-radius: 8px 8px 0px 0px;
  659. width: 80rpx;
  660. height: 14rpx;
  661. position: absolute;
  662. right: 68rpx;
  663. top: -1px;
  664. background: #4D6530;
  665. }
  666. .wrap:after {
  667. content: "";
  668. display: block;
  669. border-radius: 0px 8px 8px 0px;
  670. width: 14rpx;
  671. height: 80rpx;
  672. position: absolute;
  673. right: -1px;
  674. top: 66rpx;
  675. background: #4D6530;
  676. }</style>