|
|
@@ -200,6 +200,14 @@
|
|
|
{{ item.done ? '✔' : (item.actionText || '去记录') }}
|
|
|
</text>
|
|
|
</view>
|
|
|
+ <!-- 更多任务:作为卡片出现在记账打卡之后,点击进入任务列表 -->
|
|
|
+ <view class="progress-tile progress-tile-more" @click="goToTasks">
|
|
|
+ <view class="progress-tile-icon-wrap">
|
|
|
+ <text class="progress-tile-icon">📋</text>
|
|
|
+ </view>
|
|
|
+ <text class="progress-tile-label">更多任务</text>
|
|
|
+ <text class="progress-tile-status status-more">去查看 ›</text>
|
|
|
+ </view>
|
|
|
</view>
|
|
|
<view class="streak-footer" v-if="streakDays > 0">
|
|
|
<text class="streak-badge">🔥 连续打卡 {{ streakDays }} 天</text>
|
|
|
@@ -221,28 +229,6 @@
|
|
|
</view>
|
|
|
</view>
|
|
|
|
|
|
- <!-- 任务中心(内联) -->
|
|
|
- <view class="section" v-if="recentTasks.length > 0">
|
|
|
- <view class="task-preview-card">
|
|
|
- <view class="task-preview-header">
|
|
|
- <text class="task-preview-title">📋 今日任务</text>
|
|
|
- <text class="task-preview-more" @click="goToTasks">更多 ›</text>
|
|
|
- </view>
|
|
|
- <view class="task-preview-list">
|
|
|
- <view class="task-preview-item" v-for="(task, idx) in recentTasks" :key="getTaskKey(task, idx)" @click="goToTasks">
|
|
|
- <view class="task-preview-left">
|
|
|
- <text class="task-preview-name">{{ task.title }}</text>
|
|
|
- <view class="task-preview-meta">
|
|
|
- <text class="task-preview-points">+{{ task.points }}CF</text>
|
|
|
- <text class="task-preview-deadline" v-if="task.deadline">⏱ {{ formatTaskTime(task.deadline) }}</text>
|
|
|
- </view>
|
|
|
- </view>
|
|
|
- <text class="task-preview-arrow">›</text>
|
|
|
- </view>
|
|
|
- </view>
|
|
|
- </view>
|
|
|
- </view>
|
|
|
-
|
|
|
<DimensionActivities :isLoggedIn="true" @activityClick="goActivityDetail" @moreActivities="goMoreActivities" style="margin-bottom:60rpx" />
|
|
|
|
|
|
<!-- 推荐阅读 -->
|
|
|
@@ -280,7 +266,7 @@ import shareMixin from '../../components/share-mixin.js'
|
|
|
export default {
|
|
|
mixins: [fontScaleMixin, shareMixin],
|
|
|
components: { LoginGuideCard, DimensionActivities, DimensionProducts, ArticleFeed },
|
|
|
- data() { return { memberId: '', todayDate: '', hasIncomplete: false, incompleteCount: 0, progressItems: [], recentTasks: [], todayTaskList: [], streakDays: 0, activeChallenges: 0, completeness: 0,
|
|
|
+ data() { return { memberId: '', todayDate: '', hasIncomplete: false, incompleteCount: 0, progressItems: [], todayTaskList: [], streakDays: 0, activeChallenges: 0, completeness: 0,
|
|
|
healthArticles: [],
|
|
|
growthArticles: [],
|
|
|
isLoggedIn: false } },
|
|
|
@@ -326,14 +312,7 @@ export default {
|
|
|
}
|
|
|
if (url) uni.navigateTo({ url: url })
|
|
|
},
|
|
|
- getTaskKey: function(task, idx) { return (task && task.id) ? ('t' + task.id) : ('tk' + idx) },
|
|
|
- formatTaskTime: function(dateVal) {
|
|
|
- if (!dateVal) return ''
|
|
|
- var d = parseDate(dateVal)
|
|
|
- if (!d) return ''
|
|
|
- return (d.getMonth() + 1) + '/' + d.getDate() + ' ' + this.pad(d.getHours()) + ':' + this.pad(d.getMinutes())
|
|
|
- },
|
|
|
- /** 当日任务统一取数入口:一次请求供"今日成长打卡联动 taskId"与"今日任务预览"共用,避免同页重复调用 /api/tasks/today */
|
|
|
+ /** 当日任务统一取数入口:一次请求供"今日成长打卡联动 taskId"使用,避免同页重复调用 /api/tasks/today */
|
|
|
async fetchTodayTasks() {
|
|
|
var self = this
|
|
|
try {
|
|
|
@@ -351,16 +330,9 @@ export default {
|
|
|
}
|
|
|
return null
|
|
|
},
|
|
|
- async loadRecentTasks() {
|
|
|
- var self = this
|
|
|
- try {
|
|
|
- if (!self.todayTaskList) await self.fetchTodayTasks()
|
|
|
- self.recentTasks = (self.todayTaskList || []).slice(0, 3)
|
|
|
- } catch(e) {}
|
|
|
- },
|
|
|
goActivityDetail: function(act) { uni.navigateTo({ url: '/pages/activity/activity-detail/activity-detail?id=' + act.id }) },
|
|
|
goMoreActivities: function() { uni.navigateTo({ url: '/pages/activity/index' }) },
|
|
|
- goToTasks: function() { uni.navigateTo({ url: '/pages/child/tasks' }) },
|
|
|
+ goToTasks: function() { uni.navigateTo({ url: '/pages/tasks/tasks' }) },
|
|
|
handleGuestFeatureTap: function() { uni.showToast({ title: '登录后即可体验该功能', icon: 'none' }) },
|
|
|
goToFoods: function() {
|
|
|
var mid = uni.getStorageSync('currentChildId') || uni.getStorageSync('currentMemberId') || ''
|
|
|
@@ -407,7 +379,6 @@ export default {
|
|
|
async loadAllData() {
|
|
|
var self = this
|
|
|
try { await self.loadProgressItems() } catch(e) {}
|
|
|
- try { await self.loadRecentTasks() } catch(e) {}
|
|
|
try { await self.loadGrowthRecommendations() } catch(e) {}
|
|
|
try { await self.loadMilestones() } catch(e) {}
|
|
|
},
|
|
|
@@ -937,6 +908,17 @@ $c-danger-ink: $status-danger-deep;
|
|
|
background: $facade-fill-2;
|
|
|
color: $facade-text-muted;
|
|
|
}
|
|
|
+.progress-tile-more {
|
|
|
+ background: $facade-brand-tint;
|
|
|
+ border: 2rpx solid rgba($brand-primary, 0.28);
|
|
|
+}
|
|
|
+.progress-tile-more:active { opacity: 0.82; transform: scale(0.96); }
|
|
|
+.progress-tile-more .progress-tile-icon-wrap { background: rgba($brand-primary, 0.12); }
|
|
|
+.progress-tile-more .progress-tile-label { color: $brand-primary; }
|
|
|
+.status-more {
|
|
|
+ background: $brand-primary;
|
|
|
+ color: $uni-surface;
|
|
|
+}
|
|
|
.streak-footer {
|
|
|
margin-top: 18rpx;
|
|
|
padding-top: 16rpx;
|
|
|
@@ -992,64 +974,6 @@ $c-danger-ink: $status-danger-deep;
|
|
|
}
|
|
|
.action-arrow { font-size: calc(32rpx * var(--font-scale, 1)); color: $facade-text-ghost; flex-shrink: 0; margin-left: 12rpx; }
|
|
|
|
|
|
-// ---- 任务预览 ----
|
|
|
-.task-preview-card {
|
|
|
- background: $app-surface;
|
|
|
- border-radius: 24rpx;
|
|
|
- padding: 24rpx 28rpx;
|
|
|
- box-shadow: 0 4rpx 24rpx rgba(0,0,0,0.06);
|
|
|
-}
|
|
|
-.task-preview-header {
|
|
|
- display: flex;
|
|
|
- justify-content: space-between;
|
|
|
- align-items: center;
|
|
|
- margin-bottom: 16rpx;
|
|
|
-}
|
|
|
-.task-preview-title {
|
|
|
- font-size: calc(28rpx * var(--font-scale, 1));
|
|
|
- font-weight: 700;
|
|
|
- color: $facade-text-strong;
|
|
|
-}
|
|
|
-.task-preview-more {
|
|
|
- font-size: calc(24rpx * var(--font-scale, 1));
|
|
|
- color: $brand-primary;
|
|
|
-}
|
|
|
-.task-preview-list { display: flex; flex-direction: column; }
|
|
|
-.task-preview-item {
|
|
|
- display: flex;
|
|
|
- align-items: center;
|
|
|
- padding: 16rpx 0;
|
|
|
- border-bottom: 1rpx solid $facade-fill-2;
|
|
|
-}
|
|
|
-.task-preview-item:last-child { border-bottom: none; }
|
|
|
-.task-preview-left { flex: 1; min-width: 0; }
|
|
|
-.task-preview-name {
|
|
|
- font-size: calc(26rpx * var(--font-scale, 1));
|
|
|
- color: $facade-text-strong;
|
|
|
- display: block;
|
|
|
- white-space: nowrap;
|
|
|
- overflow: hidden;
|
|
|
- text-overflow: ellipsis;
|
|
|
-}
|
|
|
-.task-preview-meta {
|
|
|
- display: flex;
|
|
|
- align-items: center;
|
|
|
- gap: 12rpx;
|
|
|
- margin-top: 6rpx;
|
|
|
-}
|
|
|
-.task-preview-points {
|
|
|
- font-size: calc(22rpx * var(--font-scale, 1));
|
|
|
- color: $brand-primary;
|
|
|
- font-weight: 700;
|
|
|
-}
|
|
|
-.task-preview-deadline { font-size: calc(20rpx * var(--font-scale, 1)); color: $facade-text-muted; }
|
|
|
-.task-preview-arrow {
|
|
|
- font-size: calc(28rpx * var(--font-scale, 1));
|
|
|
- color: $facade-text-ghost;
|
|
|
- flex-shrink: 0;
|
|
|
- margin-left: 12rpx;
|
|
|
-}
|
|
|
-
|
|
|
// ---- 通用 section-header ----
|
|
|
.section-header {
|
|
|
display: flex;
|