This commit is contained in:
2024-05-26 12:12:15 +08:00
parent 17709c1a0b
commit 941a86d07a
23 changed files with 994 additions and 738 deletions
+14 -5
View File
@@ -14,18 +14,27 @@
import { defineComponent, ref, onMounted } from 'vue'
import hljs from 'highlight.js/lib/core'
import javascript from 'highlight.js/lib/languages/javascript'
import { NMessageProvider, NDialogProvider, NConfigProvider, darkTheme, NNotificationProvider } from "naive-ui"
import {
NMessageProvider,
NDialogProvider,
NConfigProvider,
darkTheme,
NNotificationProvider
} from 'naive-ui'
hljs.registerLanguage('javascript', javascript)
export default defineComponent({
components: {
NConfigProvider, NDialogProvider, NMessageProvider, NNotificationProvider
NConfigProvider,
NDialogProvider,
NMessageProvider,
NNotificationProvider
},
setup() {
let themeData = ref("");
let themeData = ref('')
onMounted(() => {
window.api.getSettingDafultData(async (value) => {
themeData.value = value.theme;
themeData.value = value.theme
await window.darkMode.toggle(value.theme)
})
})
@@ -34,7 +43,7 @@ export default defineComponent({
javascript,
hljs,
darkTheme,
themeData
themeData,
}
}
})
@@ -1,387 +1,452 @@
<template>
<div>一键矩阵功能有对应的字幕配置文件直接自动的生图高清合成视频 <span
style="margin-left: 20px ;font-size: 20px; color: red;">注意前三步还是必做</span></div>
<n-form ref="configRef" inline :model="config" :rules="rules">
<n-form-item label="SRT字幕文件" path="srt_path">
<n-input disabled v-model:value="config.srt_path" placeholder="选择SRT文件" />
<n-button color="#e5a84b" @click="SelectSrt">
<n-icon :size="20">
<folder-open />
</n-icon>
</n-button>
</n-form-item>
<n-form-item label="配音文件" path="audio_path">
<n-input disabled="" v-model:value="config.audio_path" placeholder="选择配音文件" />
<n-button color="#e5a84b" @click="SelectAudio">
<n-icon :size="20">
<folder-open />
</n-icon>
</n-button>
</n-form-item>
<n-form-item label="背景音乐文件夹" path="background_music">
<n-select style="width: 300px;" v-model:value="config.background_music" :options="background_music_options"
placeholder="选择背景音乐文件夹" />
</n-form-item>
<n-form-item>
<n-button :type="buttonLabel.type" @click="AutoConditionCheck">
{{ buttonLabel.label }}
</n-button>
</n-form-item>
<n-form-item>
<n-button type="success" @click="ActionTask">
一键全自动
</n-button>
</n-form-item>
</n-form>
<n-divider />
<n-data-table :columns="columns" :data="data" size="small" />
<div>
一键矩阵功能有对应的字幕配置文件直接自动的生图高清合成视频
<span style="margin-left: 20px; font-size: 20px; color: red">注意前三步还是必做</span>
</div>
<n-form ref="configRef" inline :model="config" :rules="rules">
<n-form-item label="SRT字幕文件" path="srt_path">
<n-input disabled v-model:value="config.srt_path" placeholder="选择SRT文件" />
<n-button color="#e5a84b" @click="SelectSrt">
<n-icon :size="20">
<folder-open />
</n-icon>
</n-button>
</n-form-item>
<n-form-item label="配音文件" path="audio_path">
<n-input disabled="" v-model:value="config.audio_path" placeholder="选择配音文件" />
<n-button color="#e5a84b" @click="SelectAudio">
<n-icon :size="20">
<folder-open />
</n-icon>
</n-button>
</n-form-item>
<n-form-item label="背景音乐文件夹" path="background_music">
<n-select
style="width: 300px"
v-model:value="config.background_music"
:options="background_music_options"
placeholder="选择背景音乐文件夹"
/>
</n-form-item>
<n-form-item>
<n-button :type="buttonLabel.type" @click="AutoConditionCheck">
{{ buttonLabel.label }}
</n-button>
</n-form-item>
<n-form-item>
<n-button type="success" @click="ActionTask"> 一键全自动 </n-button>
</n-form-item>
</n-form>
<n-divider />
<n-data-table
:columns="columns"
:data="data"
size="small"
:row-key="rowKey"
@update:checked-row-keys="SelectCheck"
/>
</template>
<script>
import { defineComponent, ref, onMounted, toRaw, h, onUnmounted } from "vue";
import { NSelect, NForm, NFormItem, NButton, NInput, NIcon, NPopover, useMessage, NDivider, NDataTable, NTag } from "naive-ui"
import { defineComponent, ref, onMounted, toRaw, h, onUnmounted } from 'vue'
import {
NSelect,
NForm,
NFormItem,
NButton,
NInput,
NIcon,
NPopover,
useMessage,
NDivider,
NDataTable,
NTag
} from 'naive-ui'
import { FolderOpenSharp as FolderOpen } from '@vicons/ionicons5'
import { DEFINE_STRING } from "../../../../define/define_string";
import { DEFINE_STRING } from '../../../../define/define_string'
import { cloneDeep } from 'lodash'
function statusAndMessage(row) {
if (row.status == 'wait') {
return {
tagLabel: "等待中",
color: '',
type: "warning"
}
} else if (row.status == 'queue') {
return {
tagLabel: "队列中",
color: '',
type: "info"
}
} else if (row.status == 'ok') {
return {
tagLabel: "生图完成(未高清)",
color: { color: "#2ed573", textColor: '#ffffff' },
type: ""
}
if (row.status == 'wait') {
return {
tagLabel: '等待中',
color: '',
type: 'warning'
}
else if (row.status == 'error') {
return {
tagLabel: "生图错误",
color: "",
type: "error"
}
} else if (row.status == 'queue') {
return {
tagLabel: '队列中',
color: '',
type: 'info'
}
else if (row.status == "video_improvied") {
return {
tagLabel: "高清完成",
color: { color: "#70a1ff", textColor: '#ffffff' },
type: ""
}
} else if (row.status == "video_improving") {
return {
tagLabel: "高清中",
color: { color: "#fedc5e", textColor: '#ffffff' },
type: ""
}
} else if (row.status == "video_improvie_error") {
return {
tagLabel: "高清失败",
color: { color: "#d23918", textColor: '#ffffff' },
type: ""
}
} else if (row.status == 'ok') {
return {
tagLabel: '生图完成(未高清)',
color: { color: '#2ed573', textColor: '#ffffff' },
type: ''
}
else if (row.status == "video_queue") {
return {
tagLabel: "合成队列中",
color: { color: "#55efc4", textColor: '#ffffff' },
type: ""
}
} else if (row.status == "video_error") {
return {
tagLabel: "合成失败",
color: { color: "#ff4757", textColor: '#ffffff' },
type: ""
}
} else if (row.status == "video_ok") {
return {
tagLabel: "合成完成",
color: { color: "#1dd1a1", textColor: '#ffffff' },
type: ""
}
} else {
return {
tagLabel: "状态错误",
color: { color: "#d2dae2", textColor: '#ffffff' },
type: ""
}
} else if (row.status == 'error') {
return {
tagLabel: '生图错误',
color: '',
type: 'error'
}
} else if (row.status == 'video_improvied') {
return {
tagLabel: '高清完成',
color: { color: '#70a1ff', textColor: '#ffffff' },
type: ''
}
} else if (row.status == 'video_improving') {
return {
tagLabel: '高清中',
color: { color: '#fedc5e', textColor: '#ffffff' },
type: ''
}
} else if (row.status == 'video_improvie_error') {
return {
tagLabel: '高清失败',
color: { color: '#d23918', textColor: '#ffffff' },
type: ''
}
} else if (row.status == 'video_queue') {
return {
tagLabel: '合成队列中',
color: { color: '#55efc4', textColor: '#ffffff' },
type: ''
}
} else if (row.status == 'video_error') {
return {
tagLabel: '合成失败',
color: { color: '#ff4757', textColor: '#ffffff' },
type: ''
}
} else if (row.status == 'video_ok') {
return {
tagLabel: '合成完成',
color: { color: '#1dd1a1', textColor: '#ffffff' },
type: ''
}
} else {
return {
tagLabel: '状态错误',
color: { color: '#d2dae2', textColor: '#ffffff' },
type: ''
}
}
}
const createColumns = ({
RemoveTask
}) => {
return [
{
title: "批次名称",
key: "out_folder"
},
const createColumns = ({ RemoveTask }) => {
return [
{
type: 'selection'
},
{
title: '批次名称',
key: 'out_folder'
},
{
title: "状态",
key: "status",
render(row) {
return h(
NTag,
{
type: (() => statusAndMessage(row))().type,
color: (() => statusAndMessage(row))().color,
bordered: false
},
{
default: (() => statusAndMessage(row).tagLabel)
}
);
}
},
{
title: "操作",
key: "actions",
render(row) {
return h(
NButton,
{
size: "small",
type: "warning",
onClick: async () => await RemoveTask(row)
},
{ default: () => "停止任务" }
);
}
}
];
};
{
title: '状态',
key: 'status',
render(row) {
return h(
NTag,
{
type: (() => statusAndMessage(row))().type,
color: (() => statusAndMessage(row))().color,
bordered: false
},
{
default: () => statusAndMessage(row).tagLabel
}
)
}
},
{
title: '操作',
key: 'actions',
render(row) {
return h(
NButton,
{
size: 'small',
type: 'warning',
onClick: async () => await RemoveTask(row)
},
{ default: () => '停止任务' }
)
}
}
]
}
export default defineComponent({
components: {
NSelect, NForm, NFormItem, NButton, NInput, NIcon, FolderOpen, NPopover, NDivider, NDataTable, NTag
},
setup() {
let config = ref({
srt_path: null,
audio_path: null,
draft_srt_style: "0",
background_music: null,
friendly_reminder: "0"
components: {
NSelect,
NForm,
NFormItem,
NButton,
NInput,
NIcon,
FolderOpen,
NPopover,
NDivider,
NDataTable,
NTag
},
setup() {
let config = ref({
srt_path: null,
audio_path: null,
draft_srt_style: '0',
background_music: null,
friendly_reminder: '0'
})
let background_music_options = ref([])
let configRef = ref(null)
let message = useMessage()
let buttonLabel = ref({
label: '未进行条件检测',
type: 'warning'
})
let data = ref([])
let selectRowKeysRef = ref([])
onMounted(async () => {
// 获取队列信息
// 获取背景音乐文件夹信息
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
}
background_music_options.value.push(obj)
}
})
// 获取上一次选择的字幕,配音。未年检
await window.api.GetVideoGenerateConfig((value) => {
if (value.code == 0) {
message.error('获取初始化数据失败')
return
}
config.value.srt_path = value.data.srt_path
config.value.audio_path = value.data.audio_path
config.value.background_music = value.data.background_music
})
// 获取初始化数据(队列任务-这边不能添加)
await window.api.GetGenerateTaskList((value) => {
debugger
console.log(value)
data.value = value.data.task_list
})
// 监听状态刷新事件
window.api.setEventListen([DEFINE_STRING.VIDEO_GENERATE_STATUS_REFRESH], (value) => {
debugger
console.log(value)
let index = data.value.findIndex((item) => item.id == value.id)
if (index < 0) {
return
}
// 修改
data.value[index].status = value.status
})
})
onUnmounted(() => {
window.api.removeEventListen(DEFINE_STRING.VIDEO_GENERATE_STATUS_REFRESH)
})
/**
* 全自动条件检测
*/
async function AutoConditionCheck(e) {
e.preventDefault()
configRef.value?.validate(async (errors) => {
debugger
if (errors) {
message.error('请检查必填字段')
return
}
await window.api.AutoConditionCheck(toRaw(config.value), (value) => {
if (value.code == 0) {
message.error(value.message)
buttonLabel.value = {
label: '条件检测失败',
type: 'error'
}
return
}
message.success('条件检测成功')
buttonLabel.value = {
label: '条件检测成功',
type: 'success'
}
})
let background_music_options = ref([]);
let configRef = ref(null);
let message = useMessage();
let buttonLabel = ref({
label: "未进行条件检测",
type: "warning"
})
let data = ref([]);
onMounted(async () => {
// 获取队列信息
// 获取背景音乐文件夹信息
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,
}
background_music_options.value.push(obj);
}
})
// 获取上一次选择的字幕,配音。未年检
await window.api.GetVideoGenerateConfig((value) => {
if (value.code == 0) {
message.error("获取初始化数据失败");
return;
}
config.value.srt_path = value.data.srt_path;
config.value.audio_path = value.data.audio_path;
config.value.background_music = value.data.background_music;
})
// 获取初始化数据(队列任务-这边不能添加)
await window.api.GetGenerateTaskList((value) => {
debugger;
console.log(value)
data.value = value.data.task_list;
})
// 监听状态刷新事件
window.api.setEventListen([DEFINE_STRING.VIDEO_GENERATE_STATUS_REFRESH], (value) => {
debugger;
console.log(value)
let index = data.value.findIndex(item => item.id == value.id);
if (index < 0) {
return;
}
// 修改
data.value[index].status = value.status;
})
})
onUnmounted(() => {
window.api.removeEventListen(DEFINE_STRING.VIDEO_GENERATE_STATUS_REFRESH);
})
/**
* 全自动条件检测
*/
async function AutoConditionCheck(e) {
e.preventDefault();
configRef.value?.validate(async (errors) => {
debugger
if (errors) {
message.error("请检查必填字段");
return;
}
await window.api.AutoConditionCheck(toRaw(config.value), (value) => {
if (value.code == 0) {
message.error(value.message);
buttonLabel.value = {
label: "条件检测失败",
type: "error"
}
return;
}
message.success("条件检测成功");
buttonLabel.value = {
label: "条件检测成功",
type: "success"
}
})
});
}
/**
* 开始执行全自动任务
*/
async function ActionTask(e) {
e.preventDefault();
configRef.value?.validate(async (errors) => {
debugger
if (errors) {
message.error("请检查必填字段");
return;
}
if (buttonLabel.value.type != "success") {
message.error("请先进行条件检测");
return;
}
// 像后端传递传递开始任务
await window.api.ActionAutoVideoTask([[...toRaw(data.value)], toRaw(config.value)], (value) => {
debugger;
console.log(value);
// let index = data.value.findIndex(item=>item.id == value)
window.api.showGlobalMessageDialog(value)
})
});
}
/**
* 选择对应的字幕文件
*/
async function SelectSrt() {
window.api.SelectFile(['srt'], (value) => {
if (value.code == 0) {
message.error(value.message);
return;
}
config.value.srt_path = value.value;
});
}
/**
* 选择对应的字幕文件
*/
async function SelectAudio() {
window.api.SelectFile(['mp3', 'wav'], (value) => {
if (value.code == 0) {
message.error(value.message);
return;
}
config.value.audio_path = value.value;
});
}
/**
* 移除任务
* @param {*} row
*/
async function RemoveTask(row) {
// 先删除出现的任务
await window.api.DeleteBackTask([DEFINE_STRING.QUEUE_BATCH.AUTO_VIDEO_GENERATE, "all", `${row.out_folder}_image`], async (value) => {
if (value.code == 0) {
message.error(value.message);
return;
}
// 在删除高清任务
await window.api.DeleteBackTask([DEFINE_STRING.QUEUE_BATCH.AUTO_VIDEO_GENERATE, "all", `${row.out_folder}_improve`], async (value) => {
if (value.code == 0) {
message.error(value.message);
return;
}
// 在删除和合成视频任务
await window.api.DeleteBackTask([DEFINE_STRING.QUEUE_BATCH.AUTO_VIDEO_GENERATE, "all", `${row.out_folder}_video`], async (value) => {
if (value.code == 0) {
message.error(value.message);
return;
}
await window.api.ModifyGenerateTaskStatus(['out_folder', row.out_folder, 'wait'], (value) => {
if (value.code == 0) {
message.error(value.message);
return;
}
})
})
})
})
}
return {
config,
SelectSrt,
SelectAudio,
background_music_options,
AutoConditionCheck,
ActionTask,
configRef,
buttonLabel,
data,
columns: createColumns({
RemoveTask
}),
rules: {
srt_path: {
required: true,
message: "请输入SRT文件",
trigger: ["input", "blur"]
},
audio_path: {
required: true,
message: "请选择配音文件",
trigger: ["input", "blur"]
},
background_music: {
required: true,
message: "请选择背景音乐",
trigger: ["input", "blur"]
}
},
}
})
}
/**
* 开始执行全自动任务
*/
async function ActionTask(e) {
e.preventDefault()
configRef.value?.validate(async (errors) => {
debugger
console.log(selectRowKeysRef.value)
if (selectRowKeysRef.value.length <= 0) {
message.error('请选择要操作的任务')
return
}
if (errors) {
message.error('请检查必填字段')
return
}
if (buttonLabel.value.type != 'success') {
message.error('请先进行条件检测')
return
}
// 这边进行数据的处理
let tmp_data = cloneDeep(toRaw(data.value))
let end_data = []
for (let i = 0; i < selectRowKeysRef.value.length; i++) {
const element = selectRowKeysRef.value[i]
let index = tmp_data.findIndex((item) => item.id == element)
if (index >= 0) {
end_data.push(tmp_data[index])
}
}
// 像后端传递传递开始任务
await window.api.ActionAutoVideoTask([end_data, toRaw(config.value)], (value) => {
// let index = data.value.findIndex(item=>item.id == value)
window.api.showGlobalMessageDialog(value)
})
})
}
/**
* 选择对应的字幕文件
*/
async function SelectSrt() {
window.api.SelectFile(['srt'], (value) => {
if (value.code == 0) {
message.error(value.message)
return
}
config.value.srt_path = value.value
})
}
/**
* 选择对应的字幕文件
*/
async function SelectAudio() {
window.api.SelectFile(['mp3', 'wav'], (value) => {
if (value.code == 0) {
message.error(value.message)
return
}
config.value.audio_path = value.value
})
}
/**
* 移除任务
* @param {*} row
*/
async function RemoveTask(row) {
// 先删除出现的任务
await window.api.DeleteBackTask(
[DEFINE_STRING.QUEUE_BATCH.AUTO_VIDEO_GENERATE, 'all', `${row.out_folder}_image`],
async (value) => {
if (value.code == 0) {
message.error(value.message)
return
}
// 在删除高清任务
await window.api.DeleteBackTask(
[DEFINE_STRING.QUEUE_BATCH.AUTO_VIDEO_GENERATE, 'all', `${row.out_folder}_improve`],
async (value) => {
if (value.code == 0) {
message.error(value.message)
return
}
// 在删除和合成视频任务
await window.api.DeleteBackTask(
[DEFINE_STRING.QUEUE_BATCH.AUTO_VIDEO_GENERATE, 'all', `${row.out_folder}_video`],
async (value) => {
if (value.code == 0) {
message.error(value.message)
return
}
await window.api.ModifyGenerateTaskStatus(
['out_folder', row.out_folder, 'wait'],
(value) => {
if (value.code == 0) {
message.error(value.message)
return
}
}
)
}
)
}
)
}
)
}
async function SelectCheck(rowKeys) {
selectRowKeysRef.value = rowKeys
}
return {
config,
SelectSrt,
SelectAudio,
background_music_options,
AutoConditionCheck,
ActionTask,
configRef,
buttonLabel,
SelectCheck,
data,
selectRowKeysRef,
rowKey: (row) => row.id,
columns: createColumns({
RemoveTask
}),
rules: {
srt_path: {
required: true,
message: '请输入SRT文件',
trigger: ['input', 'blur']
},
audio_path: {
required: true,
message: '请选择配音文件',
trigger: ['input', 'blur']
},
background_music: {
required: true,
message: '请选择背景音乐',
trigger: ['input', 'blur']
}
}
}
}
})
</script>
</script>
@@ -55,7 +55,7 @@ export default defineComponent({
})
function OpenTeachDoc() {
window.api.OpenUrl("https://pvwu1oahp5m.feishu.cn/docx/CAjGdTDlboJ3nVx0cQccOuNHnvd?from=from_copylink");
window.api.OpenUrl("https://rvgyir5wk1c.feishu.cn/docx/RZYCdG7ZpoKsIzxBEzccNEIFn8f?from=from_copylink");
}
function OpenQueDoc() {
+399 -315
View File
@@ -1,327 +1,411 @@
<template>
<n-space vertical>
<n-layout has-sider style="height: 100vh; position: relative;">
<n-layout-sider bordered collapse-mode="width" :collapsed-width="64" :width="220" :collapsed="collapsed"
show-trigger @collapse="collapsed = true" @expand="collapsed = false">
<n-menu :collapsed="collapsed" :collapsed-width="64" :collapsed-icon-size="22" :options="menuOptions"
:render-icon="renderMenuIcon" :expand-icon="expandIcon" />
</n-layout-sider>
<n-layout-content content-style="padding:30px">
<!-- <Setting></Setting> -->
<router-view></router-view>
</n-layout-content>
</n-layout>
</n-space>
<n-space vertical>
<n-layout has-sider style="height: 100vh; position: relative">
<n-layout-sider
bordered
collapse-mode="width"
:collapsed-width="64"
:width="220"
:collapsed="collapsed"
show-trigger
@collapse="collapsed = true"
@expand="collapsed = false"
>
<n-menu
:collapsed="collapsed"
:collapsed-width="64"
:collapsed-icon-size="22"
:options="menuOptions"
:render-icon="renderMenuIcon"
:expand-icon="expandIcon"
/>
</n-layout-sider>
<n-layout-content content-style="padding:30px">
<!-- <Setting></Setting> -->
<router-view></router-view>
</n-layout-content>
</n-layout>
</n-space>
</template>
<script>
import { ref, h, onMounted, defineComponent, toRaw } from "vue"
import { RouterLink } from "vue-router"
import { NMenu, NSpace, NLayout, NLayoutSider, NLayoutContent, NIcon, useDialog, useNotification, useMessage, NSwitch, NButton } from "naive-ui";
import { ref, h, onMounted, defineComponent, toRaw } from 'vue'
import { RouterLink } from 'vue-router'
import {
NMenu,
NSpace,
NLayout,
NLayoutSider,
NLayoutContent,
NIcon,
useDialog,
useNotification,
useMessage,
NSwitch,
NButton
} from 'naive-ui'
import { BookmarkOutline, CaretDownOutline } from "@vicons/ionicons5";
import CheckMachineId from "../Components/CheckMachineId.vue"
import axios from 'axios';
import { DEFINE_STRING } from "../../../../define/define_string.js"
import { BookmarkOutline, CaretDownOutline } from '@vicons/ionicons5'
import CheckMachineId from '../Components/CheckMachineId.vue'
import axios from 'axios'
import { DEFINE_STRING } from '../../../../define/define_string.js'
import ShowMessage from './ShowMessage.vue'
import { MD5 } from 'crypto-js'
import InputDialogContent from '../Original/Components/InputDialogContent.vue'
export default defineComponent({
components: {
NMenu, NSpace, NLayout, NLayoutSider, NLayoutContent, NIcon, ShowMessage, NSwitch, NButton
},
setup() {
let collapsed = ref(false);
let dialog = useDialog();
let machineRef = ref();
let message = useMessage();
let notification = useNotification();
components: {
NMenu,
NSpace,
NLayout,
NLayoutSider,
NLayoutContent,
NIcon,
ShowMessage,
NSwitch,
NButton
},
setup() {
let collapsed = ref(false)
let dialog = useDialog()
let machineRef = ref()
let message = useMessage()
let notification = useNotification()
function renderMenuIcon(option) {
if (option.key === "sheep-man")
return true;
if (option.key === "food")
return null;
return h(NIcon, null, { default: () => h(BookmarkOutline) });
}
let key_down_ref = ref(null)
onMounted(async () => {
// 加载版本
await window.api.GetVersion((value) => {
document.title = "LAITool " + value;
})
window.api.setEventListen([DEFINE_STRING.SHOW_MESSAGE_DIALOG], (value) => {
let message = value.message;
let type = "success";
let title = "成功"
if (value.code == 0) {
type = "error";
title = "成功但失败"
} else if (value.code == 2) {
type = "warning",
title = "警告"
}
dialog.create({
type: type,
title: title,
showIcon: true,
content: message,
style: `width : 400px;`,
maskClosable: false,
positiveText: "确定",
})
})
window.api.setEventListen([DEFINE_STRING.SHOW_MAIN_NOTIFICATION], (value) => {
let message = value.message;
let type = "success";
let title = "成功"
if (value.code == 0) {
type = "error";
title = "失败"
} else if (value.code == 2) {
type = "warning";
title = "警告"
}
notification.create({
type: type,
title: title,
content: message,
keepAliveOnHover: true,
duration: 2500,
})
})
// 弹窗,获取机器码
dialog.create({
showIcon: false,
content: () => h(CheckMachineId, { ref: machineRef }),
style: `width : 400px; height: 300px`,
maskClosable: false,
positiveText: "确定",
onClose: () => {
// 关闭程序
window.api.QuitApp();
return false;
},
onEsc: () => {
// 关闭程序
window.api.QuitApp();
return false;
},
onPositiveClick: async () => {
debugger
await new Promise(async (resolve, reject) => {
await window.api.CheckMachineId(toRaw(machineRef.value.machineId), (value) => {
if (value.code == 0) {
message.error(value.message);
reject();
} else {
resolve();
}
});
});
}
})
window.api.getSettingDafultData(async (value) => {
window.config = value;
})
})
function expandIcon(value) {
return h(NIcon, null, { default: () => h(CaretDownOutline) });
}
const menuOptions = [
{
label: () => h(
RouterLink,
{
to: {
name: "sdoriginal",
}
},
{
default: () => "原创生图"
}
),
key: "sdoriginal",
},
{
label: "反推矩阵",
key: "backward_matrix",
children: [
{
label: () => h(
RouterLink,
{
to: {
name: "getframe",
}
},
{ default: () => "抽帧" }
),
key: "backward_frame"
},
{
label: () => h(
RouterLink,
{
to: {
name: "copywriting",
}
},
{ default: () => "文案洗稿" }
),
key: "copywriting"
},
{
label: () => h(
RouterLink,
{
to: {
name: "pushBackPrompt",
}
},
{ default: () => "反推提示词" }
),
key: "push_back"
},
{
label: () => h(
RouterLink,
{
to: {
name: "regenerate",
}
},
{ default: () => "批次生成" }
),
key: "regenerate"
},
{
label: () => h(
RouterLink,
{
to: {
name: "VideoGenerate",
}
},
{ default: () => "重绘/视频合成" }
),
key: "VideoGenerate"
}
]
},
// {
// label: "剪辑",
// key: "clip_options",
// children: [
// {
// label: () => h(
// RouterLink,
// {
// to: {
// name: "align_draft",
// }
// },
// { default: () => "剪映草稿对齐" }
// ),
// key: "align_draft"
// },
// {
// label: () => h(
// RouterLink,
// {
// to: {
// name: "add_draft",
// }
// },
// { default: () => "添加剪映草稿" }
// ),
// key: "add_draft"
// }
// ]
// },
{
label: "设置",
key: "setting",
children: [
{
label: () => h(
RouterLink,
{
to: {
name: "global_setting",
}
},
{ default: () => "通用设置" }
),
key: "global_setting"
},
{
label: () => h(
RouterLink,
{
to: {
name: "clip_setting",
}
},
{ default: () => "剪映设置" }
),
key: "clip_setting"
},
{
label: () => h(
RouterLink,
{
to: {
name: "videogeneratesetting",
}
},
{ default: () => "生成视频设置" }
),
key: "videogeneratesetting"
},
{
label: () => h(
RouterLink,
{
to: {
name: "sd_setting",
}
},
{ default: () => "SD设置" }
),
key: "sd_setting"
},
{
label: () => h(
RouterLink,
{
to: {
name: "mj_setting",
}
},
{ default: () => "MJ设置" }
),
key: "mj_setting"
}
],
}
];
return {
renderMenuIcon,
menuOptions,
expandIcon,
collapsed,
}
function renderMenuIcon(option) {
if (option.key === 'sheep-man') return true
if (option.key === 'food') return null
return h(NIcon, null, { default: () => h(BookmarkOutline) })
}
onMounted(async () => {
// 加载版本
await window.api.GetVersion((value) => {
document.title = 'LAITool ' + value
})
// 添加监听事件,同时按下ctrl + alt + l 打开控制台
window.addEventListener('keydown', (e) => {
if (e.ctrlKey && e.altKey && e.key === 'l') {
// 添加权限,需要输入密码才能打开控制台
// 判断当前数据是不是存在
// 处理数据。获取当前的所有的数据
let dialogWidth = 400
let dialogHeight = 150
dialog.create({
title: '输入管理控制密码',
showIcon: false,
closeOnEsc: false,
content: () =>
h(InputDialogContent, {
ref: key_down_ref,
initData: null,
type: 'password',
placeholder: '请输入管理控制密码'
}),
style: `width : ${dialogWidth}px; min-height : ${dialogHeight}px`,
maskClosable: false,
onClose: async () => {
debugger
// 判断该管理控制密码是不是正确
let password = toRaw(key_down_ref.value.data)
console.log(password)
// 将密码进行md5加密
let md5_password = MD5(password + DEFINE_STRING.OPEN_DEV_TOOLS).toString()
console.log(md5_password)
window.api.OpenDevToolsPassword(md5_password, (value) => {
if (value.code == 0) {
message.error(value.message)
} else {
window.api.OpenDevTools()
}
})
}
})
}
})
window.api.setEventListen([DEFINE_STRING.SHOW_MESSAGE_DIALOG], (value) => {
let message = value.message
let type = 'success'
let title = '成功'
if (value.code == 0) {
type = 'error'
title = '成功但失败'
} else if (value.code == 2) {
;(type = 'warning'), (title = '警告')
}
dialog.create({
type: type,
title: title,
showIcon: true,
content: message,
style: `width : 400px;`,
maskClosable: false,
positiveText: '确定'
})
})
window.api.setEventListen([DEFINE_STRING.SHOW_MAIN_NOTIFICATION], (value) => {
let message = value.message
let type = 'success'
let title = '成功'
if (value.code == 0) {
type = 'error'
title = '失败'
} else if (value.code == 2) {
type = 'warning'
title = '警告'
}
notification.create({
type: type,
title: title,
content: message,
keepAliveOnHover: true,
duration: 2500
})
})
// 弹窗,获取机器码
dialog.create({
showIcon: false,
content: () => h(CheckMachineId, { ref: machineRef }),
style: `width : 400px; height: 300px`,
maskClosable: false,
positiveText: '确定',
onClose: () => {
// 关闭程序
window.api.QuitApp()
return false
},
onEsc: () => {
// 关闭程序
window.api.QuitApp()
return false
},
onPositiveClick: async () => {
debugger
await new Promise(async (resolve, reject) => {
await window.api.CheckMachineId(toRaw(machineRef.value.machineId), (value) => {
if (value.code == 0) {
message.error(value.message)
reject()
} else {
resolve()
}
})
})
}
})
window.api.getSettingDafultData(async (value) => {
window.config = value
})
})
function expandIcon(value) {
return h(NIcon, null, { default: () => h(CaretDownOutline) })
}
const menuOptions = [
{
label: () =>
h(
RouterLink,
{
to: {
name: 'sdoriginal'
}
},
{
default: () => '原创生图'
}
),
key: 'sdoriginal'
},
{
label: '反推矩阵',
key: 'backward_matrix',
children: [
{
label: () =>
h(
RouterLink,
{
to: {
name: 'getframe'
}
},
{ default: () => '抽帧' }
),
key: 'backward_frame'
},
{
label: () =>
h(
RouterLink,
{
to: {
name: 'copywriting'
}
},
{ default: () => '文案洗稿' }
),
key: 'copywriting'
},
{
label: () =>
h(
RouterLink,
{
to: {
name: 'pushBackPrompt'
}
},
{ default: () => '反推提示词' }
),
key: 'push_back'
},
{
label: () =>
h(
RouterLink,
{
to: {
name: 'regenerate'
}
},
{ default: () => '批次生成' }
),
key: 'regenerate'
},
{
label: () =>
h(
RouterLink,
{
to: {
name: 'VideoGenerate'
}
},
{ default: () => '重绘/视频合成' }
),
key: 'VideoGenerate'
}
]
},
// {
// label: "剪辑",
// key: "clip_options",
// children: [
// {
// label: () => h(
// RouterLink,
// {
// to: {
// name: "align_draft",
// }
// },
// { default: () => "剪映草稿对齐" }
// ),
// key: "align_draft"
// },
// {
// label: () => h(
// RouterLink,
// {
// to: {
// name: "add_draft",
// }
// },
// { default: () => "添加剪映草稿" }
// ),
// key: "add_draft"
// }
// ]
// },
{
label: '设置',
key: 'setting',
children: [
{
label: () =>
h(
RouterLink,
{
to: {
name: 'global_setting'
}
},
{ default: () => '通用设置' }
),
key: 'global_setting'
},
{
label: () =>
h(
RouterLink,
{
to: {
name: 'clip_setting'
}
},
{ default: () => '剪映设置' }
),
key: 'clip_setting'
},
{
label: () =>
h(
RouterLink,
{
to: {
name: 'videogeneratesetting'
}
},
{ default: () => '生成视频设置' }
),
key: 'videogeneratesetting'
},
{
label: () =>
h(
RouterLink,
{
to: {
name: 'sd_setting'
}
},
{ default: () => 'SD设置' }
),
key: 'sd_setting'
},
{
label: () =>
h(
RouterLink,
{
to: {
name: 'mj_setting'
}
},
{ default: () => 'MJ设置' }
),
key: 'mj_setting'
}
]
}
]
return {
renderMenuIcon,
menuOptions,
expandIcon,
collapsed
}
}
})
</script>
</script>
@@ -32,7 +32,8 @@
v-if="outImagePath"
:src="outImagePath"
fit="cover"
style="width: 120px; height: 120px"
width="120"
height="120"
/>
</div>
<div>
@@ -1,6 +1,6 @@
<template>
<div style="margin-top: 30px">
<n-input :placeholder="placeholder" v-model:value="data"></n-input>
<n-input :placeholder="placeholder" :type="type" v-model:value="data"></n-input>
</div>
</template>
@@ -12,17 +12,19 @@ export default defineComponent({
components: {
NInput
},
props: ['initData', 'placeholder'],
props: ['initData', 'placeholder', 'type'],
setup(props) {
let message = useMessage()
let data = ref(props.initData)
let placeholder = ref(props.placeholder)
let type = ref(props.type ? props.type : 'text')
onMounted(async () => {})
return {
data,
placeholder
placeholder,
type
}
}
})
@@ -366,7 +366,7 @@ export default defineComponent({
selectStyle.value = value.data
})
for (let i = 0; i < customize_image_style_list.length; i++) {
for (let i = 0; i < customize_image_style_list && customize_image_style_list.length; i++) {
const element = customize_image_style_list[i]
selectStyle.value.push({
key: element,
@@ -395,6 +395,7 @@ export default defineComponent({
window.api.setEventListen(
[DEFINE_STRING.SD_ORIGINAL_GENERATE_IMAGE_RETURN, window.id],
(value) => {
debugger
if (value.code == 0) {
message.error('生成图片错误,错误信息如下:' + value.message)
return
@@ -914,7 +915,10 @@ export default defineComponent({
cref_url = checkStringValueAddPrefix(cref_url, ' --cref ')
if (element.character_tags && element.character_tags.length > 0) {
cref_url = checkStringValueAddSuffix(cref_url, ` --cw ${element.character_tags[0].cref_cw} `)
cref_url = checkStringValueAddSuffix(
cref_url,
` --cw ${element.character_tags[0].cref_cw} `
)
}
// 判断 character_string 有数据,有的话删除第一个逗号
character_string = checkStringValueDeletePrefix(character_string, ',')
@@ -14,9 +14,10 @@
</n-form-item>
<n-form-item label="出图方式(文生图、图生图)" path="type">
<n-select
style="width: 250px"
v-model:value="formValue.type"
:options="modelOption"
placeholder="输入采样方法"
placeholder="选择出图方式"
/>
</n-form-item>
<n-form-item label="正向提示词(和推导出来的tag进行拼接)" path="prompt">
@@ -51,7 +52,12 @@
</n-form-item>
</div>
<n-form-item label="采样方式" path="sampler_name">
<n-input v-model:value="formValue.sampler_name" placeholder="输入模型" />
<n-select
style="width: 250px"
v-model:value="formValue.sampler_name"
:options="samplers_options"
placeholder="选择采样方式"
/>
</n-form-item>
<div style="display: flex">
<n-form-item label="迭代步数" path="steps">
@@ -161,13 +167,15 @@ export default defineComponent({
onMounted(async () => {
await window.api.InitSDConfig((value) => {
debugger
if (value.code == 0) {
message.error(value.message)
return
}
formValue.value = value.data
let samplers = value.data.samplers
let samplers = value.data.sampler
samplers_options.value = []
for (let i = 0; i < samplers.length; i++) {
const element = samplers[i]
samplers_options.value.push({
@@ -175,7 +183,8 @@ export default defineComponent({
value: element.name
})
}
let loras = value.data.loras
let loras = value.data.lora
lora_options.value = []
for (let i = 0; i < loras.length; i++) {
const element = loras[i]
lora_options.value.push({
@@ -183,7 +192,8 @@ export default defineComponent({
value: element.name
})
}
let sd_models = value.data.sd_models
let sd_models = value.data.sd_model
sd_models_options.value = []
for (let i = 0; i < sd_models.length; i++) {
const element = sd_models[i]
sd_models_options.value.push({
@@ -221,11 +231,40 @@ export default defineComponent({
*/
async function LoadSDServiceData() {
await window.sd.LoadSDServiceData(toRaw(formValue.value).webui_api_url, (value) => {
debugger
if (value.code == 0) {
message.error(value.message)
return
}
// formValue.value = value.data
// 获取当前的配置信息
let samplers = value.data.sampler
samplers_options.value = []
for (let i = 0; i < samplers.length; i++) {
const element = samplers[i]
samplers_options.value.push({
label: element.name,
value: element.name
})
}
let loras = value.data.lora
lora_options.value = []
for (let i = 0; i < loras.length; i++) {
const element = loras[i]
lora_options.value.push({
label: element.name,
value: element.name
})
}
let sd_models = value.data.sd_model
sd_models_options.value = []
for (let i = 0; i < sd_models.length; i++) {
const element = sd_models[i]
sd_models_options.value.push({
label: element.title,
value: element.title
})
}
message.success('加载成功')
})
}