text.vue 3.33 KB
<template>
    <div class="checkin-upload-text p-4">
        <div class="title text-center pb-4 font-bold">{{ route.meta.title }}</div>

        <!-- 文字输入区域 -->
        <div class="mb-4 border">
            <van-field
                v-model="message"
                rows="8"
                autosize
                type="textarea"
                placeholder="请输入打卡内容, 至少需要10个字符"
                maxlength="500"
                show-word-limit
            />
        </div>

        <!-- 提交按钮 -->
        <div class="fixed bottom-0 left-0 right-0 p-4 bg-white">
            <van-button
                type="primary"
                block
                :loading="uploading"
                :disabled="!canSubmit"
                @click="onSubmit"
            >
                提交
            </van-button>
        </div>
    </div>
</template>

<script setup>
import { ref, computed, onMounted } from 'vue'
import { useRoute, useRouter } from 'vue-router'
import { showToast, showLoadingToast } from 'vant'
import { addUploadTaskAPI, getUploadTaskInfoAPI, editUploadTaskInfoAPI } from "@/api/checkin";
import { useTitle } from '@vueuse/core';

const route = useRoute()
const router = useRouter()
useTitle(route.meta.title);

// 留言内容
const message = ref('')
// 上传状态
const uploading = ref(false)

/**
 * 是否可以提交
 */
const canSubmit = computed(() => {
    return message.value.trim() !== '' && message.value.trim().length >= 10
})

/**
 * 提交表单
 */
const onSubmit = async () => {
    if (uploading.value) return

    if (message.value.trim().length < 10) {
        showToast('打卡内容至少需要10个字符')
        return
    }

    uploading.value = true
    const toast = showLoadingToast({
        message: '提交中...',
        forbidClick: true,
    })

    try {
        if (route.query.status === 'edit') {
            // 编辑打卡接口
            const { code, data } = await editUploadTaskInfoAPI({
                i: route.query.post_id,
                note: message.value,
                meta_id: [], // 文本类型不需要文件
                file_type: route.query.type,
            });
            if (code) {
                showToast('提交成功')
                router.back()
            }
        } else {
            // 新增打卡接口
            const { code, data } = await addUploadTaskAPI({
                task_id: route.query.id,
                note: message.value,
                meta_id: [], // 文本类型不需要文件
                file_type: route.query.type,
            });
            if (code) {
                showToast('提交成功')
                router.back()
            }
        }
    } catch (error) {
        showToast('提交失败,请重试')
    } finally {
        uploading.value = false
    }
}

/**
 * 页面挂载时的初始化逻辑
 */
onMounted(async () => {
    if (route.query.status === 'edit') {
        const { code, data } = await getUploadTaskInfoAPI({ i: route.query.post_id });
        if (code) {
            message.value = data.note
        }
    }
})
</script>

<style lang="less" scoped>
.checkin-upload-text {
    min-height: 100vh;
    padding-bottom: 80px;
}

.van-field {
    border-radius: 8px;
    background-color: #f8f9fa;
}

.van-field__control {
    font-size: 16px;
    line-height: 1.5;
}
</style>