LaiTool V3.0.4
This commit is contained in:
@@ -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>
|
||||
+116
@@ -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>
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user