feat: 完善访谈与vlog模块页面,重组设备与图片公共资源,新增音频管理与一班对接工具

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
zhongyidianandClaude Opus 4.7 committed 2026-05-05 15:41:41 +08:00
1 parent c4c9be9d35
commit fc9633f371
159 files changed
+4823 -2535

No files matched your search

+43 -23
View File
@@ -3,7 +3,8 @@ import { getStaticImage } from '@/utils'
import { computed, ref } from 'vue'
import { useRouter } from 'vue-router'
import { getBackgroundImage } from '@/utils'
defineOptions({ name: 'VlogMenu' })
import { useInterviewStore } from '@/stores'
defineOptions({ name: 'InterviewMenu' })
/**
* 菜单项 (前期准备、中期拍摄、后期剪辑)
@@ -33,13 +34,13 @@ const menuItems = ref([
label: '资源筹备',
routeName: 'InterviewResource',
parentValue: 1,
disabled: true
disabled: false
},
{
label: '创意构想',
routeName: 'InterviewCreative',
parentValue: 1,
disabled: true
disabled: false
},
{
label: '脚本撰写',
@@ -51,32 +52,32 @@ const menuItems = ref([
label: '分镜制作',
routeName: 'InterviewStoryboard',
parentValue: 1,
disabled: true
disabled: false
},
{
label: '设备准备',
routeName: 'InterviewMidtermEquipment',
routeName: 'InterviewEquipment',
parentValue: 2,
disabled: false
},
{
label: '实地取景',
routeName: 'InterviewMidtermShooting',
routeName: 'InterviewShooting',
parentValue: 2,
disabled: false
},
{
label: '现场拍摄',
routeName: 'Interview现场拍摄',
routeName: 'InterviewOnsiteShooting',
parentValue: 2,
disabled: true
},
{
label: '素材管理',
routeName: 'Interview素材管理',
parentValue: 3,
disabled: true
disabled: false
},
// {
// label: '素材管理',
// routeName: 'Interview素材管理',
// parentValue: 3,
// disabled: true
// },
{
label: '剪辑',
routeName: 'InterviewEditing',
@@ -85,15 +86,21 @@ const menuItems = ref([
},
{
label: '调色',
routeName: 'InterviewColor',
routeName: 'InterviewColorPractice',
parentValue: 3,
disabled: false
},
{
label: '音频',
routeName: 'InterviewAudio',
parentValue: 3,
disabled: false
},
{
label: '导出发布',
routeName: 'Interview导出发布',
routeName: 'InterviewExportPublish',
parentValue: 3,
disabled: true
disabled: false
}
])
@@ -102,12 +109,19 @@ const props = defineProps<{
}>()
const router = useRouter()
const interview = useInterviewStore()
const isViewed = (routeName: string) => {
return interview.viewed?.[routeName] === true
}
const currentParentValue = computed<number>(() => {
return props.currentStep
}) // 当前选中的父级菜单项
const currentItemValue = ref<string>('') // 当前选中的子级菜单项
const currentItemValue = computed<string>(() => {
return router.currentRoute.value.name?.toString() ?? ''
})
const getMenuItems = computed(() => {
return menuItems.value.filter(item => item.parentValue === currentParentValue.value)
@@ -115,7 +129,6 @@ const getMenuItems = computed(() => {
const handleItemClick = (item: { routeName: string; disabled: boolean }) => {
if (item.disabled) return
currentItemValue.value = item.routeName
router.push({ name: item.routeName })
}
</script>
@@ -124,9 +137,9 @@ const handleItemClick = (item: { routeName: string; disabled: boolean }) => {
<div class="absolute left-20 top-0 bottom-0 w-[520px] pt-28" v-if="currentStep">
<!-- 分类名称 -->
<div class="absolute top-3 left-24 flex items-center space-x-2">
<span class="text-4xl text-[#fbbf24] font-black">{{
category[currentParentValue - 1].label
}}</span>
<span class="text-4xl text-[#fbbf24] font-black">
{{ category[currentParentValue - 1].label }}
</span>
<img class="filter-blue" :src="category[currentParentValue - 1].icon" alt="" />
</div>
<!-- 背景图片 -->
@@ -150,7 +163,14 @@ const handleItemClick = (item: { routeName: string; disabled: boolean }) => {
class="absolute inset-0 bg-cover bg-center bg-no-repeat opacity-0 group-hover:opacity-100 transition-opacity duration-300"
:style="{ backgroundImage: getBackgroundImage('components/menu-hover.png') }"
></div>
<span :class="[!item.disabled ? 'menu-glow-text' : '']">{{ item.label }}</span>
<span class="flex items-center gap-2" :class="[!item.disabled ? 'menu-glow-text' : '']">
<span>{{ item.label }}</span>
<img
:class="['w-10', isViewed(item.routeName) ? 'brightness-90' : 'brightness-50']"
src="@/assets/images/midterm/完成.png"
alt=""
/>
</span>
</div>
</template>
</div>