hookehuyr

feat(打卡): 完善打卡功能逻辑和UI显示

- 在CheckInDialog组件中新增check-in-data事件用于传递打卡数据
- 优化打卡类型选择逻辑,增加task_type条件判断
- 仅在ProfilePage和HomePage有打卡数据时显示打卡相关UI
- 更新视频封面默认图片和音频标题显示逻辑
- 仅显示用户自己的打卡帖子的编辑删除按钮
......@@ -88,7 +88,7 @@ const props = defineProps({
}
})
const emit = defineEmits(['update:show', 'check-in-success'])
const emit = defineEmits(['update:show', 'check-in-success', 'check-in-data'])
const selectedCheckIn = ref(null)
const checkInContent = ref('')
......@@ -96,7 +96,7 @@ const isCheckingIn = ref(false)
const checkInSuccess = ref(false)
const handleCheckInSelect = (type) => {
if (type.is_gray) {
if (type.is_gray && type.task_type === 'checkin') {
showToast('您已经完成了今天的打卡')
return
}
......@@ -154,6 +154,7 @@ onMounted(async () => {
// 获取签到列表
const task = await getTaskListAPI()
if (task.code) {
emit('check-in-data', task.data)
task.data.forEach(item => {
checkInTypes.value.push({
id: item.id,
......
<!--
* @Date: 2025-03-20 19:55:21
* @LastEditors: hookehuyr hookehuyr@gmail.com
* @LastEditTime: 2025-06-06 15:16:49
* @LastEditTime: 2025-06-06 17:26:39
* @FilePath: /mlaj/src/views/HomePage.vue
* @Description: 美乐爱觉教育首页组件
*
......@@ -74,7 +74,7 @@
</FrostedGlass>
<!-- Daily Check-in -->
<FrostedGlass class="p-4 rounded-xl">
<FrostedGlass v-if="checkInTypes.length" class="p-4 rounded-xl">
<div class="flex justify-between items-center mb-3">
<h3 class="font-medium">今日打卡</h3>
<router-link to="/profile" class="text-green-600 text-sm">打卡记录</router-link>
......@@ -668,7 +668,7 @@ const scrollToSlide = (index) => {
// 打卡功能:处理打卡类型选择
const handleCheckInSelect = (checkInType) => {
if (checkInType.is_gray) {
if (checkInType.is_gray && checkInType.task_type === 'checkin') {
showToast('您已经完成了今天的打卡')
return
}
......
<!--
* @Date: 2025-05-29 15:34:17
* @LastEditors: hookehuyr hookehuyr@gmail.com
* @LastEditTime: 2025-06-06 17:07:25
* @LastEditTime: 2025-06-06 17:32:28
* @FilePath: /mlaj/src/views/checkin/IndexCheckInPage.vue
* @Description: 文件描述
-->
......@@ -81,7 +81,7 @@
</div>
</van-col>
<van-col span="3">
<div class="post-menu">
<div v-if="post.is_my" class="post-menu">
<van-icon name="edit" @click="editCheckin()" />
<van-icon name="delete-o" @click="delCheckin()" />
</div>
......@@ -99,7 +99,7 @@
<div v-for="(v, idx) in post.videoList" :key="idx">
<!-- 视频封面和播放按钮 -->
<div v-if="v.video && !v.isPlaying" class="relative w-full rounded-lg overflow-hidden" style="aspect-ratio: 16/9; margin-bottom: 1rem;">
<img :src="v.videoCover || 'https://cdn.ipadbiz.cn/mlaj/images/cover_video_1.png'"
<img :src="v.videoCover || 'https://cdn.ipadbiz.cn/mlaj/images/cover_video_2.png'"
:alt="v.content" class="w-full h-full object-cover" />
<div class="absolute inset-0 flex items-center justify-center cursor-pointer bg-black/20"
@click="startPlay(v)">
......@@ -617,7 +617,7 @@ onMounted(async () => {
} else if (item.file_type === 'audio') {
audio = item.files.map(file => {
return {
title: file.title ? file.title : '打卡音频',
title: file.name ? file.name : '打卡音频',
artist: file.artist ? file.artist : '',
url: file.value,
cover: file.cover ? file.cover : '',
......
......@@ -55,7 +55,7 @@
</div>
<div class="text-xs text-gray-500 mt-1">最长连续</div>
</div>
<div>
<div v-if="checkinData.length">
<div @click="showCheckInDialog = true" class="cursor-pointer">
<button
class="bg-gradient-to-r from-green-500 to-green-600 text-white py-2 px-6 rounded-full text-sm shadow-sm"
......@@ -114,6 +114,7 @@
<CheckInDialog
v-model:show="showCheckInDialog"
@check-in-success="handleCheckInSuccess"
@check-in-data="handleCheckInData"
/>
</template>
......@@ -155,6 +156,11 @@ const handleCheckInSuccess = () => {
);
};
const checkinData = ref([]);
const handleCheckInData = (data) => {
checkinData.value = data;
}
// Handle logout
const { logout } = useAuth();
const handleLogout = () => {
......