LaiTool V3.0.4

This commit is contained in:
2024-09-04 19:49:20 +08:00
parent ccddd2412a
commit 5dc75f018a
53 changed files with 1632 additions and 312 deletions
@@ -1,15 +1,42 @@
<template>
<div style="width: 100%; height: 100%">
<webview style="width: 100%; height: 100%" src="https://api.laitool.cc" partition="persist:your-session-name"></webview>
<webview
id="lai-api"
style="width: 100%; height: 100%"
src="https://api.laitool.cc"
partition="persist:your-session-name"
></webview>
</div>
</template>
<script>
import { defineComponent } from 'vue'
import { defineComponent, onMounted, onUnmounted } from 'vue'
export default defineComponent({
components: {},
setup() {
onMounted(() => {
const webview = document.getElementById('lai-api')
if (webview) {
debugger
const handleNewWindow = (event) => {
debugger
event.preventDefault()
alert(123)
const protocol = new URL(event.url).protocol
if (protocol === 'http:' || protocol === 'https:') {
window.api.OpenUrl(protocol) // 确保传递完整的 URL 而不是仅协议
}
}
webview.addEventListener('new-window', handleNewWindow)
}
})
// 在组件卸载时移除事件监听器
// onUnmounted(() => {
// webview.removeEventListener('new-window', handleNewWindow)
// })
return {}
}
})
@@ -265,7 +265,6 @@ export default defineComponent({
// 初始化加载项目下面的分镜好的文案
// 并判断是不是有洗稿后的文件。一并加载
await window.api.GetProjectWord((value) => {
data.value = value.data
})
@@ -358,7 +357,6 @@ export default defineComponent({
let itemIndex = row.subValue.findIndex((item) => item.id == itemId)
let thisIndex = data.value.findIndex((item) => item.id == row.id)
if (itemIndex < 0 && isM) {
message.error('数据错误')
return
} else {
@@ -551,7 +549,7 @@ export default defineComponent({
async function AIModifyOneWord(row) {
await window.api.AIModifyOneWord([row.no, row.word], (value) => {
if (value.code != 1) {
message.error('未知错误')
message.error()
return
}
// 修改数据
@@ -599,7 +597,7 @@ export default defineComponent({
// 开始保存
await window.api.SaveNewWord(new_data_word, (value) => {
if (value.code != 1) {
message.error('未知错误')
message.error(value.message)
return
}
message.success('保存成功,并写入到了剪贴板')
@@ -614,7 +612,7 @@ export default defineComponent({
[toRaw(data.value), 'srt_time_information'],
(value) => {
if (value.code != 1) {
message.error('未知错误')
message.error(value.message)
return
}
message.success('保存成功')
@@ -32,7 +32,6 @@ export default defineComponent({
props: ['initData', 'index'],
setup(props) {
let data = ref(props.initData)
console.log('subValue', data.value)
onMounted(async () => {})
let InputDebounced = debounce(handleInput, 1000)
@@ -0,0 +1,45 @@
<template>
<div style="display: flex; justify-content: space-between; white-space: nowrap">
<span>文案</span>
<n-popover trigger="hover">
<template #trigger>
<n-button color="#7c461e" @click="SelectAfterGptAndReplace" text style="font-size: 24px">
<n-icon>
<FindReplaceRound />
</n-icon>
</n-button>
</template>
<span>批量查询替换文案</span>
</n-popover>
</div>
</template>
<script setup>
import { ref, h, onMounted, onUnmounted } from 'vue'
import { useDialog, useMessage, NIcon, NPopover, NButton } from 'naive-ui'
import FindReplaceRound from '../../Icon/FindReplaceRound.vue'
import { useReverseManageStore } from '../../../../../stores/reverseManage'
import DatatableHeaderAfterGptSelectAndReplace from './DatatableHeaderAfterGptSelectAndReplace.vue'
import { on } from 'ws'
import { BookRepalceDataType } from '../../../../../define/enum/bookEnum'
let reverseManageStore = useReverseManageStore()
let message = useMessage()
let dialog = useDialog()
let da = undefined
async function SelectAfterGptAndReplace() {
if (da) {
return
}
da = dialog.create({
title: '批量查询替换文案',
showIcon: false,
maskClosable: false,
content: () =>
h(DatatableHeaderAfterGptSelectAndReplace, { type: BookRepalceDataType.AFTER_GPT }),
onClose: () => {
da = undefined
}
})
}
</script>
@@ -0,0 +1,116 @@
<template>
<div>
<n-input v-model:value="replaceData.before" size="small" type="text" placeholder="替换前" />
<n-input
v-model:value="replaceData.after"
style="margin-top: 10px"
size="small"
type="text"
placeholder="替换后,空白为删除"
/>
<div v-if="replaceData.type == 'gpt_prompt'" style="margin-top: 10px">
<n-checkbox v-model:checked="replaceData.replaceAll"> 替换所有 </n-checkbox>
<div style="color: red">
勾选当前按钮会替换所有的提示词数据包含推理的或者是反推的没有勾选只会替换当前显示的
</div>
</div>
<div style="display: flex; justify-content: flex-end; margin-top: 15px">
<n-button type="info" @click="ReplaceAfterGpt">替换</n-button>
</div>
</div>
</template>
<script setup>
import { ref, onMounted, toRaw } from 'vue'
import { NInput, NButton, useMessage, NCheckbox } from 'naive-ui'
import { isEmpty, replace } from 'lodash'
import { useReverseManageStore } from '../../../../../stores/reverseManage'
import { BookRepalceDataType } from '../../../../../define/enum/bookEnum'
let replaceData = ref({
before: undefined,
after: undefined,
replaceAll: false,
type: BookRepalceDataType.AFTER_GPT
})
let message = useMessage()
let reverseManageStore = useReverseManageStore()
let props = defineProps({
type: BookRepalceDataType.AFTER_GPT
})
onMounted(() => {
replaceData.value.type = props.type
})
async function ReplaceAfterGpt() {
if (isEmpty(replaceData.value.before)) {
message.error('替换前不能为空')
return
}
let res = await window.book.ReplaceBookData(
reverseManageStore.selectBookTask.id,
toRaw(replaceData.value)
)
if (res.code == 1) {
// 清空数据
replaceData.value.before = ''
replaceData.value.after = ''
replaceData.value.replaceAll = false
if (props.type == BookRepalceDataType.AFTER_GPT) {
// 修改前端数据
for (let i = 0; i < res.data.length; i++) {
const element = res.data[i]
let index = reverseManageStore.selectBookTaskDetail.findIndex(
(x) => x.id == element.bookTaskDetailId
)
if (index != -1) {
reverseManageStore.selectBookTaskDetail[index].afterGpt = element.newData
}
}
} else if (props.type == BookRepalceDataType.GPT_PROMPT) {
for (let i = 0; i < res.data.length; i++) {
const element = res.data[i]
let index = reverseManageStore.selectBookTaskDetail.findIndex(
(x) => x.id == element.bookTaskDetailId
)
if (index == -1) {
continue
}
if (element.type == 'gptPrompt') {
// 修改的是GPT提示词
reverseManageStore.selectBookTaskDetail[index].gptPrompt = element.newData
} else if (element.type == 'reversePrompt') {
// 修改的是反推提示词
let reverseIndex = reverseManageStore.selectBookTaskDetail[index].reversePrompt.findIndex(
(x) => x.id == element.reversePromptId
)
if (reverseIndex == -1) {
continue
}
if (element.reversePromptType == 'promptCN') {
reverseManageStore.selectBookTaskDetail[index].reversePrompt[reverseIndex].promptCN =
element.newData
} else if (element.reversePromptType == 'prompt') {
reverseManageStore.selectBookTaskDetail[index].reversePrompt[reverseIndex].prompt =
element.newData
}
}
}
} else if (props.type == BookRepalceDataType.PROMPT) {
for (let i = 0; i < res.data.length; i++) {
const element = res.data[i]
let index = reverseManageStore.selectBookTaskDetail.findIndex(
(x) => x.id == element.bookTaskDetailId
)
if (index == -1) {
continue
}
reverseManageStore.selectBookTaskDetail[index].prompt = element.newData
}
}
} else {
message.error(res.message)
}
}
</script>
@@ -1,37 +1,58 @@
<template>
<div style="display: flex">
<div>反推/GPT提示词</div>
<n-button
v-if="reverseManageStore.selectBook.type == bookType.MJ_REVERSE"
type="text"
:color="softwareStore.SoftColor.ZHUYANTUO"
size="tiny"
style="margin-left: 10px"
@click="SelectPromptIndex"
>选择提示词</n-button
><n-button
v-if="reverseManageStore.selectBook.type == bookType.MJ_REVERSE"
type="text"
:color="softwareStore.SoftColor.ZHUYANTUO"
size="tiny"
style="margin-left: 5px"
@click="SelectStyle"
>风格</n-button
>
<div style="display: flex; justify-content: space-between; white-space: nowrap">
<div style="display: flex">
<div>反推/GPT提示词</div>
<n-button
v-if="reverseManageStore.selectBook.type == bookType.MJ_REVERSE"
type="text"
:color="softwareStore.SoftColor.ZHUYANTUO"
size="tiny"
style="margin-left: 10px"
@click="SelectPromptIndex"
>选择提示词</n-button
><n-button
v-if="reverseManageStore.selectBook.type == bookType.MJ_REVERSE"
type="text"
:color="softwareStore.SoftColor.ZHUYANTUO"
size="tiny"
style="margin-left: 5px"
@click="SelectStyle"
>风格</n-button
>
</div>
<div>
<n-popover trigger="hover">
<template #trigger>
<n-button
color="#7c461e"
@click="SelectReversePromptAndReplace"
text
style="font-size: 24px"
>
<n-icon>
<FindReplaceRound />
</n-icon>
</n-button>
</template>
<span>批量替换反推提示词</span>
</n-popover>
</div>
</div>
</template>
<script>
import { ref, onMounted, defineComponent, onUnmounted, toRaw, h, watch } from 'vue'
import { useMessage, useDialog, NButton } from 'naive-ui'
import { useMessage, useDialog, NButton, NPopover, NIcon } from 'naive-ui'
import { useReverseManageStore } from '../../../../../stores/reverseManage'
import { BookType } from '../../../../../define/enum/bookEnum'
import { BookRepalceDataType, BookType } from '../../../../../define/enum/bookEnum'
import { useSoftwareStore } from '../../../../../stores/software'
import SelectMJReversePrompt from '../MJReverse/SelectMJReversePrompt.vue'
import SelectImageStyle from '../../Components/SelectImageStyle.vue'
import FindReplaceRound from '../../Icon/FindReplaceRound.vue'
import DatatableHeaderAfterGptSelectAndReplace from './DatatableHeaderAfterGptSelectAndReplace.vue'
export default defineComponent({
components: { NButton },
components: { NButton, NPopover, FindReplaceRound, NIcon },
setup() {
let message = useMessage()
@@ -40,7 +61,7 @@ export default defineComponent({
let bookType = ref(BookType)
let dialog = useDialog()
let selectStyleRef = ref(null)
onMounted(async () => {})
let da = undefined
/**
* 选择MJ反推提示词。用于生图
@@ -115,13 +136,30 @@ export default defineComponent({
})
}
async function SelectReversePromptAndReplace() {
if (da) {
return
}
da = dialog.create({
title: '批量查询替换反推提示词',
showIcon: false,
maskClosable: false,
content: () =>
h(DatatableHeaderAfterGptSelectAndReplace, { type: BookRepalceDataType.GPT_PROMPT }),
onClose: () => {
da = undefined
}
})
}
return {
reverseManageStore,
bookType,
softwareStore,
SelectPromptIndex,
SelectStyle,
selectStyleRef
selectStyleRef,
SelectReversePromptAndReplace
}
}
})
@@ -1,5 +1,6 @@
<template>
<div style="display: flex; align-items: center; margin-left: 10px">
<div style="display: flex; align-items: center; white-space: nowrap">
<span>生图提示词</span>
<n-popover trigger="hover">
<template #trigger>
<n-button color="#7c461e" @click="SetMergeModel" text style="font-size: 24px">
@@ -19,6 +20,22 @@
>合并命令</n-button
>
</n-dropdown>
<n-popover trigger="hover">
<template #trigger>
<n-button
color="#7c461e"
@click="SelectPromptAndReplace"
text
style="font-size: 24px; margin-left: 10px"
>
<n-icon>
<FindReplaceRound />
</n-icon>
</n-button>
</template>
<span>批量查询替换文案</span>
</n-popover>
</div>
</template>
@@ -30,10 +47,24 @@ import { useSoftwareStore } from '../../../../../stores/software'
import DynamicTagsSelect from '../../Components/DynamicTagsSelect.vue'
import { usePromptStore } from '../../../../../stores/prompt'
import { useReverseManageStore } from '../../../../../stores/reverseManage'
import { BookImageCategory, OperateBookType } from '../../../../../define/enum/bookEnum'
import {
BookImageCategory,
BookRepalceDataType,
OperateBookType
} from '../../../../../define/enum/bookEnum'
import FindReplaceRound from '../../Icon/FindReplaceRound.vue'
import DatatableHeaderAfterGptSelectAndReplace from './DatatableHeaderAfterGptSelectAndReplace.vue'
export default defineComponent({
components: { NDropdown, NPopover, NIcon, NButton, Construct },
components: {
NDropdown,
NPopover,
NIcon,
NButton,
Construct,
FindReplaceRound,
DatatableHeaderAfterGptSelectAndReplace
},
setup() {
let softwareStore = useSoftwareStore()
@@ -41,7 +72,7 @@ export default defineComponent({
let reverseManageStore = useReverseManageStore()
let message = useMessage()
let dialog = useDialog()
onMounted(async () => {})
let da = undefined
async function SaveFunction(value, options) {
// 开始保存
@@ -137,11 +168,28 @@ export default defineComponent({
softwareStore.spin.spinning = false
}
async function SelectPromptAndReplace() {
if (da) {
return
}
da = dialog.create({
title: '批量查询替换生图提示词',
showIcon: false,
maskClosable: false,
content: () =>
h(DatatableHeaderAfterGptSelectAndReplace, { type: BookRepalceDataType.PROMPT }),
onClose: () => {
da = undefined
}
})
}
return {
softwareStore,
SetMergeModel,
reverseManageStore,
MergePrompt,
SelectPromptAndReplace,
MergePromptOptions: [
{ label: 'MJ模式合并', key: 'mj_merge' },
{ label: 'SD模式合并', key: 'sd_merge' }
@@ -0,0 +1,173 @@
<template>
<div style="margin-top: 10px">
<n-form
ref="formRef"
:model="creatObj"
label-placement="left"
label-width="120"
require-mark-placement="right-hanging"
:rules="rules"
>
<n-form-item label="新增批次数" path="count">
<n-input-number
:show-button="false"
:min="1"
:max="100"
v-model:value="creatObj.count"
placeholder="Input"
/>
</n-form-item>
<n-form-item label="选择风格" path="selectTaskDataCategory">
<div>风格目前需要到每个批次中单独设置</div>
</n-form-item>
<n-form-item label="通用前缀" path="prefixPrompt">
<n-input v-model:value="creatObj.prefixPrompt" placeholder="请输入通用前缀"></n-input>
</n-form-item>
<n-form-item label="通用后缀" path="suffixPrompt">
<n-input v-model:value="creatObj.suffixPrompt" placeholder="请输入通用后缀"></n-input>
</n-form-item>
<n-form-item label="选择旧批次" path="selectBookTask">
<n-select
v-model:value="creatObj.selectBookTask"
:options="bookTaskOptions"
placeholder="选择要复制数据的已存在的批次"
/>
<n-checkbox
style="width: 200px; margin-left: 10px"
label="使用旧批次数据"
v-model:checked="creatObj.copyBookTask"
/>
</n-form-item>
<n-form-item label="复制的数据" path="selectTaskDataCategory">
<n-checkbox-group
:value="creatObj.selectTaskDataCategory"
@update:value="handleUpdateValue"
>
<n-space item-style="display: flex;" align="center">
<n-checkbox
v-for="item in groupData"
:disabled="item.disabled"
:key="item.value"
:value="item.value"
>
{{ item.label }}
</n-checkbox>
</n-space>
</n-checkbox-group>
</n-form-item>
<div style="display: flex; justify-content: flex-end">
<n-button type="primary" @click="SaveBookTask"> 添加 </n-button>
</div>
</n-form>
</div>
</template>
<script setup>
import { onMounted, ref, toRaw } from 'vue'
import {
useMessage,
NForm,
NFormItem,
NButton,
NSpace,
NInput,
NInputNumber,
NCheckboxGroup,
NCheckbox,
NSelect
} from 'naive-ui'
import { useReverseManageStore } from '../../../../../../stores/reverseManage'
import { AddBookTaskCopyData } from '../../../../../../define/enum/bookEnum'
let reverseManageStore = useReverseManageStore()
let message = useMessage()
let formRef = ref(null)
let creatObj = ref({
count: 1,
copyBookTask: false,
selectBookTask: undefined,
selectTaskDataCategory: [],
prefixPrompt: '',
suffixPrompt: ''
})
let bookTaskOptions = ref([])
let groupData = ref([
{
label: '文案',
value: AddBookTaskCopyData.AFTER_GPT,
disabled: false
},
{
label: '反推/GPT提示词',
value: AddBookTaskCopyData.GPT_PROMPT,
disabled: false
},
{
label: '生图风格',
value: AddBookTaskCopyData.IMAGE_STYLE,
disabled: false
},
{
label: '选择角色',
value: AddBookTaskCopyData.CHARACTER,
disabled: false
},
{
label: '生图提示词',
value: AddBookTaskCopyData.PROMPT,
disabled: false
}
])
let rules = ref({
count: [{ required: true, message: '请输入新增批次数' }]
})
onMounted(() => {
bookTaskOptions.value = reverseManageStore.bookTaskData.map((item) => {
return {
label: item.name,
value: item.id
}
})
if (bookTaskOptions.value.length > 0) {
creatObj.value.selectBookTask = bookTaskOptions.value[0].value
}
})
// 添加批次的方法
async function SaveBookTask(e) {
console.log(toRaw(creatObj.value))
e.preventDefault()
formRef.value?.validate(async (errors) => {
if (errors) {
message.error('请检查必填项')
return
}
// 这边就开始调用添加批次的接口
let res = await window.book.AddNewBookTask(toRaw(creatObj.value))
if (res.code == 0) {
message.error(res.message)
} else {
// 加载任务列表
let bookTaskRes = await reverseManageStore.GetBookTaskDataFromDB({
bookId: reverseManageStore.selectBook.id
})
softwareStore.spin.spinning = false
if (bookTaskRes.code == 0) {
message.error(bookTaskRes.message)
return
}
// 添加成功,添加成功之后需要刷新一下批次列表
message.success('添加成功')
}
})
}
function handleUpdateValue(value) {
creatObj.value.selectTaskDataCategory = value
}
</script>
@@ -362,7 +362,6 @@ export default defineComponent({
// 导出文案
async function ExportCopywriting() {
debugger
softwareStore.spin.spinning = true
softwareStore.spin.tip = '正在导出文案中...'
let res = await window.book.ExportCopywriting(reverseManageStore.selectBookTask.id)
@@ -382,6 +381,36 @@ export default defineComponent({
softwareStore.spin.spinning = false
}
// 导入文案
async function ImportCopywriting() {
window.api.SelectFile(['txt'], async (value) => {
if (value.code == 0) {
message.error(value.message)
return
}
let txtPath = value.value
// 这边开始导入
let res = await window.book.ImportCopywriting(
reverseManageStore.selectBook.id,
reverseManageStore.selectBookTask.id,
txtPath
)
if (res.code == 1) {
for (let i = 0; i < res.data.length; i++) {
const element = res.data[i]
let index = reverseManageStore.selectBookTaskDetail.findIndex(
(x) => x.id == element.bookTaskDetailId
)
if (index != -1) {
reverseManageStore.selectBookTaskDetail[index].afterGpt = element.afterGpt
}
}
} else {
window.api.showGlobalMessageDialog(res)
}
})
}
/**
* 获取水印位置
*/
@@ -420,6 +449,9 @@ export default defineComponent({
case 'export_recognizing': // 导出文案
await ExportCopywriting()
break
case 'import_recognizing': // 导入文案
await ImportCopywriting()
break
case 'watermark_position': // 水印位置设置
await GetWatermarkPosition()
break
@@ -853,6 +885,10 @@ export default defineComponent({
label: '导出文案',
key: 'export_recognizing'
},
{
label: '导入文案',
key: 'import_recognizing'
},
{
label: '停止提取',
key: 'stop_recognizing'
@@ -19,6 +19,7 @@ import ManageBookOldImage from '../Components/ManageBookOldImage.vue'
import { BookType } from '../../../../../define/enum/bookEnum'
import MJReversePrompt from './MJReversePrompt.vue'
import DatatableHeaderGptPrompt from '../Components/DatatableHeaderGptPrompt.vue'
import DatatableHeaderAfterGpt from '../Components/DatatableHeaderAfterGpt.vue'
import DatatableHeaderPrompt from '../Components/DatatableHeaderPrompt.vue'
import DatatablePrompt from '../Components/DatatablePrompt.vue'
import DatatableHeaderImage from '../Components/DatatableHeaderImage.vue'
@@ -41,7 +42,9 @@ export default defineComponent({
fixed: 'left'
},
{
title: '文案',
title(row) {
return h(DatatableHeaderAfterGpt)
},
key: 'afterGpt',
width: 200,
fixed: 'left',
@@ -87,10 +90,7 @@ export default defineComponent({
},
{
title(row) {
return h('div', { style: 'display: flex; align-items: center' }, [
h('span', { size: 'tiny', style: 'margin-left: 5px' }, '生图提示词'),
h(DatatableHeaderPrompt)
])
return h(DatatableHeaderPrompt)
},
className: 'space-row',
key: 'row1',
@@ -41,6 +41,7 @@ import { useRouter } from 'vue-router'
import { OperateBookType } from '../../../../define/enum/bookEnum'
import { DEFINE_STRING } from '../../../../define/define_string'
import { ResponseMessageType } from '../../../../define/enum/softwareEnum'
import AddBookTask from './Components/ManageBook/AddBookTask.vue'
export default defineComponent({
components: {
@@ -167,6 +168,16 @@ export default defineComponent({
}
}
async function AddBookDialog() {
message.info('新增' + reverseManageStore.selectBook.id)
dialog.create({
title: '新增小说批次任务',
showIcon: false,
content: () => h(AddBookTask),
style: { width: '600px' }
})
}
/**
* 一键生成草稿
*/
@@ -197,6 +208,7 @@ export default defineComponent({
return {
reverseManageStore,
AddBookDialog,
HDImageAll,
DraftAll,
VideoAll,
@@ -7,14 +7,6 @@
<ManageBookTask style="height: 100%" />
</template>
</n-split>
<n-float-button :right="30" :bottom="30" shape="circle">
<n-badge :value="100" :max="99" :offset="[6, -8]">
<n-icon :size="large">
<Layers />
</n-icon>
</n-badge>
</n-float-button>
</div>
</template>
@@ -0,0 +1,19 @@
<script setup>
import { onMounted, ref } from 'vue'
import { useMessage, NButton, NFloatButton, NBadge, NIcon } from 'naive-ui'
import { Layers } from '@vicons/ionicons5'
import { useSoftwareStore } from '../../../../../stores/software'
import QueryButton from './QueryButton.vue'
import TaskDataTable from './TaskDataTable.vue'
let softwareStore = useSoftwareStore()
onMounted(() => {
//
})
</script>
<template>
<QueryButton />
<TaskDataTable />
</template>
@@ -0,0 +1,57 @@
<script setup>
import { onMounted, ref } from 'vue'
import { useMessage, NForm, NFormItem, NInput, NButton } from 'naive-ui'
import { useSoftwareStore } from '../../../../../stores/software'
let softwareStore = useSoftwareStore()
function handleSubmit() {
alert(123)
}
</script>
<template>
<n-form
ref="formRef"
inline
:label-width="80"
:model="softwareStore.backTask.queryData"
size="small"
>
<n-form-item label="小说" path="bookId">
<n-input v-model:value="softwareStore.backTask.queryData.bookId" placeholder="选择小说任务" />
</n-form-item>
<n-form-item label="小说批次任务" path="bookTaskId">
<n-input
v-model:value="softwareStore.backTask.queryData.bookTaskId"
placeholder="选择小说批次任务"
/>
</n-form-item>
<n-form-item label="任务名字" path="taskName">
<n-input
v-model:value="softwareStore.backTask.queryData.taskName"
placeholder="选择小说批次任务"
/>
</n-form-item>
<n-form-item label="任务类型" path="taskType">
<n-input
v-model:value="softwareStore.backTask.queryData.taskType"
placeholder="选择小说批次任务"
/>
</n-form-item>
<n-form-item label="任务状态" path="taskStatus">
<n-input
v-model:value="softwareStore.backTask.queryData.taskStatus"
placeholder="选择小说批次任务"
/>
</n-form-item>
<n-form-item label="任务失败原因" path="taskErrorMessage">
<n-input
v-model:value="softwareStore.backTask.queryData.taskErrorMessage"
placeholder="选择小说批次任务"
/>
</n-form-item>
<n-form-item path="taskErrorMessage">
<n-button type="info" @click="handleSubmit">查询</n-button>
</n-form-item>
</n-form>
</template>
@@ -0,0 +1,7 @@
<script setup>
</script>
<template>
<div>TaskDataTable</div>
</template>
+52 -4
View File
@@ -33,18 +33,21 @@
<script>
import { ref, h, onMounted, defineComponent, toRaw } from 'vue'
import { RouterLink } from 'vue-router'
import { Layers } from '@vicons/ionicons5'
import {
useDialog,
NMenu,
NSpace,
NLayout,
NLayoutSider,
NLayoutContent,
NIcon,
useDialog,
useNotification,
useMessage,
NSwitch,
NButton
NButton,
NFloatButton,
NBadge
} from 'naive-ui'
import {
@@ -61,7 +64,9 @@ import { DEFINE_STRING } from '../../../../define/define_string'
import ShowMessage from './ShowMessage.vue'
import { MD5 } from 'crypto-js'
import InputDialogContent from '../Original/Components/InputDialogContent.vue'
import APIIcon from '../APIService/APIIcon.vue'
import APIIcon from '../Icon/APIIcon.vue'
import BackTaskIcon from '../Icon/BackTaskIcon.vue'
import BackTask from '../Components/BackTask/BackTask.vue'
export default defineComponent({
components: {
@@ -74,7 +79,10 @@ export default defineComponent({
ShowMessage,
NSwitch,
NButton,
APIIcon
APIIcon,
NFloatButton,
NBadge,
Layers
},
setup() {
let collapsed = ref(false)
@@ -95,6 +103,16 @@ export default defineComponent({
if (option.key == 'lai_api') return h(NIcon, null, { default: () => h(APIIcon) })
if (option.key == 'backward_matrix')
return h(NIcon, null, { default: () => h(DuplicateOutline) })
if (option.key == 'back_task')
return h(
NIcon,
{
onClick: () => {
OpneBackTask()
}
},
{ default: () => h(BackTaskIcon) }
)
if (option.key == 'TTS_Services') return h(NIcon, null, { default: () => h(RadioOutline) })
}
@@ -486,6 +504,22 @@ export default defineComponent({
key: 'mj_setting'
}
]
},
{
label: () =>
h(
'div',
{
onClick: () => {
OpneBackTask()
},
style : 'font-weight: bold;'
},
{
default: () => '后台任务'
}
),
key: 'back_task'
}
]
@@ -493,10 +527,24 @@ export default defineComponent({
return () => h(NIcon, null, { default: () => h(icon) })
}
function OpneBackTask() {
let dialogWidth = window.innerWidth * 0.8
let dialogHeight = window.innerHeight * 0.95
dialog.create({
title: '后台任务',
showIcon: false,
closeOnEsc: false,
content: () => h(BackTask, { height: dialogHeight }),
style: `width : ${dialogWidth}px; height : ${dialogHeight}px`,
maskClosable: false
})
}
return {
renderMenuIcon,
menuOptions,
expandIcon,
OpneBackTask,
collapsed
}
}
@@ -0,0 +1,16 @@
<template>
<div>
<svg
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
viewBox="0 0 24 24"
>
<g fill="none">
<path
d="M13.25 8.5a.75.75 0 0 0 0 1.5h3.5a.75.75 0 0 0 0-1.5h-3.5zm-.75 6.25a.75.75 0 0 1 .75-.75h3.5a.75.75 0 1 1 0 1.5h-3.5a.75.75 0 0 1-.75-.75zm-1.72-7.03a.75.75 0 0 1 0 1.06l-2 2a.75.75 0 0 1-1.06 0l-1-1a.75.75 0 0 1 1.06-1.06l.47.47l1.47-1.47a.75.75 0 0 1 1.06 0zm0 6.56a.75.75 0 1 0-1.06-1.06l-1.47 1.47l-.47-.47a.75.75 0 0 0-1.06 1.06l1 1a.75.75 0 0 0 1.06 0l2-2zM5.25 3A2.25 2.25 0 0 0 3 5.25v13.5A2.25 2.25 0 0 0 5.25 21h13.5A2.25 2.25 0 0 0 21 18.75V5.25A2.25 2.25 0 0 0 18.75 3H5.25zM4.5 5.25a.75.75 0 0 1 .75-.75h13.5a.75.75 0 0 1 .75.75v13.5a.75.75 0 0 1-.75.75H5.25a.75.75 0 0 1-.75-.75V5.25z"
fill="currentColor"
></path>
</g>
</svg>
</div>
</template>
@@ -0,0 +1,12 @@
<template>
<svg
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
viewBox="0 0 24 24"
>
<path
d="M11 6c1.38 0 2.63.56 3.54 1.46l-1.69 1.69a.5.5 0 0 0 .36.85h4.29c.28 0 .5-.22.5-.5V5.21c0-.45-.54-.67-.85-.35l-1.2 1.2A6.943 6.943 0 0 0 11 4C7.96 4 5.38 5.94 4.42 8.64c-.24.66.23 1.36.93 1.36c.42 0 .79-.26.93-.66A5.007 5.007 0 0 1 11 6zm5.64 9.14c.4-.54.72-1.15.95-1.8c.23-.65-.25-1.34-.94-1.34a.98.98 0 0 0-.93.66A5.007 5.007 0 0 1 11 16c-1.38 0-2.63-.56-3.54-1.46l1.69-1.69a.5.5 0 0 0-.36-.85H4.5c-.28 0-.5.22-.5.5v4.29c0 .45.54.67.85.35l1.2-1.2a6.984 6.984 0 0 0 9.09.7l4.11 4.11c.41.41 1.08.41 1.49 0c.41-.41.41-1.08 0-1.49l-4.1-4.12z"
fill="currentColor"
></path>
</svg>
</template>
@@ -111,7 +111,7 @@ export default defineComponent({
//
await window.api.SaveCopywritingInformation([toRaw(AnalyzeCharacter.value), "auto_analyze_character"], (value) => {
if (value.code != 1) {
message.error("未知错误");
message.error(value.message);
return;
}
message.success("保存成功");
@@ -550,7 +550,7 @@ export default defineComponent({
[toRaw(data.value), 'srt_time_information'],
(value) => {
if (value.code != 1) {
message.error('未知错误')
message.error(value.message)
return
}
message.success('保存成功')
@@ -167,7 +167,6 @@ export default defineComponent({
onMounted(async () => {
await window.api.InitSDConfig((value) => {
if (value.code == 0) {
message.error(value.message)
return
@@ -221,7 +220,7 @@ export default defineComponent({
})
return
} else {
window.api.showGlobalMessageDialog({ code: 0, message: '未知错误' })
window.api.showGlobalMessageDialog({ code: 0, message: value.message })
}
})
}
@@ -231,7 +230,6 @@ export default defineComponent({
*/
async function LoadSDServiceData() {
await window.sd.LoadSDServiceData(toRaw(formValue.value).webui_api_url, (value) => {
if (value.code == 0) {
message.error(value.message)
return
@@ -447,7 +447,7 @@ export default defineComponent({
fontNameOptions.value = value.data.font_name_list
//
} else {
message.error('未知错误')
message.error(value.message)
}
})
@@ -468,7 +468,6 @@ export default defineComponent({
* 保存基本配置
*/
async function SaveGeneralSetting() {
await window.api.SaveGeneralSetting(toRaw(generalSetting.value), (value) => {
console.log(value)
if (value.code == 0) {
@@ -476,7 +475,7 @@ export default defineComponent({
} else if (value.code == 1) {
window.api.showGlobalMessageDialog(value)
} else {
window.api.showGlobalMessageDialog({ code: 0, message: '未知错误' })
window.api.showGlobalMessageDialog({ code: 0, message: value.message })
}
})
}
@@ -486,7 +485,6 @@ export default defineComponent({
*/
async function GetSystemInstallFontName() {
await window.api.GetSystemInstallFontName(async (value) => {
console.log(value)
if (value.code == 0) {
message.error(value.message)
@@ -495,7 +493,7 @@ export default defineComponent({
//
await GetVideoConfigMessage()
} else {
message.error('未知错误')
message.error(value.message)
}
})
}
@@ -505,7 +503,6 @@ export default defineComponent({
*/
async function SaveAssConfig() {
window.api.SaveAssConfig(['assConfig', toRaw(assSetting.value)], async (value) => {
console.log(value)
if (value.code == 1) {
//
@@ -517,7 +514,7 @@ export default defineComponent({
window.api.showGlobalMessageDialog(value)
} else {
// message.error("");
window.api.showGlobalMessageDialog({ code: 0, message: '未知错误' })
window.api.showGlobalMessageDialog({ code: 0, message: value.message })
}
})
}
@@ -528,7 +525,6 @@ export default defineComponent({
*/
async function DeleteAssSetting(row) {
await window.api.DeleteVideoConfig(['assConfig', row.id], async (value) => {
console.log(value)
if (value.code == 1) {
message.success('删除成功')
@@ -552,7 +548,7 @@ export default defineComponent({
} else if (value.code == 0) {
window.api.showGlobalMessageDialog(value)
} else {
window.api.showGlobalMessageDialog({ value: 0, message: '未知错误' })
window.api.showGlobalMessageDialog({ value: 0, message: value.message })
}
})
}
@@ -561,9 +557,7 @@ export default defineComponent({
* 删除指定的行
*/
async function DeleteWaterMarkSetting(row) {
await window.api.DeleteVideoConfig(['watermarkConfig', row.id], async (value) => {
console.log(value)
if (value.code == 1) {
message.success('删除成功')
@@ -587,14 +581,12 @@ export default defineComponent({
positiveText: '确定',
negativeText: '取消',
onPositiveClick: async () => {
let ss = modifyRef.value.wmSetting
console.log(ss)
await window.api.SaveAssConfig(
[type, toRaw(modifyRef.value.wmSetting)],
async (value) => {
console.log(value)
if (value.code == 0) {
message.error(value.message)