new-ruoyi-geek/ruoyi-geek-app/pages_qiun/pages/sport/index.vue

763 lines
15 KiB
Vue
Raw Normal View History

2025-11-15 13:07:57 +00:00
<template>
<view class="body">
<view class="nav row_align_center" id="nav">
<li class="li_7" style="z-index: 999;font-size: 50rpx;" :class="['iconfont icon-zuojiantou back']" @click="gotoBack()">
</li>
</view>
<view class="head">
<view class="title">运动报告</view>
<view class="customer_img">
<!-- <open-data type="userAvatarUrl" class="img"></open-data> -->
<image class="img" src="https://s1.ax1x.com/2022/11/16/zZUoK1.jpg" mode="widthFix"></image>
</view>
</view>
<view class="score_view">
<view class="title">本次评分</view>
<view class="detail">
<view class="socre">98</view>
<li class="li_7" :class="['iconfont icon-up text-green']" @click="gotoBack()"></li>
<view class="up_socre">0.4</view>
</view>
</view>
<view class="census_view">
<view class="left">
<view class="text_gray small_text">消耗(千卡)</view>
<view class="middle_text text_wide_900">165</view>
</view>
<view class="right">
<view class="text_gray small_text">心率主要集中在</view>
<view style="font-size: 30rpx;">燃烧脂肪</view>
</view>
</view>
<view class="census_view">
<view class="left">
<view class="text_gray small_text">时长(分钟)</view>
<view class="middle_text text_wide_900">75</view>
</view>
<view class="center">
<view class="text_gray small_text">累计打卡()</view>
<view class="middle_text text_wide_900">24</view>
</view>
<view class="right">
<view class="text_gray small_text">平均心率(/分钟)</view>
<view class="middle_text text_wide_900">98</view>
</view>
</view>
<view class="consume_view">
<view class="wrap"><span class="consume_tip">身体消耗</span></view>
<li class="li_7" :class="['iconfont icon-niunai consume_icon']"></li>
<view class="desc">
<view class="small_text">约消耗</view>
<view class="text_wide_900"><text class="left">1000</text><text class="right">毫升牛奶</text></view>
</view>
</view>
<view class="heart_rate_view">
<view class="left">
<li class="li_7" :class="['iconfont icon-zhexiantu']"></li>
<text class="title">心率变化曲线</text>
</view>
<view class="right text_gray">心率变化</view>
</view>
<view v-if="heartRateData.series" class="heart_rate_chart">
<view class="charts-box">
<qiun-data-charts type="tline" canvasId="sport_a" :canvas2d="isCanvas2d" :resshow="delayload"
: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 }"
:chartData="heartRateData" />
</view>
</view>
<view class="title_view">
<view class="left">
<li class="li_7" :class="['iconfont icon-xinlv']"></li>
<text class="title">心率区间</text>
</view>
</view>
<view class="heart_rate_range">
<view class="top">
<view class="item" v-for="(item, index) in heatRateRange" :key="index">
<view class="name text_gray">{{ item.name }}</view>
<view class="data">{{ item.type }}{{ item.data }}<text class="unit text_gray">分钟</text></view>
</view>
</view>
<view v-if="heartRateRangeData" class="charts-box">
<qiun-data-charts type="ring" canvasId="sport_b" :canvas2d="isCanvas2d" :resshow="delayload"
:opts="{ legend: { position: 'bottom' }, extra: { ring: { border: false, centerColor: '#312C34' } }, title: { name: '' }, subtitle: { name: '' } }"
:chartData="heartRateRangeData" />
</view>
</view>
<view class="title_view">
<view class="left">
<li class="li_7" :class="['iconfont icon-pie']"></li>
<text class="title">运动分析</text>
</view>
</view>
<view class="sport_analysis_view">
<view class="top">
<li class="iconfont icon-feiji li_7"></li>
<text class="title font-s-34">跑步机</text>
</view>
<view class="middle">
<view class="left">
<li class="iconfont icon-clock li_7"></li>
<view>3.24P.M</view>
</view>
<view class="right">
<li class="iconfont icon-huo li_7"></li>
<view>热量消耗(千卡)</view>
</view>
</view>
<view class="bottom">
<view class="left">
<li class="iconfont icon-kongxinyuan li_7"></li>
<view>燃烧脂肪</view>
</view>
<view class="right">
<view class="text_wide_600 font-s-40">637</view>
</view>
</view>
</view>
<view class="box_view speed_rank_view">
<view class="top">
<view class="item" v-for="(item, index) in speedRank" :key="index">
<view class="name text_gray">{{ item.name }}</view>
<view class="data">{{ item.data }}<text class="unit text_gray">{{ item.unit }}</text></view>
</view>
</view>
<view v-if="speedRankData" class="charts-box">
<qiun-data-charts type="bar" canvasId="sport_c" :canvas2d="isCanvas2d" :resshow="delayload"
:chartData="speedRankData" background="none"
:opts="{ xAxis: { disabled: true, disableGrid: true }, extra: { bar: { barBorderCircle: true, width: 20 } }, legend: { show: false } }" />
</view>
</view>
<view class="box_view">
<view v-if="speedAndRateData.series" class="charts-box">
<qiun-data-charts type="tline" canvasId="sport_d" :canvas2d="isCanvas2d" :resshow="delayload"
: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 }"
:chartData="speedAndRateData" />
</view>
</view>
</view>
</template>
<script>
import heartRateData from "../../static/json/sport/1.json"
import heartRateRangeData from "../../static/json/sport/2.json"
import speedRankData from "../../static/json/sport/3.json"
import speedAndRateData from "../../static/json/sport/4.json"
import Config from '../../static/js/config'
import Common from '../../static/js/common'
export default {
components: {
},
data() {
return {
info: '大便超人', //用户数据
isCanvas2d: Config.ISCANVAS2D,
heartRateData: {},
speedRankData: {},
speedAndRateData: {},
delayload: null,
heartRateRangeData: {},
heatRateRange: [{
name: "激活放松",
data: "5",
type: "≤"
},
{
name: "动态热身",
data: "13",
type: ""
},
{
name: "脂肪燃烧",
data: "24",
type: ""
},
{
name: "糖分消耗",
data: "8",
type: "≤"
},
{
name: "心肺训练",
data: "7",
type: ""
},
{
name: "极限锻炼",
data: "16",
type: ""
},
],
speedRank: [{
name: "距离",
data: "5",
unit: "公里"
},
{
name: "时长",
data: "12",
unit: "分钟"
},
{
name: "平均配速",
data: "6\'05\"",
unit: ""
}
]
};
},
watch: {
},
methods: {
async getData() {
uni.showLoading();
/*将钟点时间随机转成某一天的具体时间戳*/
if (typeof heartRateData.series[0].data[0][0] == 'string') {
for (let i = 0; i < heartRateData.series.length; i++) {
heartRateData.series[i].data.map(x => {
x[0] = "2018/08/08 " + x[0];
x[0] = this.tranTimestamp(x[0]);
return x[0];
})
}
}
if (typeof speedAndRateData.series[0].data[0][0] == 'string') {
for (let i = 0; i < speedAndRateData.series.length; i++) {
speedAndRateData.series[i].data.map(x => {
x[0] = "2018/08/08 " + x[0];
x[0] = this.tranTimestamp(x[0]);
return x[0];
})
}
}
this.heartRateData = heartRateData;
this.heartRateRangeData = heartRateRangeData;
this.speedRankData = speedRankData;
this.speedAndRateData = speedAndRateData;
this.delayload = true;
uni.hideLoading();
},
tranTimestamp(date) {
return new Date(date).getTime()
},
gotoBack() {
Common.navigateBack("/index/index");
},
},
onReady() {
//#ifndef H5
uni.showShareMenu();
//#endif
this.getData()
}
}
</script>
<style scoped lang="scss">
.body {
height: 100%;
background-color: #1C191F;
margin: 0;
color: #fff;
padding: 80rpx 20rpx 0 20rpx;
width: 100%;
box-sizing: border-box;
padding-bottom: 50rpx;
.box_view {
width: 100%;
padding: 20rpx;
position: relative;
background-color: #312C34;
color: #FFFFFF;
box-sizing: border-box;
border-radius: 20rpx;
overflow: hidden;
margin-top: 30rpx;
}
.speed_rank_view {
.top {
width: 100%;
&:after {
content: "";
clear: both;
display: block;
}
.item {
float: left;
width: 33%;
box-sizing: border-box;
padding: 30rpx 20rpx;
text-align: left;
.name {
font-size: 26rpx;
}
.data {
font-size: 40rpx;
margin-top: 10rpx;
.unit {
font-size: 24rpx;
margin-left: 14rpx;
}
}
}
}
}
.sport_analysis_view {
width: 100%;
padding: 20rpx;
position: relative;
background-color: #312C34;
color: #FFFFFF;
box-sizing: border-box;
border-radius: 20rpx;
overflow: hidden;
.top {
width: 100%;
height: 120rpx;
display: flex;
align-items: center;
.icon-feiji {
margin-top: 10rpx;
}
.title {
margin-left: 10rpx;
}
}
.middle {
width: 100%;
display: flex;
justify-content: space-between;
font-size: 28rpx;
.iconfont {
font-size: 28rpx;
margin-right: 10rpx;
margin-top: 4rpx;
}
.left {
width: 50%;
height: 60rpx;
display: flex;
align-items: center;
justify-content: flex-start;
}
.right {
width: 50%;
height: 60rpx;
display: flex;
align-items: center;
justify-content: flex-end;
}
}
.bottom {
width: 100%;
display: flex;
justify-content: space-between;
font-size: 28rpx;
.iconfont {
font-size: 28rpx;
margin-right: 10rpx;
margin-top: 4rpx;
}
.left {
width: 50%;
height: 60rpx;
display: flex;
align-items: center;
justify-content: flex-start;
.icon-kongxinyuan {
color: #6FCEF7;
}
}
.right {
width: 50%;
height: 60rpx;
display: flex;
align-items: center;
justify-content: flex-end;
}
}
}
.heart_rate_range {
width: 100%;
position: relative;
background-color: #312C34;
color: #FFFFFF;
box-sizing: border-box;
border-radius: 20rpx;
overflow: hidden;
.top {
width: 100%;
&:after {
content: "";
clear: both;
display: block;
}
.item {
float: left;
width: 33%;
box-sizing: border-box;
padding: 30rpx 20rpx;
text-align: center;
.name {
font-size: 26rpx;
}
.data {
font-size: 40rpx;
margin-top: 10rpx;
.unit {
font-size: 24rpx;
margin-left: 14rpx;
}
}
}
}
}
.heart_rate_chart {
display: flex;
justify-content: center;
width: 100%;
position: relative;
background-color: #312C34;
color: #FFFFFF;
box-sizing: border-box;
border-radius: 20rpx;
overflow: hidden;
}
.title_view {
display: flex;
width: 100%;
align-items: center;
height: 150rpx;
.left {
display: flex;
align-items: center;
.iconfont {
font-size: 40rpx !important;
}
.title {
font-size: 34rpx;
margin-left: 20rpx;
}
}
}
.heart_rate_view {
display: flex;
width: 100%;
justify-content: space-around;
align-items: center;
height: 150rpx;
.left {
display: flex;
align-items: center;
.icon-zhexiantu {
font-size: 26rpx;
}
.title {
font-size: 34rpx;
margin-left: 20rpx;
}
}
.right {
font-size: 22rpx;
padding: 10rpx 30rpx;
border-radius: 40rpx;
background-color: #342E39;
}
}
.consume_view {
display: flex;
justify-content: center;
width: 100%;
height: 190rpx;
position: relative;
margin-top: 100rpx;
background-color: #312C34;
color: #FFFFFF;
box-sizing: border-box;
border-radius: 10rpx;
.consume_img {
width: 240rpx;
height: auto;
position: absolute;
top: -80rpx;
left: 20rpx;
}
.consume_icon {
font-size: 220rpx;
position: absolute;
top: -80rpx;
left: 20rpx;
}
.desc {
position: absolute;
right: 80rpx;
top: 20rpx;
view {
padding: 10rpx 0;
display: flex;
align-items: center;
}
.left {
font-size: 50rpx;
}
.right {
font-size: 30rpx;
margin-left: 10rpx;
font-weight: 400;
}
}
}
.text-green {
color: #10A764;
}
.text_gray {
color: #8E8B8B;
}
.small_text {
font-size: 24rpx;
}
.font-s-34 {
font-size: 34rpx;
}
.font-s-36 {
font-size: 36rpx;
}
.font-s-38 {
font-size: 38rpx;
}
.font-s-40 {
font-size: 40rpx;
}
.middle_text {
font-size: 36rpx;
}
.text_wide_900 {
font-weight: 900;
}
.text_wide_600 {
font-weight: 600;
}
.census_view {
width: 100%;
display: flex;
justify-content: space-around;
.left {
text-align: left;
view {
padding: 10rpx 0;
}
}
.center {
text-align: center;
view {
padding: 10rpx 0;
}
}
.right {
text-align: right;
view {
padding: 10rpx 0;
}
}
}
.score_view {
width: 100%;
.title {
color: #8E8B8B;
font-size: 24rpx;
}
.detail {
height: 120rpx;
width: 100%;
display: flex;
align-items: flex-end;
.icon-up {
margin-left: 40rpx;
height: 54rpx;
font-weight: 600;
}
.socre {
font-size: 80rpx;
font-weight: 900;
}
.up_socre {
color: #10A764;
height: 50rpx;
font-size: 24rpx;
font-weight: 600;
}
}
}
.head {
height: 140rpx;
line-height: 140rpx;
position: relative;
.title {
font-size: 40rpx;
margin-left: 20rpx;
}
.customer_img {
position: absolute;
bottom: 0rpx;
right: 20rpx;
width: 100rpx;
height: 100rpx;
margin: 0;
padding: 0;
background-size: 100% 100%;
border-radius: 100%;
overflow: hidden;
.img {
height: auto;
width: 100%;
}
}
}
.li_7 {
list-style-type: none;
}
.nav {
position: fixed;
top: 50rpx;
left: 20rpx;
}
}
.consume_view:nth-child(even) {
margin-right: 4%;
}
.consume_tip {
display: inline-block;
text-align: center;
width: 188rpx;
height: 30rpx;
line-height: 30rpx;
position: absolute;
top: 36rpx;
right: -44rpx;
z-index: 2;
overflow: hidden;
transform: rotate(45deg);
-ms-transform: rotate(45deg);
-moz-transform: rotate(45deg);
-webkit-transform: rotate(45deg);
-o-transform: rotate(45deg);
border: 1px dashed;
box-shadow: 0 0 0 3px #10A764, 0px 21px 5px -18px rgba(0, 0, 0, 0.6);
background: #10A764;
font-size: 16rpx;
}
.wrap {
width: 100%;
height: 100%;
position: absolute;
top: -12rpx;
left: 12rpx;
overflow: hidden;
}
.wrap:before {
content: "";
display: block;
border-radius: 8px 8px 0px 0px;
width: 80rpx;
height: 14rpx;
position: absolute;
right: 68rpx;
top: -1px;
background: #4D6530;
}
.wrap:after {
content: "";
display: block;
border-radius: 0px 8px 8px 0px;
width: 14rpx;
height: 80rpx;
position: absolute;
right: -1px;
top: 66rpx;
background: #4D6530;
}</style>