From 59fa317c5a6970e209f12987e6736384a7503cb1 Mon Sep 17 00:00:00 2001
From: zhangyibo95 <690096405@qq.com>
Date: Fri, 21 Aug 2026 15:38:01 +0800
Subject: [PATCH] =?UTF-8?q?update:=20=E4=BC=98=E5=8C=96=E4=B8=AA=E4=BA=BA?=
=?UTF-8?q?=E8=AE=AD=E7=BB=83?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../components/TrainingDifficultyBadge.vue | 32 ++++++++++++++
src/pages/training/difficulty.vue | 20 +++------
src/pages/training/index.vue | 41 +++++++++---------
src/static/training-home/img_22.png | Bin 27666 -> 25545 bytes
src/static/training-home/img_3.png | Bin 4233 -> 2213 bytes
src/static/training-home/img_4.png | Bin 5882 -> 1891 bytes
src/static/training-home/img_5.png | Bin 3948 -> 1978 bytes
src/static/training-home/img_6.png | Bin 4172 -> 1347 bytes
src/static/training-home/img_7.png | Bin 173 -> 2161 bytes
src/static/training-home/wendingxunlian.png | Bin 0 -> 2486 bytes
10 files changed, 57 insertions(+), 36 deletions(-)
create mode 100644 src/static/training-home/wendingxunlian.png
diff --git a/src/pages/training/components/TrainingDifficultyBadge.vue b/src/pages/training/components/TrainingDifficultyBadge.vue
index 5398582..27d8139 100644
--- a/src/pages/training/components/TrainingDifficultyBadge.vue
+++ b/src/pages/training/components/TrainingDifficultyBadge.vue
@@ -15,6 +15,10 @@ const props = defineProps({
type: Boolean,
default: false,
},
+ showUnlockProgress: {
+ type: Boolean,
+ default: false,
+ },
completedProgress: {
type: Number,
default: 0,
@@ -106,6 +110,15 @@ const handleClick = () => {
{{ node.label }}
+
+
+
@@ -315,6 +328,25 @@ const handleClick = () => {
overflow: hidden;
}
+.difficulty-badge__unlock-progress {
+ position: absolute;
+ top: calc(100% + 30rpx);
+ left: 50%;
+ width: 120rpx;
+ height: 10rpx;
+ overflow: hidden;
+ border-radius: 6rpx;
+ background: rgba(0, 0, 0, 0.6);
+ transform: translateX(-50%);
+ pointer-events: none;
+}
+
+.difficulty-badge__unlock-progress-completed {
+ height: 100%;
+ border-radius: 6rpx;
+ background: rgba(255, 217, 71, 1);
+}
+
@keyframes badge-orbit-spin {
from {
transform: translate(-50%, -50%) rotate(0deg);
diff --git a/src/pages/training/difficulty.vue b/src/pages/training/difficulty.vue
index 6320012..51920e7 100644
--- a/src/pages/training/difficulty.vue
+++ b/src/pages/training/difficulty.vue
@@ -83,10 +83,6 @@ const checkDifficultyCompleted = (item = {}) => {
return Boolean(item.completed) || (promoteCnt > 0 && completedCnt >= promoteCnt);
};
-const getDifficultyModeText = (mode) => {
- return Number(mode) === 1 ? "随机区域+指定环数" : "随机区域命中";
-};
-
const createEmptyModeConfig = (type = defaultTrainingType) => {
const meta = trainingTypeMetaMap[type] || trainingTypeMetaMap[defaultTrainingType];
@@ -107,14 +103,12 @@ const createDifficultySummary = (item = {}) => {
const timeLimit = toNumber(item.time_limit);
const hitReq = toNumber(item.hit_req);
const totalReq = toNumber(item.total_req);
- const promoteCnt = toNumber(item.promote_cnt);
const shootingTimeText =
timeLimit > 0 ? `在${timeLimit}秒内进行射箭` : "不限时进行射箭";
const enduranceTimeText =
timeLimit > 0
? `在${timeLimit}秒内完成${arrows}箭`
: `不限时完成${arrows}箭`;
- const promoteText = promoteCnt > 0 ? `完成${promoteCnt}次晋级` : "";
const summaryMap = {
base: [
@@ -130,15 +124,10 @@ const createDifficultySummary = (item = {}) => {
`需要有${arrows}箭命中高亮区域`,
],
rhythm: [
- desc || `间隔${timeLimit}秒射击`,
- [
- `${arrows}箭`,
- hitReq > 0 ? `每箭${hitReq}环以上` : "上靶即可",
- getDifficultyModeText(item.mode),
- promoteText,
- ]
- .filter(Boolean)
- .join(" · "),
+ arrows > 0
+ ? `需要在指定时间节点射出${arrows}射箭`
+ : "需要在指定时间节点射箭",
+ hitReq > 0 ? `且每箭命中${hitReq}环内` : "且每箭命中指定区域",
],
};
@@ -803,6 +792,7 @@ onShow(() => {
:node="node"
:active="node.id === selectedDifficultyId"
:locked="checkDifficultyLocked(node)"
+ :showUnlockProgress="node.id === unlockedDifficultyId"
:completedProgress="getCompletedDifficultyProgress(node)"
@click="handleSelectDifficulty"
/>
diff --git a/src/pages/training/index.vue b/src/pages/training/index.vue
index 50f7e4b..0c1532c 100644
--- a/src/pages/training/index.vue
+++ b/src/pages/training/index.vue
@@ -17,7 +17,7 @@ const trainingModeRouteMap = {
rhythm: "rhythm",
strength: "power",
};
-const unavailableTrainingIds = new Set(["rhythm", "strength"]);
+const unavailableTrainingIds = new Set(["strength"]);
// 训练项目卡片右侧主图标。
const trainingModeIconMap = {
base_bow:
@@ -27,7 +27,7 @@ const trainingModeIconMap = {
"https://static.shelingxingqiu.com/shootmini/static/training-home/img_5.png",
wave: "https://static.shelingxingqiu.com/shootmini/static/training-home/img_6.png",
muscle:
- "https://static.shelingxingqiu.com/shootmini/static/training-home/img_6.png",
+ "https://static.shelingxingqiu.com/shootmini/static/training-home/img_7.png",
};
// 训练项目卡片标题图,按接口 id 映射 CDN 资源。
const trainingModeTitleImageMap = {
@@ -40,7 +40,7 @@ const trainingModeTitleImageMap = {
rhythm:
"https://static.shelingxingqiu.com/shootmini/static/training-home/jiezouxunlian.png",
strength:
- "https://static.shelingxingqiu.com/shootmini/static/training-home/liliangxulian.png",
+ "https://static.shelingxingqiu.com/shootmini/static/training-home/wendingxunlian.png",
};
const defaultWeekDays = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"];
const defaultRadarDimensions = [
@@ -743,7 +743,7 @@ onShow(async () => {
.radar-section {
position: relative;
- padding-top: 34rpx;
+ padding-top: 30rpx;
}
.record-bubble {
@@ -863,8 +863,8 @@ onShow(async () => {
.featured-card {
position: relative;
width: 100%;
- height: 150rpx;
- margin-top: 70rpx;
+ height: 130rpx;
+ margin-top: 38rpx;
border-radius: 16rpx;
overflow: hidden;
}
@@ -878,13 +878,13 @@ onShow(async () => {
left: 0;
top: 0;
width: 278rpx;
- height: 150rpx;
+ height: 130rpx;
}
.featured-card-copy {
position: absolute;
left: 174rpx;
- top: 58rpx;
+ top: 60rpx;
display: flex;
flex-direction: column;
}
@@ -900,10 +900,9 @@ onShow(async () => {
.featured-card-subtitle {
display: block;
- margin-top: 10rpx;
color: #895409;
- font-size: 22rpx;
- line-height: 32rpx;
+ font-size: 20rpx;
+ line-height: 28rpx;
}
.mode-grid {
@@ -915,7 +914,7 @@ onShow(async () => {
.mode-card {
position: relative;
- height: 150rpx;
+ height: 130rpx;
box-shadow: inset 2rpx 2rpx 6rpx 0rpx rgba(255, 255, 255, 0.27);
border-radius: 16rpx;
border: 2rpx solid rgba(235, 184, 123, 0.5);
@@ -928,8 +927,8 @@ onShow(async () => {
left: 0;
top: 0;
width: 72rpx;
- height: 34rpx;
- line-height: 34rpx;
+ height: 28rpx;
+ line-height: 28rpx;
text-align: center;
font-size: 20rpx;
color: #000;
@@ -940,7 +939,7 @@ onShow(async () => {
.mode-card-copy {
position: absolute;
left: 30rpx;
- top: 40rpx;
+ top: 32rpx;
}
.mode-card-title {
@@ -968,16 +967,16 @@ onShow(async () => {
display: block;
margin-top: 14rpx;
color: #fcce96;
- font-size: 22rpx;
- line-height: 32rpx;
+ font-size: 20rpx;
+ line-height: 28rpx;
opacity: 0.5;
}
.mode-card-icon {
position: absolute;
- right: 12rpx;
- top: 14rpx;
- width: 124rpx;
- height: 124rpx;
+ right: 18rpx;
+ top: 8rpx;
+ width: 116rpx;
+ height: 116rpx;
}
diff --git a/src/static/training-home/img_22.png b/src/static/training-home/img_22.png
index 4d9d63f19cfa1098e48a4e877fb56ebba69354ab..51fa7690e75efa12e7523e40f7201cad9453346a 100644
GIT binary patch
literal 25545
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