LaiTool 3.1.3

This commit is contained in:
2024-09-15 14:35:33 +08:00
parent 8500fd3446
commit 595cbe8374
15 changed files with 557 additions and 132 deletions
@@ -102,6 +102,9 @@
>
设置
</n-button>
<div style="margin-left: 10px">
<MonitorStatus />
</div>
</div>
<div class="right-button">
@@ -134,6 +137,7 @@ import { TranslateType } from '../../../../../define/enum/translate'
import { ContainsChineseOrPunctuation } from '../../../../../define/Tools/common'
import ImportWordAndSrt from '../../Original/Components/ImportWordAndSrt.vue'
import GetWaterMaskRectangle from '../../Watermark/GetWaterMaskRectangle.vue'
import MonitorStatus from './MonitorStatus.vue'
export default defineComponent({
components: {
@@ -141,7 +145,8 @@ export default defineComponent({
NCheckbox,
NDropdown,
NDivider,
GetWaterMaskRectangle
GetWaterMaskRectangle,
MonitorStatus
},
setup() {
@@ -0,0 +1,195 @@
<template>
<div style="display: flex; align-items: center; font-size: 12px; font-weight: bold">
<div style="border: 1px dashed #ccc; padding: 5px">
<div style="display: flex; align-items: center">
<div style="width: 75px">提示词</div>
<n-progress
type="line"
style="width: 100px; cursor: pointer"
status="info"
:percentage="gptPromptPercentage"
@click="ErrorPosition('gptPrompt')"
rail-color="#bbb"
indicator-placement="inside"
/>
</div>
<div
style="display: flex; align-items: center"
v-if="
reverseManageStore.selectBook.type == 'mj_reverse' ||
reverseManageStore.selectBook.type == 'sd_reverse'
"
>
<div style="width: 75px">反推提示词:</div>
<n-progress
type="line"
:class="test"
style="width: 100px; cursor: pointer"
status="info"
:percentage="reversePromptPercentage"
@click="ErrorPosition('reverseGptPrompt')"
rail-color="#bbb"
indicator-placement="inside"
/>
</div>
</div>
<div style="border: 1px dashed #ccc; padding: 5px; margin-left: 5px">
<div style="display: flex; align-items: center">
<div>提示词命令:</div>
<n-progress
type="line"
style="width: 100px; cursor: pointer"
status="info"
:percentage="promptPercentage"
rail-color="#bbb"
@click="ErrorPosition('prompt')"
indicator-placement="inside"
/>
</div>
</div>
<div style="border: 1px dashed #ccc; padding: 5px; margin-left: 5px">
<div style="display: flex; align-items: center">
<div>出图:</div>
<n-progress
type="line"
style="width: 100px; cursor: pointer"
status="info"
:percentage="imagePercentage"
@click="ErrorPosition('image')"
rail-color="#bbb"
indicator-placement="inside"
/>
</div>
</div>
</div>
</template>
<script setup>
import { ref, onMounted } from 'vue'
import { NProgress, useMessage } from 'naive-ui'
import { useReverseManageStore } from '../../../../../stores/reverseManage'
import { useSoftwareStore } from '../../../../../stores/software'
import { isEmpty } from 'lodash'
let gptPromptPercentage = ref(0)
let promptPercentage = ref(0)
let imagePercentage = ref(0)
let reversePromptPercentage = ref(0)
let reverseManageStore = useReverseManageStore()
let softwareStore = useSoftwareStore()
let message = useMessage()
let test = ref('error-class')
// 计算所有的数据的百分比
function ComputePercentage() {
debugger
if (
reverseManageStore &&
reverseManageStore.selectBookTaskDetail &&
reverseManageStore.selectBookTaskDetail.length > 0
) {
let total = reverseManageStore.selectBookTaskDetail.length
let gptPromptCount = 0
let promptCount = 0
let imageCount = 0
let reversePromptCount = 0
reverseManageStore.selectBookTaskDetail.forEach((item) => {
if (!isEmpty(item.gptPrompt)) {
gptPromptCount++
}
if (!isEmpty(item.prompt)) {
promptCount++
}
// 计算图片的百分比。这个条件比较复杂
if (item.outImagePath) {
imageCount++
}
if (item.reversePrompt && item.reversePrompt.length > 0) {
reversePromptCount++
}
})
// 计算推理提示词的百分比
gptPromptPercentage.value = Math.floor((gptPromptCount / total) * 100)
// 计算合并提示词的百分比
promptPercentage.value = Math.floor((promptCount / total) * 100)
imagePercentage.value = Math.floor((imageCount / total) * 100)
reversePromptPercentage.value = Math.floor((reversePromptCount / total) * 100)
}
}
onMounted(() => {
// 这边开始计算
ComputePercentage()
// 这边开始定时执行计算
setInterval(() => {
ComputePercentage()
}, 5000)
})
function ErrorPosition(type) {
let index = -1
softwareStore.skipRowIndex = 0
if (type == 'gptPrompt') {
// 找到第一个空的提示词数据
for (let i = 0; i < reverseManageStore.selectBookTaskDetail.length; i++) {
if (isEmpty(reverseManageStore.selectBookTaskDetail[i].gptPrompt)) {
index = i
break
}
}
} else if (type == 'reverseGptPrompt') {
for (let i = 0; i < reverseManageStore.selectBookTaskDetail.length; i++) {
let element = reverseManageStore.selectBookTaskDetail[i]
if (!element.reversePrompt || element.reversePrompt.length <= 0) {
index = i
break
}
}
} else if (type == 'prompt') {
for (let i = 0; i < reverseManageStore.selectBookTaskDetail.length; i++) {
if (isEmpty(reverseManageStore.selectBookTaskDetail[i].prompt)) {
index = i
break
}
}
} else if (type == 'image') {
for (let i = 0; i < reverseManageStore.selectBookTaskDetail.length; i++) {
if (isEmpty(reverseManageStore.selectBookTaskDetail[i].outImagePath)) {
index = i
break
}
}
} else {
message.error('未知的操作类型')
return
}
if (index == -1) {
message.success('全部已完成,不必跳转')
return
}
softwareStore.skip = {
skipRowIndex: index + 1,
clickCount: softwareStore.skip.clickCount++
}
}
</script>
<style>
.error-class {
color: red;
cursor: pointer;
}
</style>
@@ -1,6 +1,7 @@
<template>
<div>
<n-data-table
ref="datatable"
:columns="columns"
:data="reverseManageStore.selectBookTaskDetail"
:max-height="maxHeight"
@@ -10,8 +11,8 @@
</template>
<script>
import { ref, onMounted, defineComponent, onUnmounted, toRaw, h } from 'vue'
import { useMessage, NDataTable, NImage, NInput } from 'naive-ui'
import { ref, onMounted, defineComponent, watch, h } from 'vue'
import { useMessage, NDataTable, NImage } from 'naive-ui'
import { useSoftwareStore } from '../../../../../stores/software'
import { useReverseManageStore } from '../../../../../stores/reverseManage'
import DataTableShowGenerateImage from '../../Original/Components/DataTableShowGenerateImage.vue'
@@ -33,6 +34,17 @@ export default defineComponent({
let reverseManageStore = useReverseManageStore()
let message = useMessage()
let maxHeight = ref(0)
let datatable = ref(null)
watch(
() => softwareStore.skip,
(newValue) => {
let doc = document.querySelectorAll('.n-data-table-tr')
let sk = doc[newValue.skipRowIndex]
datatable.value.scrollTo({ el: sk })
},
{ deep: true }
)
const createColumns = () => [
{
@@ -152,7 +164,8 @@ export default defineComponent({
softwareStore,
reverseManageStore,
maxHeight,
columns: createColumns()
columns: createColumns(),
datatable
}
}
})
@@ -1,62 +1,67 @@
<template>
<div style="display: flex">
<n-button strong secondary @click="ReturnMain" size="small">返回</n-button>
<n-divider vertical style="height: 30px" />
<!-- <n-button strong secondary @click="ReturnMain" size="small">一键全自动</n-button>
<div style="display: flex; align-items: center">
<div style="display: flex">
<n-button strong secondary @click="ReturnMain" size="small">返回</n-button>
<n-divider vertical style="height: 30px" />
<!-- <n-button strong secondary @click="ReturnMain" size="small">一键全自动</n-button>
<n-divider vertical style="height: 30px" /> -->
<n-button :color="softwareStore.SoftColor.ORANGE" @click="ImportWord" size="small"
>导入字幕/SRT</n-button
>
<n-button
:color="softwareStore.SoftColor.ORANGE"
style="margin-left: 10px"
@click="CharacterLibrary"
size="small"
>角色分析标签集</n-button
>
<n-button
:color="softwareStore.SoftColor.ORANGE"
style="margin-left: 10px"
@click="ImportPrompt"
size="small"
>导入提示词</n-button
>
<n-dropdown trigger="hover" :options="GptButtonOptions" @select="ButtonSelect">
<n-button :color="softwareStore.SoftColor.ORANGE" @click="ImportWord" size="small"
>导入字幕/SRT</n-button
>
<n-button
:color="softwareStore.SoftColor.ORANGE"
style="margin-left: 10px"
@click="GetPromptAll"
@click="CharacterLibrary"
size="small"
>一键推理提示词</n-button
>角色分析标签集</n-button
>
</n-dropdown>
<n-dropdown trigger="hover" :options="GenerateImageOptions" @select="ButtonSelect">
<n-button
:color="softwareStore.SoftColor.ORANGE"
style="margin-left: 10px"
@click="GenerateImageAll(true)"
@click="ImportPrompt"
size="small"
>生成所有的图片</n-button
>导入提示词</n-button
>
</n-dropdown>
<n-dropdown trigger="hover" :options="GptButtonOptions" @select="ButtonSelect">
<n-button
:color="softwareStore.SoftColor.ORANGE"
style="margin-left: 10px"
@click="GetPromptAll"
size="small"
>一键推理提示词</n-button
>
</n-dropdown>
<n-dropdown trigger="hover" :options="GenerateImageOptions" @select="ButtonSelect">
<n-button
:color="softwareStore.SoftColor.ORANGE"
style="margin-left: 10px"
@click="GenerateImageAll(true)"
size="small"
>生成所有的图片</n-button
>
</n-dropdown>
<n-dropdown trigger="hover" :options="ResetDataOptions" @select="ButtonSelect">
<n-button
:color="softwareStore.SoftColor.ORANGE"
style="margin-left: 10px"
@click="resetALLData"
size="small"
>重置数据</n-button
>
</n-dropdown>
<n-dropdown trigger="hover" :options="ResetDataOptions" @select="ButtonSelect">
<n-button
:color="softwareStore.SoftColor.ORANGE"
style="margin-left: 10px"
@click="resetALLData"
@click="OpenPromptSetting"
size="small"
>重置数据</n-button
>设置</n-button
>
</n-dropdown>
<n-button
:color="softwareStore.SoftColor.ORANGE"
style="margin-left: 10px"
@click="OpenPromptSetting"
size="small"
>设置</n-button
>
</div>
<div style="margin-left: 10px">
<MonitorStatus />
</div>
</div>
</template>
@@ -68,6 +73,7 @@ import { useReverseManageStore } from '../../../../../stores/reverseManage'
import ImportWordAndSrt from '../Components/ImportWord/ImportWordAndSrt.vue'
import CharacterAnalyze from '../Components/PresetLibrary/CharacterAnalyze.vue'
import PromptSetting from '../../Original/Components/PromptSetting.vue'
import MonitorStatus from '../Components/MonitorStatus.vue'
import {
BookBackTaskType,
BookImageCategory,
@@ -1,7 +1,9 @@
<template>
<div>
<n-data-table
ref="datatable"
id="1111"
classMame="cd-22223"
:max-height="maxHeight"
:loading="softwareStore.loading.originDatatableDataLoading"
:row-key="rowKey"
@@ -16,31 +18,8 @@
</template>
<script setup>
import {
ref,
h,
onMounted,
defineComponent,
onUnmounted,
watch,
toRaw,
render,
onBeforeUnmount,
provide,
nextTick
} from 'vue'
import {
NDataTable,
NImage,
useMessage,
NInput,
NButton,
NSwitch,
NPopover,
useDialog,
NCheckbox,
NIcon
} from 'naive-ui'
import { ref, h, onMounted, watch } from 'vue'
import { NDataTable, useMessage } from 'naive-ui'
import DatatableHeaderAfterGpt from '../Components/DatatableHeaderAfterGpt.vue'
import DatatableAfterGpt from '../Components/DatatableAfterGpt.vue'
import ODatatableHeaderCharacterAndScene from './ODataTableHeaderCharacterAndScene.vue'
@@ -54,11 +33,21 @@ import DatatableHeaderGenerateImage from '../Components/DatatableHeaderGenerateI
import DatatableGenerateImage from '../Components/DatatableGenerateImage.vue'
import { useReverseManageStore } from '../../../../../stores/reverseManage'
import { useSoftwareStore } from '../../../../../stores/software'
import { set } from 'lodash'
let reverseManageStore = useReverseManageStore()
let softwareStore = useSoftwareStore()
let maxHeight = ref(0)
let message = useMessage()
let datatable = ref(null)
watch(
() => softwareStore.skip,
(newValue) => {
let doc = document.querySelectorAll('.n-data-table-tr')
let sk = doc[newValue.skipRowIndex]
datatable.value.scrollTo({ el: sk })
},
{ deep: true }
)
onMounted(async () => {
setTimeout(() => {
@@ -14,7 +14,7 @@
</n-form-item>
<n-form-item label="选择预设" path="gptData">
<n-select
style="width: 160px"
style="width: 200px"
v-model:value="formValue.gptData"
:options="gptDataOptions"
placeholder="请选择提示词数据"
@@ -37,6 +37,25 @@
<n-button type="primary" @click="ActionStart">开始生成</n-button>
</n-form-item>
</n-form>
<n-form :model="formValue" inline label-placement="left">
<n-form-item path="isStream">
<n-checkbox label="是否流式发送" v-model:checked="formValue.isStream" />
</n-form-item>
<n-form-item path="isSplit">
<n-checkbox label="是否拆分发送" v-model:checked="formValue.isSplit" />
</n-form-item>
<n-form-item label="每次发送字符" path="splitNumber">
<n-input-number
v-model:value="formValue.splitNumber"
:min="1"
:show-button="false"
:max="99999"
></n-input-number>
</n-form-item>
<n-form-item path="splitNumber">
<div style="color: red">注意爆款开头不要分段发送</div>
</n-form-item>
</n-form>
</div>
<div style="display: flex; width: 100%">
<div style="flex: 1; margin-right: 10px">
@@ -61,21 +80,46 @@
<script>
import { ref, onMounted, defineComponent, onUnmounted, toRaw, watch, h } from 'vue'
import { useMessage, useDialog, NForm, NFormItem, NInput, NSelect, NButton, NIcon } from 'naive-ui'
import {
useMessage,
useDialog,
NForm,
NFormItem,
NInput,
NSelect,
NButton,
NIcon,
NCheckbox,
NInputNumber
} from 'naive-ui'
import { SettingsOutline } from '@vicons/ionicons5'
import ManageAISetting from './ManageAISetting.vue'
import { useSoftwareStore } from '../../../../stores/software'
import { isEmpty } from 'lodash'
import { DEFINE_STRING } from '../../../../define/define_string'
export default defineComponent({
components: { NForm, NFormItem, NInput, NSelect, NButton, NIcon, SettingsOutline },
components: {
NForm,
NFormItem,
NInput,
NSelect,
NButton,
NIcon,
SettingsOutline,
NCheckbox,
NInputNumber
},
setup() {
let message = useMessage()
let dialog = useDialog()
let formValue = ref({
gptType: undefined,
gptData: undefined,
gptAI: undefined
gptAI: undefined,
isStream: true,
isSplit: false,
splitNumber: 1000
})
let oldWord = ref(undefined)
let newWord = ref(undefined)
@@ -110,8 +154,41 @@ export default defineComponent({
allPromptDataOptions.value = gptRes.data.promptData
}
function debounce(func, wait) {
let timeoutId
let shouldExecute = true
return function (...args) {
const context = this
if (shouldExecute) {
func.apply(context, args)
shouldExecute = false
timeoutId = setTimeout(() => {
shouldExecute = true
}, wait)
} else {
clearTimeout(timeoutId)
timeoutId = setTimeout(() => {
shouldExecute = true
}, wait)
}
}
}
let UpdateWord = debounce((value) => {
newWord.value = value
}, 500)
onMounted(async () => {
await InitServerGptOptions()
// 这边监听流式返回数据
window.api.setEventListen([DEFINE_STRING.GPT.GPT_STREAM_RETURN], (value) => {
UpdateWord(value)
})
})
onUnmounted(() => {
window.api.removeEventListen(DEFINE_STRING.GPT.GPT_STREAM_RETURN)
})
let ruleObj = (errorMessage) => {
@@ -1,7 +1,7 @@
<template>
<div>
<div id="video-canvas">
<video ref="videoRef" muted :src="videoSrc" id="video" autoplay></video>
<video style="width: 800px" ref="videoRef" muted :src="videoSrc" id="video" autoplay></video>
<canvas
ref="canvasRef"
@mousemove="handleMouseMove"
@@ -91,10 +91,7 @@ export default defineComponent({
let reverseManageStore = useReverseManageStore()
let videoRef = ref(null)
let canvasRef = ref(null)
let videoSrc = ref(
props.videoSrc ||
'D:\\文\\物价暴跌百万倍,我成了神豪-七猫\\1\\价暴跌百万倍,我成了神豪1_output_crop_00001.mp4'
)
let videoSrc = ref(props.videoSrc)
let type = ref(props.type ? props.type : SubtitleSavePositionType.MAIN_VIDEO)
let mark = ref(props.mark)
let videoWidth = ref(props.videoWidth == null ? 800 : props.videoWidth)
@@ -120,7 +117,6 @@ export default defineComponent({
setTimeout(() => {
video.play()
isPlaying.value = true
debugger
let { width, height } = video.getBoundingClientRect()
canvasRef.value.width = width
canvasRef.value.height = height