Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
S
sport-train
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
tangjiale
sport-train
Commits
1b60b956
Commit
1b60b956
authored
Jun 07, 2022
by
tangjiale
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
区分 横屏运动,因为小程序不能动态改横竖屏配置
parent
2190ab02
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
1786 additions
and
11 deletions
+1786
-11
app.json
app.json
+7
-3
ai-fwc-sport.js
subPages/sport/ai-fwc-sport/ai-fwc-sport.js
+434
-0
ai-fwc-sport.json
subPages/sport/ai-fwc-sport/ai-fwc-sport.json
+6
-0
ai-fwc-sport.wxml
subPages/sport/ai-fwc-sport/ai-fwc-sport.wxml
+43
-0
ai-fwc-sport.wxss
subPages/sport/ai-fwc-sport/ai-fwc-sport.wxss
+399
-0
ai-sport.js
subPages/sport/ai-sport/ai-sport.js
+0
-2
ai-sport.json
subPages/sport/ai-sport/ai-sport.json
+2
-2
ai-ywqz-sport.js
subPages/sport/ai-ywqz-sport/ai-ywqz-sport.js
+434
-0
ai-ywqz-sport.json
subPages/sport/ai-ywqz-sport/ai-ywqz-sport.json
+6
-0
ai-ywqz-sport.wxml
subPages/sport/ai-ywqz-sport/ai-ywqz-sport.wxml
+43
-0
ai-ywqz-sport.wxss
subPages/sport/ai-ywqz-sport/ai-ywqz-sport.wxss
+399
-0
detail.js
subPages/sport/detail/detail.js
+13
-4
No files found.
app.json
View file @
1b60b956
...
...
@@ -10,14 +10,18 @@
"root"
:
"subPages/organ"
,
"name"
:
"organ"
,
"pages"
:
[]
},{
},
{
"root"
:
"subPages/sport"
,
"name"
:
"sport"
,
"pages"
:
[
"detail/detail"
,
"ai-sport/ai-sport"
"ai-sport/ai-sport"
,
"ai-ywqz-sport/ai-ywqz-sport"
,
"ai-fwc-sport/ai-fwc-sport"
]
},{
},
{
"root"
:
"subPages/login"
,
"name"
:
"login"
,
"pages"
:
[
...
...
subPages/sport/ai-fwc-sport/ai-fwc-sport.js
0 → 100644
View file @
1b60b956
var
app
=
getApp
()
var
poseDetection
=
require
(
'@tensorflow-models/pose-detection'
);
var
flagTimer
=
null
;
var
time
=
0
;
var
iosNum
=
0
;
//ios不能重复播放同一地址音频,后加一位数,加时间戳不行
Page
({
mixins
:
[
require
(
'../ai-mixins/ai-fwc-mixins.js'
)],
data
:
{
fps
:
20
,
//控制频率
//当前状态 0 提示 1 识别中 2 识别成功,读秒 3 进行中
// 4 成绩提交失败 5 等待成绩上传 6 开始前播报
aiState
:
6
,
downTime
:
5
,
//开始倒计时
downTimeStg
:
'00:00'
,
uuid
:
''
,
//唯一标识
prepare
:
''
,
aiCount
:
0
,
//当前个数
waitTimer
:
''
,
//等待结果定时器
beforeTimer
:
''
,
//开始前定时器
startTimer
:
''
,
//进行中定时器
startTips
:
''
,
//开始前语音 提醒
phoneType
:
''
,
//ios android
showCamera
:
true
,
cameraFront
:
true
,
//镜头是否前置
src
:
''
,
//实时播报的路径
videoSrc
:
''
,
fileCosFilePath
:
''
,
//截取视频
needUploadFilePath
:
''
,
levelfontsize
:
''
,
sportTime
:
60
,
//运动时长
},
onLoad
:
function
(
options
)
{
var
that
=
this
;
iosNum
=
0
;
time
=
0
;
//运动时长(秒)
if
(
options
.
sportTime
){
// 30/60/120/180
this
.
setData
({
sportTime
:
options
.
sportTime
})
}
// 音频/语音交互相关
this
.
ctx
=
wx
.
createCanvasContext
(
'myCanvas'
);
that
.
ctxs
=
wx
.
createCameraContext
();
this
.
setData
({
innerAudioContext
:
wx
.
createInnerAudioContext
(),
//本地音乐组件
innerAudioContext2
:
wx
.
createInnerAudioContext
()
//倒计时播音组件
},()
=>
{
that
.
data
.
innerAudioContext
.
obeyMuteSwitch
=
false
;
that
.
data
.
innerAudioContext2
.
obeyMuteSwitch
=
false
;
that
.
loadMoveNet
();
})
//初始化设备
this
.
initDevice
()
},
onUnload
(){
var
that
=
this
;
that
.
data
.
innerAudioContext
.
destroy
();
that
.
data
.
innerAudioContext2
.
destroy
();
clearInterval
(
flagTimer
);
clearTimeout
(
that
.
data
.
prepare
);
clearTimeout
(
that
.
data
.
waitTimer
);
clearInterval
(
that
.
data
.
beforeTimer
);
clearTimeout
(
that
.
data
.
startTimer
);
},
loadMoveNet
(){
var
that
=
this
;
if
(
app
.
globalData
.
movenet
){
that
.
data
.
startTips
=
setTimeout
(
function
()
{
//开始识别
that
.
setData
({
aiState
:
1
},()
=>
{
console
.
log
(
'开始识别运动姿势'
)
})
},
that
.
data
.
sportTime
*
100
+
500
)
that
.
canvasInit
();
that
.
cameraFrame
();
}
else
{
wx
.
showLoading
({
mask
:
true
,
title
:
'初始化中...'
,
})
var
modelUrl
=
wx
.
getStorageSync
(
'aiModelUrl'
),
detectorConfig
=
{
modelType
:
poseDetection
.
movenet
.
modelType
.
SINGLEPOSE_LIGHTNING
,
modelUrl
:
modelUrl
};
poseDetection
.
createDetector
(
poseDetection
.
SupportedModels
.
MoveNet
,
detectorConfig
).
then
(
function
(
detector
)
{
wx
.
hideLoading
();
that
.
palyLocal
(
'/images/ai/clues.mp3'
);
that
.
data
.
startTips
=
setTimeout
(
function
()
{
//开始识别
that
.
setData
({
aiState
:
1
},()
=>
{
console
.
log
(
'开始识别运动姿势'
)
})
},
that
.
data
.
sportTime
*
100
+
500
)
app
.
globalData
.
movenet
=
detector
;
that
.
canvasInit
();
that
.
cameraFrame
();
}).
catch
(
function
(
err
)
{
console
.
log
(
err
)
wx
.
showToast
({
icon
:
'error'
,
title
:
'初始化失败'
,
success
:
function
(){
wx
.
navigateBack
({
delta
:
1
})
},
})
})
}
},
canvasInit
()
{
// 获取canvas
var
that
=
this
wx
.
createSelectorQuery
().
select
(
'#myCanvas'
)
.
fields
({
node
:
true
,
size
:
true
})
.
exec
(
function
(
res
)
{
var
canvas
=
res
[
0
].
node
var
ctx
=
canvas
.
getContext
(
'2d'
)
var
dpr
=
wx
.
getSystemInfoSync
().
pixelRatio
canvas
.
width
=
480
*
dpr
canvas
.
height
=
640
*
dpr
ctx
.
scale
(
dpr
,
dpr
)
that
.
ctx
=
ctx
that
.
canvas
=
canvas
that
.
res0
=
res
[
0
]
})
},
cameraFrame
()
{
// 视频流
var
that
=
this
,
store
=
[],
startTime
=
new
Date
(),
camera
=
wx
.
createCameraContext
()
that
.
listener
=
camera
.
onCameraFrame
(
function
(
frame
)
{
//console.log(app.globalData.movenet)
if
(
frame
&&
app
.
globalData
.
movenet
)
{
//帧率控制
store
.
push
(
frame
)
}
})
console
.
log
(
'识别'
)
that
.
listener
.
start
({
success
:
function
()
{
console
.
log
(
'当前的识别频率'
,
that
.
data
.
fps
)
//flagTimer && clearInterval(flagTimer)
flagTimer
=
setInterval
(
function
()
{
//帧率控制
if
(
store
.
length
==
0
)
return
;
var
object
=
{
data
:
new
Uint8Array
(
store
[
store
.
length
-
1
].
data
),
height
:
Number
(
store
[
store
.
length
-
1
].
height
),
width
:
Number
(
store
[
store
.
length
-
1
].
width
)
}
that
.
actionSend
(
object
,
app
)
store
=
[]
that
.
setData
({
resultFps
:
that
.
data
.
resultFps
+
1
,
fpstime
:
parseInt
((
that
.
data
.
resultFps
+
1
)
*
1000
/
(
new
Date
().
getTime
()
-
startTime
))
})
},
1000
/
that
.
data
.
fps
)
},
})
},
//播放本地音乐组件
palyLocal
(
url
)
{
var
that
=
this
;
this
.
data
.
innerAudioContext
.
autoplay
=
true
;
this
.
data
.
innerAudioContext
.
volume
=
1
;
if
(
that
.
data
.
phoneType
==
'ios'
){
this
.
data
.
innerAudioContext
.
src
=
url
+
'?'
+
Date
.
now
();
}
else
{
this
.
data
.
innerAudioContext
.
src
=
url
;
}
this
.
data
.
innerAudioContext
.
onPlay
(()
=>
{
console
.
log
(
'开始播放'
)
})
this
.
data
.
innerAudioContext
.
onEnded
(()
=>
{
console
.
log
(
'播放结束'
)
//this.data.innerAudioContext.destroy()
})
},
//播放本地音乐组件
//播放本地音乐组件
palyLocal2
(
url
)
{
var
that
=
this
;
that
.
data
.
innerAudioContext2
.
autoplay
=
true
;
that
.
data
.
innerAudioContext2
.
volume
=
0.4
;
that
.
data
.
innerAudioContext2
.
src
=
url
;
that
.
data
.
innerAudioContext2
.
onPlay
(()
=>
{
console
.
log
(
'开始播放22222222'
)
})
that
.
data
.
innerAudioContext2
.
onEnded
(()
=>
{
console
.
log
(
'播放结束222222'
)
iosNum
=
iosNum
+
1
;
setTimeout
(
function
(){
that
.
palyLocal2
(
'https://cdn.xiaobentiyu.cn/mp3/2-LoopMelody(BPM130).mp3?a='
+
iosNum
);
},
200
)
})
that
.
data
.
innerAudioContext2
.
onError
((
err
)
=>
{
console
.
log
(
'err'
,
err
)
})
},
//执行开始
start
(){
var
that
=
this
;
var
downTime
=
this
.
data
.
downTime
;
that
.
palyLocal
(
'/packageC/images/skip.mp3'
);
that
.
data
.
prepare
=
setTimeout
(()
=>
{
that
.
setData
({
aiState
:
2
})
that
.
palyLocal
(
'/images/ai/N5.mp3'
);
that
.
data
.
beforeTimer
=
setInterval
(()
=>
{
downTime
=
downTime
-
1
;
this
.
setData
({
downTime
:
downTime
});
if
(
downTime
===
4
){
that
.
palyLocal
(
'/images/ai/N4.mp3'
);
}
else
if
(
downTime
===
3
){
that
.
palyLocal
(
'/images/ai/N3.mp3'
);
}
else
if
(
downTime
===
2
){
that
.
palyLocal
(
'/images/ai/N2.mp3'
);
}
else
if
(
downTime
===
1
){
that
.
palyLocal
(
'/images/ai/N1.mp3'
);
}
else
if
(
downTime
===
0
)
{
clearInterval
(
that
.
data
.
beforeTimer
);
that
.
setData
({
downTime
:
'开始'
});
that
.
palyLocal
(
'/images/ai/V_START.mp3'
)
setTimeout
(
function
()
{
that
.
setData
({
aiState
:
3
})
that
.
startTime
();
},
1000
);
}
},
1000
);
},
1200
)
},
//开始运动
startTime
(){
//console.log('开始运动1111111',time)
var
that
=
this
;
//time = that.data.time;
time
=
time
+
1
;
var
downTimeStg
=
that
.
formatSeconds
(
time
);
that
.
setData
({
downTimeStg
:
downTimeStg
},()
=>
{
that
.
palyLocal2
(
'https://cdn.xiaobentiyu.cn/mp3/2-LoopMelody(BPM130).mp3'
);
})
if
(
time
==
1
){
//console.log('开始1')
}
if
(
time
==
that
.
data
.
sportTime
-
5
){
that
.
palyLocal
(
'/images/ai/N5.mp3'
);
}
if
(
time
==
that
.
data
.
sportTime
-
4
){
that
.
palyLocal
(
'/images/ai/N4.mp3'
);
}
if
(
time
==
that
.
data
.
sportTime
-
3
){
that
.
palyLocal
(
'/images/ai/N3.mp3'
);
}
if
(
time
==
that
.
data
.
sportTime
-
2
){
that
.
palyLocal
(
'/images/ai/N2.mp3'
);
}
if
(
time
==
that
.
data
.
sportTime
-
1
){
that
.
palyLocal
(
'/images/ai/N1.mp3'
);
}
if
(
time
==
10
){
//console.log('开始2')
}
if
((
that
.
data
.
sportTime
==
30
&&
time
==
8
)
||
(
that
.
data
.
sportTime
!=
30
&&
time
==
20
)){
// that.startRecord();
}
if
((
that
.
data
.
sportTime
==
30
&&
time
==
18
)
||
(
that
.
data
.
sportTime
!=
30
&&
time
==
32
)){
}
// 时间已过半语音 暂时只支持60秒模式
if
(
that
.
data
.
sportTime
==
60
&&
time
==
30
){
console
.
log
(
'开始4'
)
that
.
palyLocal
(
'/images/ai/30.mp3'
);
}
if
(
time
==
40
){
//console.log('开始5')
}
if
(
that
.
data
.
sportTime
==
60
&&
time
==
50
){
//console.log('开始6')
that
.
palyLocal
(
'/images/ai/50.mp3'
);
}
if
(
time
==
that
.
data
.
sportTime
){
that
.
palyLocal
(
'/images/ai/stop.mp3'
);
console
.
log
(
'销毁定时器'
)
wx
.
showLoading
({
title
:
'统计中...'
,
})
that
.
data
.
innerAudioContext2
.
destroy
();
that
.
data
.
waitTimer
=
setTimeout
(
function
(){
wx
.
hideLoading
();
that
.
setData
({
aiState
:
5
},()
=>
{
that
.
save
();
})
},
1500
)
}
that
.
data
.
startTimer
=
setTimeout
(
function
()
{
if
(
time
<
that
.
data
.
sportTime
){
that
.
startTime
();
}
},
1000
)
},
//秒转换格式mm:ss
formatSeconds
(
value
)
{
let
result
=
parseInt
(
value
)
let
h
=
Math
.
floor
(
result
/
3600
)
<
10
?
Math
.
floor
(
result
/
3600
)
:
Math
.
floor
(
result
/
3600
);
let
m
=
Math
.
floor
((
result
/
60
%
60
))
<
10
?
'0'
+
Math
.
floor
((
result
/
60
%
60
))
:
Math
.
floor
((
result
/
60
%
60
));
let
s
=
Math
.
floor
((
result
%
60
))
<
10
?
'0'
+
Math
.
floor
((
result
%
60
))
:
Math
.
floor
((
result
%
60
));
var
time
=
m
+
":"
+
s
return
time
;
},
//错误知道了
errknow
(){
wx
.
navigateBack
({
changed
:
true
});
},
//切换摄像头
switch
(){
this
.
setData
({
cameraFront
:
!
this
.
data
.
cameraFront
})
},
//退出页面
exit
(){
var
that
=
this
;
wx
.
showModal
({
title
:
'提示'
,
content
:
'已开启AI运动模式,确定退出模式?'
,
cancelText
:
"继续训练"
,
//默认是“取消”
confirmText
:
"退出模式"
,
//默认是“确定”
success
:
function
(
res
)
{
if
(
res
.
confirm
)
{
console
.
log
(
'用户点击确定'
)
clearTimeout
(
that
.
data
.
waitTimer
);
clearInterval
(
that
.
data
.
beforeTimer
);
clearTimeout
(
that
.
data
.
startTimer
);
wx
.
navigateBack
({
changed
:
true
});
}
else
{
//这里是点击了取消以后
console
.
log
(
'用户点击取消'
)
}
}
})
},
initDevice
(){
let
that
=
this
wx
.
getSystemInfo
({
success
:
function
(
res
)
{
console
.
log
(
'当前的系统'
,
res
)
if
(
res
.
platform
==
"devtools"
)
{
that
.
setData
({
phoneType
:
'ios'
})
}
else
if
(
res
.
platform
==
"ios"
)
{
that
.
setData
({
phoneType
:
'ios'
})
}
else
if
(
res
.
platform
==
"android"
)
{
that
.
setData
({
phoneType
:
'android'
})
}
}
})
wx
.
getSetting
({
success
(
res
)
{
if
(
!
res
.
authSetting
[
'scope.camera'
]){
wx
.
showModal
({
title
:
'提示'
,
content
:
'请点击右上角设置授权摄像头'
,
showCancel
:
false
,
//是否显示取消按钮
confirmText
:
"知道了"
,
//默认是“确定”
success
:
function
(
res
)
{
if
(
res
.
cancel
)
{
//点击取消,默认隐藏弹框
}
else
{
wx
.
navigateBack
({
delta
:
1
})
}
}
})
}
else
{
console
.
log
(
'正常授权'
)
}
}
})
wx
.
openSetting
({
success
(
res
)
{
if
(
res
.
authSetting
[
'scope.camera'
]){
that
.
setData
({
showCamera
:
true
})
}
}
})
}
})
\ No newline at end of file
subPages/sport/ai-fwc-sport/ai-fwc-sport.json
0 → 100644
View file @
1b60b956
{
"usingComponents"
:
{},
"navigationStyle"
:
"custom"
,
"pageOrientation"
:
"landscape"
}
\ No newline at end of file
subPages/sport/ai-fwc-sport/ai-fwc-sport.wxml
0 → 100644
View file @
1b60b956
<camera device-position="{{!cameraFront?'back':'front'}}" flash="off" binderror="error" frame-size="medium" class="camera" id="camera">
<canvas type="2d" id="myCanvas" class="canvas"></canvas>
</camera>
<view wx:if="{{aiState == 1 || aiState == 6}}">
<image class="help-img" src="https://cdn.xiaobentiyu.cn/sport_minapp_img/sitUp/jumping-jacks.png"></image>
<view class="help">
<view class="title">互动小提示</view>
<view class="content">手机竖屏固定放置,调整屏幕角度,训练者全身及双脚出现至屏幕内,识别更精准。</view>
</view>
</view>
<!-- 识别成功,读秒 -->
<view class="countdown" wx:if="{{aiState == 2}}">
<view class="second">{{downTime}}</view>
</view>
<!-- 进行中 -->
<view wx:if="{{aiState == 3}}">
<view class="time">{{downTimeStg}}</view>
<view class="number" style="{{levelfontsize}}">{{aiCount}}</view>
</view>
<!-- 成绩提交失败 -->
<view class="tips" wx:if="{{aiState == 4}}">
<view class="tips-type error-type">
抱歉,由于角度、光线等客观环境影响,AI识别失败!结束训练/重新开始训练
</view>
<view class="handle">
<!-- <view class="no-tips">不再提示</view> -->
<view class="know" bindtap="errknow">知道了</view>
</view>
</view>
<!-- 识别中 -->
<view class="switch" bindtap="switch" wx:if="{{aiState == 1}}">
<image src="https://cdn.xiaobentiyu.cn/sport_minapp_img/sitUp/icon-flip.png"></image>
<view class="text">{{cameraFront?'切换家长拍模式':'切换自拍模式'}}</view>
</view>
<view class="exit" bindtap="exit">
<image src="https://cdn.xiaobentiyu.cn/sport_minapp_img/sitUp/icon-exit.png"></image>
<view class="text">退出</view>
</view>
<audio src="{{src}}" id="myAudio" ></audio>
subPages/sport/ai-fwc-sport/ai-fwc-sport.wxss
0 → 100644
View file @
1b60b956
@font-face {
font-family: 'Number';
src: url('data:application/font-woff2;charset=utf-8;base64,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') format('woff2');
}
page{
background: #D1D1D1;
}
.canvas {
position: absolute;
width: 100%;
height: 100%;
z-index: 100;
}
/* 自定义导航条样式 */
.nav{
width: 100%;
overflow: hidden;
position: relative;
top: 0;
left: 0;
z-index: 10;
}
.nav-title{
width: 100%;
height: 90rpx;
line-height: 90rpx;
text-align: center;
position: absolute;
bottom: 0;
left: 0;
z-index: 10;
font-size:26rpx;
color: #FFFFFF;
}
.nav .back{
width: 44rpx;
height: 44rpx;
position: absolute;
bottom: 0;
left: 0;
padding: 24rpx 30rpx;
}
.bg-white{
background-color: transparent;
}
.bg-gray{
background-color: #f7f7f7;
}
.overflow{
overflow: auto;
}
.hidden{
overflow: hidden;
}
.user-info image{
width: 64rpx;
height: 64rpx;
}
.tips{
position:absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 80%;
padding-bottom: 50rpx;
text-align: justify;
/* height: 242px; */
background: #FFFFFF;
box-shadow: 0px 2px 20px rgba(0, 0, 0, 0.08);
border-radius: 12px;
padding:15px;
z-index: 99;
}
.errors{
height: 110px;
}
.error-type{
width: 90%;
margin: 0 auto;
margin-top: 10px;
}
.tips-type{
overflow: hidden;
}
.correct{
float: left;
width: 154px;
height: 140px;
margin-right: 1px;
}
.correct .img{
width: 100%;
height: 100px;
background: #F8F8F8;
}
.correct .img image{
width: 100%;
height: 100px;
background: #F8F8F8;
}
.error .img image{
width: 100%;
height: 100px;
background: #F8F8F8;
}
.correct .text{
font-size: 12px;
color: #353535;
text-align: center;
line-height: 40px;
}
.no-tips{
float: left;
font-size: 14px;
color: #888888;
padding-top: 10px;
padding-left: 20px;
}
.know{
float: left;
width: 320rpx;
height: 40px;
line-height: 40px;
color: #FFFFFF;
border-radius: 22px;
text-align: center;
background: #FF9B4D;
margin-left: 160rpx;
font-size: 17px;
font-weight: bold;
margin-top: 14px;
}
.error{
float: left;
width: 100px;
height: 140px;
margin-right: 1px;
}
.error .img{
width: 100%;
height: 100px;
background: #F8F8F8;
}
.error .text{
font-size: 12px;
color: #353535;
text-align: center;
line-height: 40px;
}
.handle{
width: 100%;
height: 40px;
}
.switch{
position: absolute;
height: 44px;
padding-right: 10px;
line-height: 44px;
background: #000000;
opacity: 0.74;
border-radius: 12px;
left: 20px;
bottom: 15px;
color: #FFFFFF;
z-index: 99;
}
.switch .text{
padding-left: 40px;
}
.switch image{
position: absolute;
top: 10px;
left: 6px;
width: 32px;
height: 26px;
}
.exit{
position: absolute;
height: 44px;
padding-right: 10px;
line-height: 44px;
background: #000000;
opacity: 0.74;
border-radius: 12px;
right: 20px;
bottom: 15px;
color: #FFFFFF;
z-index: 99;
}
.exit .text{
padding-left: 40px;
}
.exit image{
position: absolute;
top: 8px;
left: 6px;
width: 32px;
height: 26px;
}
.help{
position: absolute;
left: 20px;
width: 192px;
background: #000000;
opacity: 0.74;
border-radius: 12px;
color: #FFFFFF;
text-align: center;
font-size: 14px;
z-index: 99;
padding-bottom: 40rpx;
bottom: 160rpx;
}
.help .title{
margin-top: 15px;
}
.help .content{
width: 86%;
margin: 0 auto;
text-align: left;
margin-top: 12px;
}
.help-img{
position:absolute;
top: 50%;
left: 50%;
transform: translate(-50%,-50%);
width: 432rpx;
height: 988rpx;
z-index: 98;
}
.countdown{
position:absolute;
width: 100%;
height: 100%;
background: #FF9B4D;
z-index: 100;
}
.countdown .second{
position:absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
color: #FFFFFF;
font-size: 160rpx;
font-family: 'Number';
z-index: 101;
}
.time{
position: absolute;
width: 220rpx;
height: 48px;
font-size: 34px;
line-height: 48px;
color: #FFFFFF;
background: #000000;
opacity: 0.74;
border-radius: 12px;
font-family: 'Number';
left: 20px;
top: 140rpx;
text-align: center;
z-index: 99;
}
.number{
position: absolute;
width: 220rpx;
height: 48px;
font-size: 34px;
line-height: 48px;
color: #FFFFFF;
background: #000000;
opacity: 0.74;
border-radius: 12px;
font-family: 'Number';
right: 20px;
top: 140rpx;
text-align: center;
z-index: 99;
}
.grade{
overflow: hidden;
position:absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 487px;
height: 242px;
background: #FFFFFF;
box-shadow: 0px 2px 20px rgba(0, 0, 0, 0.08);
border-radius: 12px;
z-index: 100;
}
.grade .num{
text-align: center;
font-size: 42px;
font-family: 'Number';
margin-top: 40px;
}
.grade text{
font-size: 12px;
color: #888888;
}
.eggs{
font-size: 14px;
color: #353535;
text-align: center;
width: 334px;
margin: 0 auto;
margin-top: 24px;
}
.btns{
width: 92%;
margin: 0 auto;
margin-top: 26px;
}
.btns-left{
background: #F5F5F5;
border-radius: 22px;
float: left;
width: 48%;
height: 40px;
line-height: 40px;
text-align: center;
font-size: 17px;
font-weight: bold;
color: #FF9B4D;
}
.btns-right{
background: #FF9B4D;
border-radius: 22px;
float: right;
width: 48%;
height: 40px;
line-height: 40px;
text-align: center;
font-size: 17px;
font-weight: bold;
color: #FFFFFF;
}
.camera{
width: 100%;
height: 100%;
position: absolute;
z-index:9
}
.tips-type-tips{
text-align: center;
font-size: 17px;
font-weight: bold;
margin-bottom: 14px;
}
subPages/sport/ai-sport/ai-sport.js
View file @
1b60b956
var
app
=
getApp
()
var
API
=
require
(
"../../../utils/request.js"
);
var
COS
=
require
(
'../../../utils/cos-wx-sdk-v5'
);
var
poseDetection
=
require
(
'@tensorflow-models/pose-detection'
);
var
flagTimer
=
null
;
...
...
subPages/sport/ai-sport/ai-sport.json
View file @
1b60b956
{
"usingComponents"
:
{},
"disableScroll"
:
true
,
"pageOrientation"
:
"auto"
"disableScroll"
:
true
}
\ No newline at end of file
subPages/sport/ai-ywqz-sport/ai-ywqz-sport.js
0 → 100644
View file @
1b60b956
var
app
=
getApp
()
var
poseDetection
=
require
(
'@tensorflow-models/pose-detection'
);
var
flagTimer
=
null
;
var
time
=
0
;
var
iosNum
=
0
;
//ios不能重复播放同一地址音频,后加一位数,加时间戳不行
Page
({
mixins
:
[
require
(
'../ai-mixins/ai-ywqz-mixins.js'
)],
data
:
{
fps
:
20
,
//控制频率
//当前状态 0 提示 1 识别中 2 识别成功,读秒 3 进行中
// 4 成绩提交失败 5 等待成绩上传 6 开始前播报
aiState
:
6
,
downTime
:
5
,
//开始倒计时
downTimeStg
:
'00:00'
,
uuid
:
''
,
//唯一标识
prepare
:
''
,
aiCount
:
0
,
//当前个数
waitTimer
:
''
,
//等待结果定时器
beforeTimer
:
''
,
//开始前定时器
startTimer
:
''
,
//进行中定时器
startTips
:
''
,
//开始前语音 提醒
phoneType
:
''
,
//ios android
showCamera
:
true
,
cameraFront
:
true
,
//镜头是否前置
src
:
''
,
//实时播报的路径
videoSrc
:
''
,
fileCosFilePath
:
''
,
//截取视频
needUploadFilePath
:
''
,
levelfontsize
:
''
,
sportTime
:
60
,
//运动时长
},
onLoad
:
function
(
options
)
{
var
that
=
this
;
iosNum
=
0
;
time
=
0
;
//运动时长(秒)
if
(
options
.
sportTime
){
// 30/60/120/180
this
.
setData
({
sportTime
:
options
.
sportTime
})
}
// 音频/语音交互相关
this
.
ctx
=
wx
.
createCanvasContext
(
'myCanvas'
);
that
.
ctxs
=
wx
.
createCameraContext
();
this
.
setData
({
innerAudioContext
:
wx
.
createInnerAudioContext
(),
//本地音乐组件
innerAudioContext2
:
wx
.
createInnerAudioContext
()
//倒计时播音组件
},()
=>
{
that
.
data
.
innerAudioContext
.
obeyMuteSwitch
=
false
;
that
.
data
.
innerAudioContext2
.
obeyMuteSwitch
=
false
;
that
.
loadMoveNet
();
})
//初始化设备
this
.
initDevice
()
},
onUnload
(){
var
that
=
this
;
that
.
data
.
innerAudioContext
.
destroy
();
that
.
data
.
innerAudioContext2
.
destroy
();
clearInterval
(
flagTimer
);
clearTimeout
(
that
.
data
.
prepare
);
clearTimeout
(
that
.
data
.
waitTimer
);
clearInterval
(
that
.
data
.
beforeTimer
);
clearTimeout
(
that
.
data
.
startTimer
);
},
loadMoveNet
(){
var
that
=
this
;
if
(
app
.
globalData
.
movenet
){
that
.
data
.
startTips
=
setTimeout
(
function
()
{
//开始识别
that
.
setData
({
aiState
:
1
},()
=>
{
console
.
log
(
'开始识别运动姿势'
)
})
},
that
.
data
.
sportTime
*
100
+
500
)
that
.
canvasInit
();
that
.
cameraFrame
();
}
else
{
wx
.
showLoading
({
mask
:
true
,
title
:
'初始化中...'
,
})
var
modelUrl
=
wx
.
getStorageSync
(
'aiModelUrl'
),
detectorConfig
=
{
modelType
:
poseDetection
.
movenet
.
modelType
.
SINGLEPOSE_LIGHTNING
,
modelUrl
:
modelUrl
};
poseDetection
.
createDetector
(
poseDetection
.
SupportedModels
.
MoveNet
,
detectorConfig
).
then
(
function
(
detector
)
{
wx
.
hideLoading
();
that
.
palyLocal
(
'/images/ai/clues.mp3'
);
that
.
data
.
startTips
=
setTimeout
(
function
()
{
//开始识别
that
.
setData
({
aiState
:
1
},()
=>
{
console
.
log
(
'开始识别运动姿势'
)
})
},
that
.
data
.
sportTime
*
100
+
500
)
app
.
globalData
.
movenet
=
detector
;
that
.
canvasInit
();
that
.
cameraFrame
();
}).
catch
(
function
(
err
)
{
console
.
log
(
err
)
wx
.
showToast
({
icon
:
'error'
,
title
:
'初始化失败'
,
success
:
function
(){
wx
.
navigateBack
({
delta
:
1
})
},
})
})
}
},
canvasInit
()
{
// 获取canvas
var
that
=
this
wx
.
createSelectorQuery
().
select
(
'#myCanvas'
)
.
fields
({
node
:
true
,
size
:
true
})
.
exec
(
function
(
res
)
{
var
canvas
=
res
[
0
].
node
var
ctx
=
canvas
.
getContext
(
'2d'
)
var
dpr
=
wx
.
getSystemInfoSync
().
pixelRatio
canvas
.
width
=
480
*
dpr
canvas
.
height
=
640
*
dpr
ctx
.
scale
(
dpr
,
dpr
)
that
.
ctx
=
ctx
that
.
canvas
=
canvas
that
.
res0
=
res
[
0
]
})
},
cameraFrame
()
{
// 视频流
var
that
=
this
,
store
=
[],
startTime
=
new
Date
(),
camera
=
wx
.
createCameraContext
()
that
.
listener
=
camera
.
onCameraFrame
(
function
(
frame
)
{
//console.log(app.globalData.movenet)
if
(
frame
&&
app
.
globalData
.
movenet
)
{
//帧率控制
store
.
push
(
frame
)
}
})
console
.
log
(
'识别'
)
that
.
listener
.
start
({
success
:
function
()
{
console
.
log
(
'当前的识别频率'
,
that
.
data
.
fps
)
//flagTimer && clearInterval(flagTimer)
flagTimer
=
setInterval
(
function
()
{
//帧率控制
if
(
store
.
length
==
0
)
return
;
var
object
=
{
data
:
new
Uint8Array
(
store
[
store
.
length
-
1
].
data
),
height
:
Number
(
store
[
store
.
length
-
1
].
height
),
width
:
Number
(
store
[
store
.
length
-
1
].
width
)
}
that
.
actionSend
(
object
,
app
)
store
=
[]
that
.
setData
({
resultFps
:
that
.
data
.
resultFps
+
1
,
fpstime
:
parseInt
((
that
.
data
.
resultFps
+
1
)
*
1000
/
(
new
Date
().
getTime
()
-
startTime
))
})
},
1000
/
that
.
data
.
fps
)
},
})
},
//播放本地音乐组件
palyLocal
(
url
)
{
var
that
=
this
;
this
.
data
.
innerAudioContext
.
autoplay
=
true
;
this
.
data
.
innerAudioContext
.
volume
=
1
;
if
(
that
.
data
.
phoneType
==
'ios'
){
this
.
data
.
innerAudioContext
.
src
=
url
+
'?'
+
Date
.
now
();
}
else
{
this
.
data
.
innerAudioContext
.
src
=
url
;
}
this
.
data
.
innerAudioContext
.
onPlay
(()
=>
{
console
.
log
(
'开始播放'
)
})
this
.
data
.
innerAudioContext
.
onEnded
(()
=>
{
console
.
log
(
'播放结束'
)
//this.data.innerAudioContext.destroy()
})
},
//播放本地音乐组件
//播放本地音乐组件
palyLocal2
(
url
)
{
var
that
=
this
;
that
.
data
.
innerAudioContext2
.
autoplay
=
true
;
that
.
data
.
innerAudioContext2
.
volume
=
0.4
;
that
.
data
.
innerAudioContext2
.
src
=
url
;
that
.
data
.
innerAudioContext2
.
onPlay
(()
=>
{
console
.
log
(
'开始播放22222222'
)
})
that
.
data
.
innerAudioContext2
.
onEnded
(()
=>
{
console
.
log
(
'播放结束222222'
)
iosNum
=
iosNum
+
1
;
setTimeout
(
function
(){
that
.
palyLocal2
(
'https://cdn.xiaobentiyu.cn/mp3/2-LoopMelody(BPM130).mp3?a='
+
iosNum
);
},
200
)
})
that
.
data
.
innerAudioContext2
.
onError
((
err
)
=>
{
console
.
log
(
'err'
,
err
)
})
},
//执行开始
start
(){
var
that
=
this
;
var
downTime
=
this
.
data
.
downTime
;
that
.
palyLocal
(
'/packageC/images/skip.mp3'
);
that
.
data
.
prepare
=
setTimeout
(()
=>
{
that
.
setData
({
aiState
:
2
})
that
.
palyLocal
(
'/images/ai/N5.mp3'
);
that
.
data
.
beforeTimer
=
setInterval
(()
=>
{
downTime
=
downTime
-
1
;
this
.
setData
({
downTime
:
downTime
});
if
(
downTime
===
4
){
that
.
palyLocal
(
'/images/ai/N4.mp3'
);
}
else
if
(
downTime
===
3
){
that
.
palyLocal
(
'/images/ai/N3.mp3'
);
}
else
if
(
downTime
===
2
){
that
.
palyLocal
(
'/images/ai/N2.mp3'
);
}
else
if
(
downTime
===
1
){
that
.
palyLocal
(
'/images/ai/N1.mp3'
);
}
else
if
(
downTime
===
0
)
{
clearInterval
(
that
.
data
.
beforeTimer
);
that
.
setData
({
downTime
:
'开始'
});
that
.
palyLocal
(
'/images/ai/V_START.mp3'
)
setTimeout
(
function
()
{
that
.
setData
({
aiState
:
3
})
that
.
startTime
();
},
1000
);
}
},
1000
);
},
1200
)
},
//开始运动
startTime
(){
//console.log('开始运动1111111',time)
var
that
=
this
;
//time = that.data.time;
time
=
time
+
1
;
var
downTimeStg
=
that
.
formatSeconds
(
time
);
that
.
setData
({
downTimeStg
:
downTimeStg
},()
=>
{
that
.
palyLocal2
(
'https://cdn.xiaobentiyu.cn/mp3/2-LoopMelody(BPM130).mp3'
);
})
if
(
time
==
1
){
//console.log('开始1')
}
if
(
time
==
that
.
data
.
sportTime
-
5
){
that
.
palyLocal
(
'/images/ai/N5.mp3'
);
}
if
(
time
==
that
.
data
.
sportTime
-
4
){
that
.
palyLocal
(
'/images/ai/N4.mp3'
);
}
if
(
time
==
that
.
data
.
sportTime
-
3
){
that
.
palyLocal
(
'/images/ai/N3.mp3'
);
}
if
(
time
==
that
.
data
.
sportTime
-
2
){
that
.
palyLocal
(
'/images/ai/N2.mp3'
);
}
if
(
time
==
that
.
data
.
sportTime
-
1
){
that
.
palyLocal
(
'/images/ai/N1.mp3'
);
}
if
(
time
==
10
){
//console.log('开始2')
}
if
((
that
.
data
.
sportTime
==
30
&&
time
==
8
)
||
(
that
.
data
.
sportTime
!=
30
&&
time
==
20
)){
// that.startRecord();
}
if
((
that
.
data
.
sportTime
==
30
&&
time
==
18
)
||
(
that
.
data
.
sportTime
!=
30
&&
time
==
32
)){
}
// 时间已过半语音 暂时只支持60秒模式
if
(
that
.
data
.
sportTime
==
60
&&
time
==
30
){
console
.
log
(
'开始4'
)
that
.
palyLocal
(
'/images/ai/30.mp3'
);
}
if
(
time
==
40
){
//console.log('开始5')
}
if
(
that
.
data
.
sportTime
==
60
&&
time
==
50
){
//console.log('开始6')
that
.
palyLocal
(
'/images/ai/50.mp3'
);
}
if
(
time
==
that
.
data
.
sportTime
){
that
.
palyLocal
(
'/images/ai/stop.mp3'
);
console
.
log
(
'销毁定时器'
)
wx
.
showLoading
({
title
:
'统计中...'
,
})
that
.
data
.
innerAudioContext2
.
destroy
();
that
.
data
.
waitTimer
=
setTimeout
(
function
(){
wx
.
hideLoading
();
that
.
setData
({
aiState
:
5
},()
=>
{
that
.
save
();
})
},
1500
)
}
that
.
data
.
startTimer
=
setTimeout
(
function
()
{
if
(
time
<
that
.
data
.
sportTime
){
that
.
startTime
();
}
},
1000
)
},
//秒转换格式mm:ss
formatSeconds
(
value
)
{
let
result
=
parseInt
(
value
)
let
h
=
Math
.
floor
(
result
/
3600
)
<
10
?
Math
.
floor
(
result
/
3600
)
:
Math
.
floor
(
result
/
3600
);
let
m
=
Math
.
floor
((
result
/
60
%
60
))
<
10
?
'0'
+
Math
.
floor
((
result
/
60
%
60
))
:
Math
.
floor
((
result
/
60
%
60
));
let
s
=
Math
.
floor
((
result
%
60
))
<
10
?
'0'
+
Math
.
floor
((
result
%
60
))
:
Math
.
floor
((
result
%
60
));
var
time
=
m
+
":"
+
s
return
time
;
},
//错误知道了
errknow
(){
wx
.
navigateBack
({
changed
:
true
});
},
//切换摄像头
switch
(){
this
.
setData
({
cameraFront
:
!
this
.
data
.
cameraFront
})
},
//退出页面
exit
(){
var
that
=
this
;
wx
.
showModal
({
title
:
'提示'
,
content
:
'已开启AI运动模式,确定退出模式?'
,
cancelText
:
"继续训练"
,
//默认是“取消”
confirmText
:
"退出模式"
,
//默认是“确定”
success
:
function
(
res
)
{
if
(
res
.
confirm
)
{
console
.
log
(
'用户点击确定'
)
clearTimeout
(
that
.
data
.
waitTimer
);
clearInterval
(
that
.
data
.
beforeTimer
);
clearTimeout
(
that
.
data
.
startTimer
);
wx
.
navigateBack
({
changed
:
true
});
}
else
{
//这里是点击了取消以后
console
.
log
(
'用户点击取消'
)
}
}
})
},
initDevice
(){
let
that
=
this
wx
.
getSystemInfo
({
success
:
function
(
res
)
{
console
.
log
(
'当前的系统'
,
res
)
if
(
res
.
platform
==
"devtools"
)
{
that
.
setData
({
phoneType
:
'ios'
})
}
else
if
(
res
.
platform
==
"ios"
)
{
that
.
setData
({
phoneType
:
'ios'
})
}
else
if
(
res
.
platform
==
"android"
)
{
that
.
setData
({
phoneType
:
'android'
})
}
}
})
wx
.
getSetting
({
success
(
res
)
{
if
(
!
res
.
authSetting
[
'scope.camera'
]){
wx
.
showModal
({
title
:
'提示'
,
content
:
'请点击右上角设置授权摄像头'
,
showCancel
:
false
,
//是否显示取消按钮
confirmText
:
"知道了"
,
//默认是“确定”
success
:
function
(
res
)
{
if
(
res
.
cancel
)
{
//点击取消,默认隐藏弹框
}
else
{
wx
.
navigateBack
({
delta
:
1
})
}
}
})
}
else
{
console
.
log
(
'正常授权'
)
}
}
})
wx
.
openSetting
({
success
(
res
)
{
if
(
res
.
authSetting
[
'scope.camera'
]){
that
.
setData
({
showCamera
:
true
})
}
}
})
}
})
\ No newline at end of file
subPages/sport/ai-ywqz-sport/ai-ywqz-sport.json
0 → 100644
View file @
1b60b956
{
"usingComponents"
:
{},
"navigationStyle"
:
"custom"
,
"pageOrientation"
:
"landscape"
}
\ No newline at end of file
subPages/sport/ai-ywqz-sport/ai-ywqz-sport.wxml
0 → 100644
View file @
1b60b956
<camera device-position="{{!cameraFront?'back':'front'}}" flash="off" binderror="error" frame-size="medium" class="camera" id="camera">
<canvas type="2d" id="myCanvas" class="canvas"></canvas>
</camera>
<view wx:if="{{aiState == 1 || aiState == 6}}">
<image class="help-img" src="https://cdn.xiaobentiyu.cn/sport_minapp_img/sitUp/jumping-jacks.png"></image>
<view class="help">
<view class="title">互动小提示</view>
<view class="content">手机竖屏固定放置,调整屏幕角度,训练者全身及双脚出现至屏幕内,识别更精准。</view>
</view>
</view>
<!-- 识别成功,读秒 -->
<view class="countdown" wx:if="{{aiState == 2}}">
<view class="second">{{downTime}}</view>
</view>
<!-- 进行中 -->
<view wx:if="{{aiState == 3}}">
<view class="time">{{downTimeStg}}</view>
<view class="number" style="{{levelfontsize}}">{{aiCount}}</view>
</view>
<!-- 成绩提交失败 -->
<view class="tips" wx:if="{{aiState == 4}}">
<view class="tips-type error-type">
抱歉,由于角度、光线等客观环境影响,AI识别失败!结束训练/重新开始训练
</view>
<view class="handle">
<!-- <view class="no-tips">不再提示</view> -->
<view class="know" bindtap="errknow">知道了</view>
</view>
</view>
<!-- 识别中 -->
<view class="switch" bindtap="switch" wx:if="{{aiState == 1}}">
<image src="https://cdn.xiaobentiyu.cn/sport_minapp_img/sitUp/icon-flip.png"></image>
<view class="text">{{cameraFront?'切换家长拍模式':'切换自拍模式'}}</view>
</view>
<view class="exit" bindtap="exit">
<image src="https://cdn.xiaobentiyu.cn/sport_minapp_img/sitUp/icon-exit.png"></image>
<view class="text">退出</view>
</view>
<audio src="{{src}}" id="myAudio" ></audio>
subPages/sport/ai-ywqz-sport/ai-ywqz-sport.wxss
0 → 100644
View file @
1b60b956
@font-face {
font-family: 'Number';
src: url('data:application/font-woff2;charset=utf-8;base64,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') format('woff2');
}
page{
background: #D1D1D1;
}
.canvas {
position: absolute;
width: 100%;
height: 100%;
z-index: 100;
}
/* 自定义导航条样式 */
.nav{
width: 100%;
overflow: hidden;
position: relative;
top: 0;
left: 0;
z-index: 10;
}
.nav-title{
width: 100%;
height: 90rpx;
line-height: 90rpx;
text-align: center;
position: absolute;
bottom: 0;
left: 0;
z-index: 10;
font-size:26rpx;
color: #FFFFFF;
}
.nav .back{
width: 44rpx;
height: 44rpx;
position: absolute;
bottom: 0;
left: 0;
padding: 24rpx 30rpx;
}
.bg-white{
background-color: transparent;
}
.bg-gray{
background-color: #f7f7f7;
}
.overflow{
overflow: auto;
}
.hidden{
overflow: hidden;
}
.user-info image{
width: 64rpx;
height: 64rpx;
}
.tips{
position:absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 80%;
padding-bottom: 50rpx;
text-align: justify;
/* height: 242px; */
background: #FFFFFF;
box-shadow: 0px 2px 20px rgba(0, 0, 0, 0.08);
border-radius: 12px;
padding:15px;
z-index: 99;
}
.errors{
height: 110px;
}
.error-type{
width: 90%;
margin: 0 auto;
margin-top: 10px;
}
.tips-type{
overflow: hidden;
}
.correct{
float: left;
width: 154px;
height: 140px;
margin-right: 1px;
}
.correct .img{
width: 100%;
height: 100px;
background: #F8F8F8;
}
.correct .img image{
width: 100%;
height: 100px;
background: #F8F8F8;
}
.error .img image{
width: 100%;
height: 100px;
background: #F8F8F8;
}
.correct .text{
font-size: 12px;
color: #353535;
text-align: center;
line-height: 40px;
}
.no-tips{
float: left;
font-size: 14px;
color: #888888;
padding-top: 10px;
padding-left: 20px;
}
.know{
float: left;
width: 320rpx;
height: 40px;
line-height: 40px;
color: #FFFFFF;
border-radius: 22px;
text-align: center;
background: #FF9B4D;
margin-left: 160rpx;
font-size: 17px;
font-weight: bold;
margin-top: 14px;
}
.error{
float: left;
width: 100px;
height: 140px;
margin-right: 1px;
}
.error .img{
width: 100%;
height: 100px;
background: #F8F8F8;
}
.error .text{
font-size: 12px;
color: #353535;
text-align: center;
line-height: 40px;
}
.handle{
width: 100%;
height: 40px;
}
.switch{
position: absolute;
height: 44px;
padding-right: 10px;
line-height: 44px;
background: #000000;
opacity: 0.74;
border-radius: 12px;
left: 20px;
bottom: 15px;
color: #FFFFFF;
z-index: 99;
}
.switch .text{
padding-left: 40px;
}
.switch image{
position: absolute;
top: 10px;
left: 6px;
width: 32px;
height: 26px;
}
.exit{
position: absolute;
height: 44px;
padding-right: 10px;
line-height: 44px;
background: #000000;
opacity: 0.74;
border-radius: 12px;
right: 20px;
bottom: 15px;
color: #FFFFFF;
z-index: 99;
}
.exit .text{
padding-left: 40px;
}
.exit image{
position: absolute;
top: 8px;
left: 6px;
width: 32px;
height: 26px;
}
.help{
position: absolute;
left: 20px;
width: 192px;
background: #000000;
opacity: 0.74;
border-radius: 12px;
color: #FFFFFF;
text-align: center;
font-size: 14px;
z-index: 99;
padding-bottom: 40rpx;
bottom: 160rpx;
}
.help .title{
margin-top: 15px;
}
.help .content{
width: 86%;
margin: 0 auto;
text-align: left;
margin-top: 12px;
}
.help-img{
position:absolute;
top: 50%;
left: 50%;
transform: translate(-50%,-50%);
width: 432rpx;
height: 988rpx;
z-index: 98;
}
.countdown{
position:absolute;
width: 100%;
height: 100%;
background: #FF9B4D;
z-index: 100;
}
.countdown .second{
position:absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
color: #FFFFFF;
font-size: 160rpx;
font-family: 'Number';
z-index: 101;
}
.time{
position: absolute;
width: 220rpx;
height: 48px;
font-size: 34px;
line-height: 48px;
color: #FFFFFF;
background: #000000;
opacity: 0.74;
border-radius: 12px;
font-family: 'Number';
left: 20px;
top: 140rpx;
text-align: center;
z-index: 99;
}
.number{
position: absolute;
width: 220rpx;
height: 48px;
font-size: 34px;
line-height: 48px;
color: #FFFFFF;
background: #000000;
opacity: 0.74;
border-radius: 12px;
font-family: 'Number';
right: 20px;
top: 140rpx;
text-align: center;
z-index: 99;
}
.grade{
overflow: hidden;
position:absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 487px;
height: 242px;
background: #FFFFFF;
box-shadow: 0px 2px 20px rgba(0, 0, 0, 0.08);
border-radius: 12px;
z-index: 100;
}
.grade .num{
text-align: center;
font-size: 42px;
font-family: 'Number';
margin-top: 40px;
}
.grade text{
font-size: 12px;
color: #888888;
}
.eggs{
font-size: 14px;
color: #353535;
text-align: center;
width: 334px;
margin: 0 auto;
margin-top: 24px;
}
.btns{
width: 92%;
margin: 0 auto;
margin-top: 26px;
}
.btns-left{
background: #F5F5F5;
border-radius: 22px;
float: left;
width: 48%;
height: 40px;
line-height: 40px;
text-align: center;
font-size: 17px;
font-weight: bold;
color: #FF9B4D;
}
.btns-right{
background: #FF9B4D;
border-radius: 22px;
float: right;
width: 48%;
height: 40px;
line-height: 40px;
text-align: center;
font-size: 17px;
font-weight: bold;
color: #FFFFFF;
}
.camera{
width: 100%;
height: 100%;
position: absolute;
z-index:9
}
.tips-type-tips{
text-align: center;
font-size: 17px;
font-weight: bold;
margin-bottom: 14px;
}
subPages/sport/detail/detail.js
View file @
1b60b956
...
...
@@ -110,10 +110,19 @@ Page({
//运动时常
let
time
=
this
.
data
.
timeList
[
this
.
data
.
popupActive
].
value
wx
.
navigateTo
({
// url: '../../..//ai/index/index?sportTime=' + time,
url
:
'../../../subPages/sport/ai-sport/ai-sport?sportTime='
+
time
,
})
if
(
this
.
data
.
sportDetail
.
id
==
2
){
//仰卧起坐
wx
.
navigateTo
({
url
:
'../../../subPages/sport/ai-ywqz-sport/ai-ywqz-sport?sportTime='
+
time
,
})
}
else
if
(
this
.
data
.
sportDetail
.
id
==
14
){
//俯卧撑
wx
.
navigateTo
({
url
:
'../../../subPages/sport/ai-fwc-sport/ai-fwc-sport?sportTime='
+
time
,
})
}
else
{
wx
.
navigateTo
({
url
:
'../../../subPages/sport/ai-sport/ai-sport?sportTime='
+
time
,
})
}
},
//隐藏显示
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment