|
@@ -18,7 +18,10 @@
|
|
|
<view class="task-list" v-if="activeTab === 'pending'">
|
|
<view class="task-list" v-if="activeTab === 'pending'">
|
|
|
<view class="task-item assigned" v-for="task in pendingTasks" :key="task.id">
|
|
<view class="task-item assigned" v-for="task in pendingTasks" :key="task.id">
|
|
|
<view class="task-left">
|
|
<view class="task-left">
|
|
|
- <view class="task-title">{{ task.title }}</view>
|
|
|
|
|
|
|
+ <view class="task-title">
|
|
|
|
|
+ {{ task.title }}
|
|
|
|
|
+ <text v-if="task.memberOnly === 1" class="member-badge">会员任务</text>
|
|
|
|
|
+ </view>
|
|
|
<view class="task-meta">
|
|
<view class="task-meta">
|
|
|
<text class="points">+{{ task.points }}分</text>
|
|
<text class="points">+{{ task.points }}分</text>
|
|
|
<text class="creator">创建人:{{ task.creatorName || '家人' }}</text>
|
|
<text class="creator">创建人:{{ task.creatorName || '家人' }}</text>
|
|
@@ -26,7 +29,7 @@
|
|
|
</view>
|
|
</view>
|
|
|
</view>
|
|
</view>
|
|
|
<view class="task-actions">
|
|
<view class="task-actions">
|
|
|
- <button class="btn-accept" @click="acceptTask(task.id)">接受</button>
|
|
|
|
|
|
|
+ <button class="btn-accept" @click="acceptTask(task)">接受</button>
|
|
|
<button class="btn-reject" @click="showRejectModal(task)">拒绝</button>
|
|
<button class="btn-reject" @click="showRejectModal(task)">拒绝</button>
|
|
|
</view>
|
|
</view>
|
|
|
</view>
|
|
</view>
|
|
@@ -41,6 +44,7 @@
|
|
|
<view class="task-left">
|
|
<view class="task-left">
|
|
|
<view class="task-title">
|
|
<view class="task-title">
|
|
|
{{ task.title }}
|
|
{{ task.title }}
|
|
|
|
|
+ <text v-if="task.memberOnly === 1" class="member-badge">会员任务</text>
|
|
|
<text v-if="task.category === '小游戏类'" class="minigame-badge">🎮</text>
|
|
<text v-if="task.category === '小游戏类'" class="minigame-badge">🎮</text>
|
|
|
</view>
|
|
</view>
|
|
|
<view class="task-meta">
|
|
<view class="task-meta">
|
|
@@ -49,7 +53,7 @@
|
|
|
</view>
|
|
</view>
|
|
|
</view>
|
|
</view>
|
|
|
<view class="task-right" v-if="task.status === 'pending'">
|
|
<view class="task-right" v-if="task.status === 'pending'">
|
|
|
- <button class="btn-complete" @click="completeTask(task.id)">完成</button>
|
|
|
|
|
|
|
+ <button class="btn-complete" @click="completeTask(task)">完成</button>
|
|
|
</view>
|
|
</view>
|
|
|
<view class="completed-badge" v-else>已完成</view>
|
|
<view class="completed-badge" v-else>已完成</view>
|
|
|
</view>
|
|
</view>
|
|
@@ -62,7 +66,10 @@
|
|
|
<view class="task-list" v-if="activeTab === 'created'">
|
|
<view class="task-list" v-if="activeTab === 'created'">
|
|
|
<view class="task-item" v-for="task in createdTasks" :key="task.id">
|
|
<view class="task-item" v-for="task in createdTasks" :key="task.id">
|
|
|
<view class="task-left">
|
|
<view class="task-left">
|
|
|
- <view class="task-title">{{ task.title }}</view>
|
|
|
|
|
|
|
+ <view class="task-title">
|
|
|
|
|
+ {{ task.title }}
|
|
|
|
|
+ <text v-if="task.memberOnly === 1" class="member-badge">会员任务</text>
|
|
|
|
|
+ </view>
|
|
|
<view class="task-meta">
|
|
<view class="task-meta">
|
|
|
<text class="points">+{{ task.points }}分</text>
|
|
<text class="points">+{{ task.points }}分</text>
|
|
|
<text class="assignee">{{ task.executorName || '未分配' }}</text>
|
|
<text class="assignee">{{ task.executorName || '未分配' }}</text>
|
|
@@ -148,7 +155,7 @@
|
|
|
</template>
|
|
</template>
|
|
|
|
|
|
|
|
<script>
|
|
<script>
|
|
|
-import { getMyPendingTasks, acceptTask as acceptTaskApi, rejectTask as rejectTaskApi, getTodayTasks, completeTask as completeTaskApi, createTask as createTaskApi, getVisibleFamilyMembers } from '../../utils/api.js'
|
|
|
|
|
|
|
+import { getMyPendingTasks, acceptTask as acceptTaskApi, rejectTask as rejectTaskApi, getTodayTasks, completeTask as completeTaskApi, createTask as createTaskApi, getVisibleFamilyMembers, getMyMembership } from '../../utils/api.js'
|
|
|
import { parseDate } from '../../utils/format.js'
|
|
import { parseDate } from '../../utils/format.js'
|
|
|
|
|
|
|
|
export default {
|
|
export default {
|
|
@@ -160,6 +167,7 @@ export default {
|
|
|
todayTasks: [],
|
|
todayTasks: [],
|
|
|
createdTasks: [],
|
|
createdTasks: [],
|
|
|
isParent: false,
|
|
isParent: false,
|
|
|
|
|
+ isMember: false,
|
|
|
currentMemberId: null,
|
|
currentMemberId: null,
|
|
|
currentUserId: null,
|
|
currentUserId: null,
|
|
|
familyMembers: [],
|
|
familyMembers: [],
|
|
@@ -182,9 +190,16 @@ export default {
|
|
|
this.isParent = role === 'parent'
|
|
this.isParent = role === 'parent'
|
|
|
this.currentUserId = uni.getStorageSync('userId')
|
|
this.currentUserId = uni.getStorageSync('userId')
|
|
|
this.currentMemberId = uni.getStorageSync('currentChildId') || this.currentUserId
|
|
this.currentMemberId = uni.getStorageSync('currentChildId') || this.currentUserId
|
|
|
|
|
+ this.checkMembership()
|
|
|
this.loadInitialData()
|
|
this.loadInitialData()
|
|
|
},
|
|
},
|
|
|
methods: {
|
|
methods: {
|
|
|
|
|
+ checkMembership() {
|
|
|
|
|
+ getMyMembership().then(res => {
|
|
|
|
|
+ const m = res.data || {}
|
|
|
|
|
+ this.isMember = !!(m.levelCode && m.levelCode !== 'FREE')
|
|
|
|
|
+ }).catch(() => {})
|
|
|
|
|
+ },
|
|
|
switchTab(tab) {
|
|
switchTab(tab) {
|
|
|
this.activeTab = tab
|
|
this.activeTab = tab
|
|
|
if (tab === 'pending') this.loadPendingTasks()
|
|
if (tab === 'pending') this.loadPendingTasks()
|
|
@@ -229,18 +244,44 @@ export default {
|
|
|
console.error('加载创建的任务失败', e)
|
|
console.error('加载创建的任务失败', e)
|
|
|
}
|
|
}
|
|
|
},
|
|
},
|
|
|
- async completeTask(taskId) {
|
|
|
|
|
|
|
+ async completeTask(task) {
|
|
|
|
|
+ if (task.memberOnly === 1 && !this.isMember) {
|
|
|
|
|
+ uni.showModal({
|
|
|
|
|
+ title: '会员任务',
|
|
|
|
|
+ content: '该任务是会员专属任务,开通会员后即可完成',
|
|
|
|
|
+ confirmText: '去开通',
|
|
|
|
|
+ success: (res) => {
|
|
|
|
|
+ if (res.confirm) {
|
|
|
|
|
+ uni.navigateTo({ url: '/pages/membership/index' })
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ })
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
try {
|
|
try {
|
|
|
- const res = await completeTaskApi(taskId, this.currentMemberId, '')
|
|
|
|
|
|
|
+ const res = await completeTaskApi(task.id, this.currentMemberId, '')
|
|
|
uni.showToast({ title: `获得 ${res.data.pointsEarned} 积分`, icon: 'success' })
|
|
uni.showToast({ title: `获得 ${res.data.pointsEarned} 积分`, icon: 'success' })
|
|
|
this.loadTodayTasks()
|
|
this.loadTodayTasks()
|
|
|
} catch (e) {
|
|
} catch (e) {
|
|
|
console.error('完成任务失败', e)
|
|
console.error('完成任务失败', e)
|
|
|
}
|
|
}
|
|
|
},
|
|
},
|
|
|
- acceptTask(taskId) {
|
|
|
|
|
|
|
+ acceptTask(task) {
|
|
|
|
|
+ if (task.memberOnly === 1 && !this.isMember) {
|
|
|
|
|
+ uni.showModal({
|
|
|
|
|
+ title: '会员任务',
|
|
|
|
|
+ content: '该任务是会员专属任务,开通会员后即可接受',
|
|
|
|
|
+ confirmText: '去开通',
|
|
|
|
|
+ success: (res) => {
|
|
|
|
|
+ if (res.confirm) {
|
|
|
|
|
+ uni.navigateTo({ url: '/pages/membership/index' })
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ })
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
uni.showLoading({ title: '接受中...' })
|
|
uni.showLoading({ title: '接受中...' })
|
|
|
- acceptTaskApi(taskId, this.currentMemberId).then(res => {
|
|
|
|
|
|
|
+ acceptTaskApi(task.id, this.currentMemberId).then(res => {
|
|
|
uni.hideLoading()
|
|
uni.hideLoading()
|
|
|
if (res.data) {
|
|
if (res.data) {
|
|
|
uni.showToast({ title: '已接受任务', icon: 'success' })
|
|
uni.showToast({ title: '已接受任务', icon: 'success' })
|
|
@@ -520,6 +561,18 @@ export default {
|
|
|
margin-left: 10rpx;
|
|
margin-left: 10rpx;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+.member-badge {
|
|
|
|
|
+ display: inline-block;
|
|
|
|
|
+ font-size: 20rpx;
|
|
|
|
|
+ color: #B45309;
|
|
|
|
|
+ background: #FEF3C7;
|
|
|
|
|
+ border: 1rpx solid #F59E0B;
|
|
|
|
|
+ border-radius: 8rpx;
|
|
|
|
|
+ padding: 2rpx 12rpx;
|
|
|
|
|
+ margin-left: 12rpx;
|
|
|
|
|
+ vertical-align: middle;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
.empty {
|
|
.empty {
|
|
|
text-align: center;
|
|
text-align: center;
|
|
|
color: #999;
|
|
color: #999;
|