ltx 647bc39d27 feat: 完成体质报告小程序入口与教练资源播放优化
教练端在学生报告页录入体质数据并生成报告,新增报告查看页;学员端从报告页查看最新评估结果、体测指标与运动建议。请求统一走现有 QA 后端并携带登录令牌。

教学资源改用后台音频管理器,支持进度拖动、曲目切换、时长探测及网络异常时下载恢复;修正跳绳和开合跳动作提示文案。

验证:相关 JS 语法、页面 JSON 解析和 git diff --cached --check 均通过。
2026-10-23 16:48:58 +08:00

774 lines
15 KiB
Plaintext

/* subpackage/teacher/student-fitness-detail/student-fitness-detail.wxss */
.posture-actions { display: flex; gap: 16rpx; margin: 24rpx 0; }
.posture-action { flex: 1; min-height: 76rpx; padding: 14rpx; box-sizing: border-box; border-radius: 16rpx; display: flex; align-items: center; justify-content: center; text-align: center; font-size: 24rpx; }
.posture-action-primary { color: #fff; background: #268dec; }
.posture-action-secondary { color: #268dec; background: #e8f3ff; }
/* ===== 成绩弹窗 ===== */
.popup-mask {
position: fixed;
top: 0; left: 0; right: 0; bottom: 0;
background: rgba(0,0,0,0.45);
z-index: 999;
}
.score-popup {
position: fixed;
left: 0; right: 0; bottom: 0;
background: #fff;
border-radius: 36rpx 36rpx 0 0;
padding: 36rpx 40rpx 60rpx;
z-index: 9999;
transform: translateY(100%);
transition: transform 0.3s ease;
box-shadow: 0 -8rpx 40rpx rgba(73,165,252,0.18);
}
.popup-show {
transform: translateY(0);
}
.popup-header {
display: flex;
align-items: center;
margin-bottom: 36rpx;
}
.popup-icon {
width: 88rpx;
height: 88rpx;
margin-right: 20rpx;
border-radius: 50%;
/* background: linear-gradient(135deg, #8dcfff, #49a5fc); */
/* padding: 14rpx; */
box-sizing: border-box;
}
.popup-title {
flex: 1;
font-size: 34rpx;
font-weight: bold;
color: #18394D;
}
.popup-close {
width: 56rpx;
height: 56rpx;
border-radius: 50%;
background: #f0f4f8;
display: flex;
align-items: center;
justify-content: center;
font-size: 26rpx;
color: #999;
}
.score-rows {
background: #f7fbff;
border-radius: 20rpx;
padding: 8rpx 30rpx;
margin-bottom: 36rpx;
}
.score-row {
display: flex;
justify-content: space-between;
align-items: center;
padding: 24rpx 0;
border-bottom: 1rpx solid #eef2f8;
}
.score-row:last-child {
border-bottom: none;
}
.score-divider {
height: 2rpx;
background: linear-gradient(90deg, transparent, #d0e8ff, transparent);
margin: 4rpx 0;
}
.score-label {
font-size: 28rpx;
color: #666;
}
.score-value {
font-size: 34rpx;
font-weight: bold;
color: #333;
}
.score-highlight {
color: #1d78e8;
font-size: 40rpx;
}
.score-unit {
font-size: 22rpx;
color: #999;
font-weight: normal;
}
.popup-btn {
background: linear-gradient(135deg, #49a5fc, #1d78e8);
color: #fff;
text-align: center;
padding: 28rpx 0;
border-radius: 50rpx;
font-size: 30rpx;
font-weight: bold;
box-shadow: 0 6rpx 20rpx rgba(73,165,252,0.4);
letter-spacing: 2rpx;
}
/* ===== 体测报告卡片 ===== */
.fitness-card {
background: #fff;
border-radius: 24rpx;
padding: 30rpx 20rpx 10rpx;
box-shadow: 0 4rpx 20rpx rgba(73,165,252,0.12);
margin-bottom: 30rpx;
margin-top: 20rpx;
display: flex;
flex-direction: column;
align-items: center;
}
.fitness-chart-title {
font-size: 30rpx;
font-weight: bold;
color: #18394D;
margin-bottom: 16rpx;
position: relative;
padding: 0 30rpx;
}
.fitness-chart-title::before,
.fitness-chart-title::after {
content: '';
display: inline-block;
width: 60rpx;
height: 4rpx;
background: linear-gradient(90deg, transparent, #49a5fc);
vertical-align: middle;
margin-right: 16rpx;
border-radius: 2rpx;
}
.fitness-chart-title::after {
background: linear-gradient(90deg, #49a5fc, transparent);
margin-right: 0;
margin-left: 16rpx;
}
.radar-wrap {
overflow: hidden;
}
/* ===== 六项指标网格 ===== */
.fitness-grid {
display: flex;
flex-wrap: wrap;
gap: 20rpx;
margin-bottom: 10rpx;
}
.fitness-item {
width: calc(33.33% - 14rpx);
background: #fff;
border-radius: 20rpx;
box-shadow: 0 4rpx 16rpx rgba(73,165,252,0.12);
display: flex;
flex-direction: column;
align-items: center;
padding: 30rpx 10rpx 24rpx;
box-sizing: border-box;
active-opacity: 0.7;
}
.fitness-item:active {
transform: scale(0.96);
}
.fitness-icon {
width: 88rpx;
height: 88rpx;
}
.fitness-name {
font-size: 24rpx;
color: #333;
font-weight: 500;
text-align: center;
margin-bottom: 8rpx;
}
.fitness-score {
font-size: 30rpx;
font-weight: bold;
color: #1d78e8;
}
.fitness-unit {
font-size: 20rpx;
color: #999;
font-weight: normal;
}
/* ===== 空状态 ===== */
.empty-tip {
text-align: center;
padding: 80rpx 0;
color: #bbb;
font-size: 26rpx;
flex-wrap: wrap;
gap: 10rpx;
}
.meta-tag {
background-color: rgba(255, 255, 255, 0.25);
border-radius: 20rpx;
padding: 4rpx 18rpx;
font-size: 22rpx;
color: #fff;
}
.score-wrap {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
background-color: rgba(255, 255, 255, 0.2);
border-radius: 20rpx;
padding: 16rpx 28rpx;
flex-shrink: 0;
}
.score-num {
font-size: 52rpx;
font-weight: bold;
color: #fff;
line-height: 1;
}
/* ===== 章节标题 ===== */
.section-title {
display: flex;
align-items: center;
margin: 36rpx 30rpx 16rpx;
font-size: 28rpx;
font-weight: bold;
color: #222;
}
.title-bar {
width: 6rpx;
height: 28rpx;
border-radius: 6rpx;
background: linear-gradient(180deg, #26A5F6, #1478D4);
margin-right: 16rpx;
}
/* ===== 成绩表格 ===== */
.table-card {
background-color: #fff;
border-radius: 24rpx;
margin: 0 30rpx 40rpx;
overflow: hidden;
box-shadow: 0 4rpx 20rpx rgba(38, 165, 246, 0.1);
}
.table-row {
display: grid;
grid-template-columns: 2fr 1.5fr 1fr 1.2fr;
align-items: center;
padding: 0 24rpx;
min-height: 90rpx;
}
.table-header {
background: linear-gradient(90deg, #EAF4FF, #f5faff);
font-size: 24rpx;
font-weight: bold;
color: #26A5F6;
min-height: 72rpx;
border-bottom: 2rpx solid #e8f3ff;
}
.row-even {
background-color: #fff;
border-bottom: 2rpx solid #f5f5f5;
}
.row-odd {
background-color: #f8fcff;
border-bottom: 2rpx solid #f5f5f5;
}
.col-name {
font-size: 26rpx;
color: #333;
padding-right: 10rpx;
word-break: break-all;
}
.col {
font-size: 25rpx;
color: #555;
text-align: center;
}
.col-score {
font-weight: bold;
color: #26A5F6;
}
.col-rank {
text-align: center;
border-radius: 20rpx;
font-size: 22rpx;
padding: 4rpx 0;
}
.col-rank.rank-1 {
color: #1aad19;
background-color: #e8f9e8;
}
.col-rank.rank-2 {
color: #26A5F6;
background-color: #eaf4ff;
}
.col-rank.rank-3 {
color: #ff9900;
background-color: #fff7e8;
}
.col-rank.rank-4 {
color: #e64340;
background-color: #fff0f0;
}
/* ===== 空状态 ===== */
.empty {
text-align: center;
padding: 80rpx 0;
color: #bbb;
font-size: 26rpx;
}
/* ===== 加载骨架 ===== */
.skeleton {
padding: 24rpx 30rpx;
}
.sk-header {
height: 160rpx;
background: linear-gradient(90deg, #dbeeff 25%, #c8e5ff 50%, #dbeeff 75%);
border-radius: 24rpx;
margin-bottom: 40rpx;
}
.sk-row {
height: 80rpx;
background: linear-gradient(90deg, #f0f0f0 25%, #e8e8e8 50%, #f0f0f0 75%);
border-radius: 12rpx;
margin-bottom: 16rpx;
}
/* ===== 主 Tab 切换 ===== */
.tab-switcher {
display: flex;
background: #e8f0fe;
border-radius: 60rpx;
padding: 6rpx;
margin: 24rpx 0 0;
}
.tab-btn {
flex: 1;
text-align: center;
padding: 20rpx 0;
border-radius: 54rpx;
font-size: 28rpx;
color: #26A5F6;
transition: all 0.25s;
}
.tab-btn-active {
background: linear-gradient(135deg, #26A5F6 0%, #1478D4 100%);
color: #fff;
font-weight: bold;
box-shadow: 0 4rpx 16rpx rgba(38,165,246,0.35);
}
/* ===== 课堂报告子Tab ===== */
.sub-tab-switcher {
display: flex;
background: #e8f0fe;
border-radius: 20rpx;
padding: 1rpx;
margin: 30rpx 200rpx 32rpx;
}
.sub-tab-btn {
flex: 1;
text-align: center;
padding: 20rpx 0;
border-radius: 16rpx;
font-size: 27rpx;
color: #6b7280;
}
.sub-tab-active {
background: linear-gradient(135deg, #1d78e8, #49a5fc);
color: #fff;
font-weight: bold;
box-shadow: 0 4rpx 16rpx rgba(29,120,232,0.35);
}
/* ===== 周期选择器入口 ===== */
.period-selector {
display: flex;
align-items: center;
justify-content: center;
background: #f0f7ff;
border-radius: 50rpx;
padding: 14rpx 40rpx;
margin: 0 auto 28rpx;
border: 1rpx solid #c8dff8;
width: fit-content;
}
.period-text {
font-size: 28rpx;
color: #1d78e8;
font-weight: 600;
}
.period-caret {
font-size: 24rpx;
color: #1d78e8;
margin-left: 8rpx;
}
/* ===== 统计区块标题 ===== */
.stat-section-header-wrap {
display: flex;
align-items: center;
margin: 16rpx 0 20rpx;
gap: 16rpx;
}
.stat-section-header-wrap::before,
.stat-section-header-wrap::after {
content: '';
flex: 1;
height: 1rpx;
background: linear-gradient(90deg, transparent, #cce0f8);
}
.stat-section-header-wrap::after {
background: linear-gradient(90deg, #cce0f8, transparent);
}
.stat-section-header {
color: #1d78e8;
font-size: 26rpx;
font-weight: bold;
white-space: nowrap;
}
/* ===== 统计指标网格 ===== */
.stat-grid {
display: flex;
flex-wrap: wrap;
gap: 16rpx;
margin-bottom: 32rpx;
justify-content: space-evenly;
}
.stat-card {
width: calc(50% - 20rpx);
border-radius: 28rpx;
padding: 30rpx 26rpx 28rpx;
box-sizing: border-box;
display: flex;
flex-direction: column;
gap: 12rpx;
position: relative;
overflow: hidden;
box-shadow: 0 8rpx 28rpx rgba(0,0,0,0.13);
}
.stat-card-1 { background: linear-gradient(135deg, #ff5f6d 0%, #ffc371 100%); }
.stat-card-2 { background: linear-gradient(135deg, #0fd850 0%, #00c3a9 100%); }
.stat-card-3 { background: linear-gradient(135deg, #2980b9 0%, #6dd5fa 100%); }
.stat-card-4 { background: linear-gradient(135deg, #7f7fd5 0%, #86a8e7 100%); }
.stat-card-bar {
position: absolute;
width: 180rpx;
height: 180rpx;
border-radius: 50%;
background: rgba(255,255,255,0.13);
bottom: -50rpx;
right: -40rpx;
}
.stat-card-label {
font-size: 24rpx;
color: rgba(255,255,255,0.88);
}
.stat-card-value {
font-size: 38rpx;
font-weight: bold;
color: #fff;
word-break: break-all;
line-height: 1.2;
text-shadow: 0 2rpx 8rpx rgba(0,0,0,0.12);
}
/* ===== 跳绳统计 ===== */
.jump-tip {
font-size: 22rpx;
color: #999;
margin-bottom: 16rpx;
}
.jump-summary-wrap {
background: #fff;
border-radius: 20rpx;
box-shadow: 0 4rpx 16rpx rgba(73,165,252,0.1);
overflow: hidden;
margin-bottom: 10rpx;
}
.jump-summary-header {
display: flex;
background: #1d78e8;
padding: 18rpx 0;
}
.jump-summary-data {
display: flex;
padding: 20rpx 0;
}
.jump-col {
flex: 1;
text-align: center;
font-size: 24rpx;
color: #fff;
}
.jump-summary-data .jump-col {
color: #18394D;
font-size: 36rpx;
font-weight: bold;
}
.jump-unit {
font-size: 20rpx;
color: rgba(255,255,255,0.85);
}
.jump-record-item {
display: flex;
align-items: center;
padding: 20rpx 30rpx;
border-bottom: 1rpx solid #f0f4f8;
}
.jump-record-item:last-child { border-bottom: none; }
.jump-record-icon-wrap {
width: 72rpx;
height: 72rpx;
background: linear-gradient(135deg, #49a5fc, #1d78e8);
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
margin-right: 24rpx;
flex-shrink: 0;
overflow: hidden;
}
.jump-record-icon {
width: 54rpx;
height: 54rpx;
filter: brightness(10);
}
.jump-record-main {
display: flex;
flex-direction: column;
gap: 8rpx;
}
.jump-record-tag {
display: inline-block;
background: #1d78e8;
color: #fff;
font-size: 22rpx;
padding: 4rpx 20rpx;
border-radius: 30rpx;
width: fit-content;
}
.jump-record-detail {
font-size: 26rpx;
color: #18394D;
padding-left: 4rpx;
}
/* ===== 月份/季度选择弹窗 ===== */
.picker-mask {
position: fixed;
top: 0; left: 0; right: 0; bottom: 0;
background: rgba(0,0,0,0.45);
z-index: 200;
}
.picker-sheet {
position: fixed;
left: 0; right: 0; bottom: 0;
background: #fff;
border-radius: 36rpx 36rpx 0 0;
padding-bottom: 220rpx;
z-index: 201;
transform: translateY(100%);
transition: transform 0.3s ease;
box-shadow: 0 -8rpx 40rpx rgba(73,165,252,0.18);
}
.picker-sheet-show { transform: translateY(0); }
.picker-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 28rpx 40rpx 20rpx;
border-bottom: 1rpx solid #f0f4f8;
}
.picker-title {
font-size: 32rpx;
font-weight: bold;
color: #18394D;
}
.picker-cancel {
font-size: 28rpx;
color: #999;
}
.picker-confirm {
font-size: 28rpx;
color: #1d78e8;
font-weight: bold;
}
.picker-year-row {
display: flex;
align-items: center;
justify-content: center;
padding: 28rpx 0 20rpx;
gap: 48rpx;
}
.picker-year-text {
font-size: 34rpx;
font-weight: bold;
color: #18394D;
min-width: 160rpx;
text-align: center;
}
.picker-year-arrow {
width: 64rpx;
height: 64rpx;
border-radius: 50%;
background: #f0f6ff;
display: flex;
align-items: center;
justify-content: center;
font-size: 44rpx;
color: #1d78e8;
line-height: 1;
text-align: center;
}
.picker-month-grid {
display: flex;
flex-wrap: wrap;
padding: 8rpx 30rpx 20rpx;
gap: 20rpx;
}
.picker-month-item {
width: calc(25% - 16rpx);
text-align: center;
padding: 20rpx 0;
border-radius: 16rpx;
font-size: 28rpx;
color: #333;
background: #f5f7fa;
box-sizing: border-box;
}
.picker-item-active {
background: linear-gradient(135deg, #49a5fc, #1d78e8);
color: #fff;
font-weight: bold;
box-shadow: 0 4rpx 12rpx rgba(73,165,252,0.4);
}
.picker-quarter-list {
padding: 16rpx 40rpx 20rpx;
display: flex;
flex-direction: column;
gap: 16rpx;
}
.picker-quarter-item {
display: flex;
justify-content: space-between;
align-items: center;
padding: 26rpx 36rpx;
border-radius: 20rpx;
background: #f5f7fa;
}
.picker-quarter-item.picker-item-active {
background: linear-gradient(135deg, #49a5fc, #1d78e8);
}
.picker-quarter-label {
font-size: 30rpx;
font-weight: bold;
color: #18394D;
}
.picker-quarter-item.picker-item-active .picker-quarter-label,
.picker-quarter-item.picker-item-active .picker-quarter-months { color: #fff; }
.picker-quarter-months {
font-size: 24rpx;
color: #999;
}
.picker-item-disabled { opacity: 0.3; }
.picker-year-arrow-disabled { opacity: 0.3; color: #ccc; }
/* ===== 课堂报告骨架屏 ===== */
@keyframes cr-shimmer {
0% { background-position: -750rpx 0; }
100% { background-position: 750rpx 0; }
}
.cr-skeleton {
padding: 0 30rpx 40rpx;
}
.cr-sk-grid {
display: flex;
flex-wrap: wrap;
gap: 20rpx;
margin-bottom: 32rpx;
}
.cr-sk-card {
width: calc(50% - 10rpx);
height: 140rpx;
border-radius: 16rpx;
background: linear-gradient(90deg, #f0f0f0 25%, #e8e8e8 50%, #f0f0f0 75%);
background-size: 750rpx 100%;
animation: cr-shimmer 1.4s infinite linear;
}
.cr-sk-divider {
height: 2rpx;
background: #f0f0f0;
margin-bottom: 32rpx;
}
.cr-sk-table {
height: 90rpx;
border-radius: 12rpx;
margin-bottom: 20rpx;
background: linear-gradient(90deg, #f0f0f0 25%, #e8e8e8 50%, #f0f0f0 75%);
background-size: 750rpx 100%;
animation: cr-shimmer 1.4s infinite linear;
}
.cr-sk-row {
height: 72rpx;
border-radius: 12rpx;
margin-bottom: 16rpx;
background: linear-gradient(90deg, #f0f0f0 25%, #e8e8e8 50%, #f0f0f0 75%);
background-size: 750rpx 100%;
animation: cr-shimmer 1.4s 0.1s infinite linear;
}