Layout.vue 2.63 KB
Newer Older
LiangLiu's avatar
LiangLiu committed
1
2
3
4
5
6
7
8
<script setup>
import TopBar from '../components/TopBar.vue'
import LeftBar from '../components/LeftBar.vue'
import Alert from '../components/Alert.vue'
import Confirm from '../components/Confirm.vue'
import TaskDetails from '../components/TaskDetails.vue'
import TemplateDetails from '../components/TemplateDetails.vue'
import PromptTemplate from '../components/PromptTemplate.vue'
LiangLiu's avatar
LiangLiu committed
9
10
import Voice_tts from '../components/Voice_tts.vue'
import MediaTemplate from '../components/MediaTemplate.vue'
LiangLiu's avatar
LiangLiu committed
11
import Loading from '../components/Loading.vue'
LiangLiu's avatar
LiangLiu committed
12
import SiteFooter from '../components/SiteFooter.vue'
LiangLiu's avatar
LiangLiu committed
13
import { useI18n } from 'vue-i18n'
LiangLiu's avatar
LiangLiu committed
14
import { isLoading, showVoiceTTSModal, handleAudioUpload, showAlert } from '../utils/other'
LiangLiu's avatar
LiangLiu committed
15

LiangLiu's avatar
LiangLiu committed
16
const { t } = useI18n()
LiangLiu's avatar
LiangLiu committed
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40

// 处理 TTS 完成回调
const handleTTSComplete = (audioBlob) => {
    // 创建File对象
    const audioFile = new File([audioBlob], 'tts_audio.mp3', { type: 'audio/mpeg' })

    // 模拟文件上传事件
    const dataTransfer = new DataTransfer()
    dataTransfer.items.add(audioFile)
    const fileList = dataTransfer.files

    const event = {
        target: {
            files: fileList
        }
    }

    // 处理音频上传
    handleAudioUpload(event)

    // 关闭模态框
    showVoiceTTSModal.value = false

    // 显示成功提示
41
    showAlert(t('ttsCompleted'), 'success')
LiangLiu's avatar
LiangLiu committed
42
}
LiangLiu's avatar
LiangLiu committed
43
</script>
LiangLiu's avatar
LiangLiu committed
44

LiangLiu's avatar
LiangLiu committed
45
<template>
LiangLiu's avatar
LiangLiu committed
46
  <!-- 主容器 - Apple 极简风格 - 配合80%缩放铺满屏幕 -->
LiangLiu's avatar
LiangLiu committed
47
  <div class="bg-[#f5f5f7] dark:bg-[#000000] transition-colors duration-300 w-full h-full overflow-y-auto main-scrollbar">
LiangLiu's avatar
LiangLiu committed
48
    <!-- 主内容区域 -->
LiangLiu's avatar
LiangLiu committed
49
    <div class="flex flex-col w-full min-h-full">
LiangLiu's avatar
LiangLiu committed
50
51
      <!-- 顶部导航栏 -->
      <TopBar />
LiangLiu's avatar
LiangLiu committed
52

LiangLiu's avatar
LiangLiu committed
53
      <!-- 内容区域 - 响应式布局 -->
LiangLiu's avatar
LiangLiu committed
54
      <div class="flex flex-col sm:flex-row flex-1">
LiangLiu's avatar
LiangLiu committed
55
56
        <!-- 左侧/底部导航栏 - 响应式 -->
        <LeftBar />
LiangLiu's avatar
LiangLiu committed
57

LiangLiu's avatar
LiangLiu committed
58
        <!-- 路由视图内容 -->
LiangLiu's avatar
LiangLiu committed
59
        <div class="flex-1 pb-16 sm:pb-20">
LiangLiu's avatar
LiangLiu committed
60
61
62
          <router-view></router-view>
        </div>
      </div>
LiangLiu's avatar
LiangLiu committed
63
64

      <SiteFooter />
LiangLiu's avatar
LiangLiu committed
65
66
67
68
69
70
71
72
    </div>

    <!-- 全局组件 -->
    <Alert />
    <Confirm />
    <TaskDetails />
    <TemplateDetails />
    <PromptTemplate />
LiangLiu's avatar
LiangLiu committed
73
74
    <Voice_tts v-if="showVoiceTTSModal" @tts-complete="handleTTSComplete" @close-modal="showVoiceTTSModal = false" />
    <MediaTemplate />
LiangLiu's avatar
LiangLiu committed
75
76
77
78

    <!-- 全局加载覆盖层 - Apple 风格 -->
    <div v-show="isLoading" class="fixed inset-0 bg-[#f5f5f7] dark:bg-[#000000] flex items-center justify-center z-[9999] transition-opacity duration-300">
      <Loading />
LiangLiu's avatar
LiangLiu committed
79
80
81
    </div>
  </div>
</template>
LiangLiu's avatar
LiangLiu committed
82
83
84
85

<style scoped>
/* Apple 风格极简设计 - 所有样式已通过 Tailwind CSS 在 template 中定义 */
</style>