2024-08-20 10:37:38 +08:00

299 lines
9.2 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div style="margin: 30px 30px 30px 0">
<n-form
ref="bookRef"
:model="reverseManageStore.selectBook"
:rules="rules"
label-placement="left"
label-width="auto"
require-mark-placement="right-hanging"
>
<n-form-item label="书名" path="name">
<n-input v-model:value="reverseManageStore.selectBook.name" placeholder="请输入书名" />
</n-form-item>
<n-form-item label="视频文件" path="oldVideoPath">
<n-input
disabled="true"
v-model:value="reverseManageStore.selectBook.oldVideoPath"
placeholder="请选择反推的视频文件"
clearable
>
<template #suffix>
<n-button @click="ClearInputData('oldVideoPath')" text style="font-size: 20px">
<n-icon>
<CloseSharp />
</n-icon>
</n-button>
</template>
</n-input>
<n-button type="info" @click="SelectMP4File('oldVideoPath')" style="margin-left: 10px"
>选择视频</n-button
>
</n-form-item>
<n-form-item label="小说类型" path="type">
<n-select
v-model:value="reverseManageStore.selectBook.type"
:disabled="reverseManageStore.selectBook.id != null"
:options="reverseManageStore.bookType"
style="width: 200px"
>
</n-select>
</n-form-item>
<n-form-item label="配音地址" path="audioPath">
<n-input
v-model:value="reverseManageStore.selectBook.audioPath"
disabled="true"
placeholder="没有选择的话则使用原视频的"
>
<template #suffix>
<n-button @click="ClearInputData('audioPath')" text style="font-size: 20px">
<n-icon>
<CloseSharp />
</n-icon>
</n-button> </template
></n-input>
<n-button type="info" @click="SelectMP4File('audioPath')" style="margin-left: 10px"
>选择配音</n-button
>
</n-form-item>
<n-form-item label="SRT地址" path="srtPath">
<n-input
v-model:value="reverseManageStore.selectBook.srtPath"
disabled="true"
placeholder="没有选择的话则使用原视频的"
>
<template #suffix>
<n-button @click="ClearInputData('srtPath')" text style="font-size: 20px">
<n-icon>
<CloseSharp />
</n-icon>
</n-button> </template
></n-input>
<n-button type="info" @click="SelectMP4File('srtPath')" style="margin-left: 10px"
>选择SRT</n-button
>
</n-form-item>
<n-form-item label="背景音乐" path="srtPath">
<n-select
v-model:value="reverseManageStore.selectBook.backgroundMusic"
:options="backgroundMusicOptions"
placeholder="请选择背景音乐"
>
</n-select>
</n-form-item>
<n-form-item label="小说项目文件夹" path="bookFolderPath">
<n-input
v-model:value="reverseManageStore.selectBook.bookFolderPath"
disabled="true"
placeholder="不用选择,添加小说自动生成"
>
</n-input>
<n-button type="info" @click="OpenFolder('bookFolderPath')" style="margin-left: 10px"
>打开</n-button
>
</n-form-item>
<n-form-item label="图片输出文件夹" path="imageFolder">
<n-input
v-model:value="reverseManageStore.selectBook.imageFolder"
disabled="true"
placeholder="不用选择,添加小说自动生成"
>
</n-input>
<n-button type="info" @click="OpenFolder('imageFolder')" style="margin-left: 10px"
>打开</n-button
>
</n-form-item>
<div style="margin-left: 10px; display: flex; justify-content: flex-end">
<n-button :loading="loading" type="success" @click="AddOrModifyBook">{{
type == 'add' ? '添加' : '保存'
}}</n-button>
</div>
</n-form>
</div>
</template>
<script>
import { ref, onMounted, defineComponent, onUnmounted, toRaw, watch } from 'vue'
import { useMessage, NButton, NForm, NFormItem, NInput, NSelect, NIcon } from 'naive-ui'
import { useReverseManageStore } from '../../../../../../stores/reverseManage.ts'
import { CloseSharp } from '@vicons/ionicons5'
import { cloneDeep } from 'lodash'
import { useSoftwareStore } from '../../../../../../stores/software.ts'
export default defineComponent({
components: {
NButton,
NForm,
NFormItem,
NInput,
NSelect,
NIcon,
CloseSharp
},
props: ['type'],
setup(props) {
let message = useMessage()
let reverseManageStore = useReverseManageStore()
let softwareStore = useSoftwareStore()
let bookRef = ref(null)
let loading = ref(false)
let backgroundMusicOptions = ref([])
// let data = ref(reverseManageStore.selectBook)
let type = ref(props.type ? props.type : 'add')
onMounted(async () => {
// 初始化小说类型
let res = await reverseManageStore.SetBookType()
if (res.code == 0) {
message.error(res.message)
return
}
// 获取初始化的背景音乐列表
await window.api.GetBackgroundMusicConfigList((value) => {
if (value.code == 0) {
message.error(value.message)
return
}
for (let i = 0; i < value.value.length; i++) {
const element = value.value[i]
let obj = {
label: element.name,
value: element.id
}
backgroundMusicOptions.value.push(obj)
}
})
})
/**
* 选择 MP4 视频文件
*/
async function SelectMP4File(propertyName) {
let ext = ['mp4']
if (propertyName == 'audioPath') {
ext = ['mp3', 'wav']
} else if (propertyName == 'srtPath') {
ext = ['srt']
}
// 选择MP4文件夹
await window.api.SelectFile(ext, (value) => {
debugger
if (value.code == 0) {
message.error(value.message)
return
}
if (value.value == null) {
message.error('没有选中的数据')
return
}
if (propertyName == 'oldVideoPath') {
reverseManageStore.selectBook.oldVideoPath = value.value
} else if (propertyName == 'audioPath') {
reverseManageStore.selectBook.audioPath = value.value
} else if (propertyName == 'srtPath') {
reverseManageStore.selectBook.srtPath = value.value
} else {
message.error('没有找到对应的属性')
}
})
}
let ruleObj = (errorMessage) => {
return [
{
required: true,
validator(rule, value) {
if (value == null || value == '') return new Error(errorMessage)
return true
},
trigger: ['input', 'blur', 'change']
}
]
}
let rules = {
name: ruleObj('书名必填'),
oldVideoPath: ruleObj('反推的视频文件地址必填'),
type: ruleObj('小说类型必填')
}
/**
* 添加或者是修改数据通过ID判断
*/
async function AddOrModifyBook(e) {
// 校验数据
e.preventDefault()
bookRef.value?.validate(async (errors) => {
if (errors) {
message.error('请检查必填字段')
return
}
debugger
loading.value = true
let res = await reverseManageStore.SaveSelectBook(cloneDeep(reverseManageStore.selectBook))
loading.value = false
// 判断当前的数据是不是有ID
if (res.code == 0) {
message.error(res.message)
return
}
message.success('添加/修改成功')
reverseManageStore.selectBook = reverseManageStore.selectBook
})
}
//清空MP4路劲信息
function ClearInputData(propertyName) {
if (propertyName == 'oldVideoPath') {
reverseManageStore.UpdateSelectBook({ oldVideoPath: null })
} else if (propertyName == 'audioPath') {
reverseManageStore.UpdateSelectBook({ audioPath: null })
} else if (propertyName == 'srtPath') {
reverseManageStore.UpdateSelectBook({ srtPath: null })
} else {
message.error('没有找到对应的属性')
}
}
/**
* 打开指定的文件夹
* @param param
*/
async function OpenFolder(param) {
let res = null
debugger
if (param == 'imageFolder') {
res = await window.system.OpenFolder({
folderPath: reverseManageStore.selectBook.imageFolder,
baseProject: false
})
} else if (param == 'bookFolderPath') {
res = await window.system.OpenFolder({
folderPath: reverseManageStore.selectBook.bookFolderPath,
baseProject: false
})
} else {
message.error('未知的参数')
return
}
if (res.code == 0) {
message.error(res.message)
return
}
}
return {
reverseManageStore,
rules,
type,
ClearInputData,
SelectMP4File,
AddOrModifyBook,
bookRef,
softwareStore,
OpenFolder,
backgroundMusicOptions,loading
}
}
})
</script>