1. 修改用户机器码管理(所有用户需要重新注册,激活)

2. 重构软件鉴权,添加自动判断机器码,可以不在手动点击确定
3. 新增软件启动时,提示用户是不是还存在等待中的任务,还有的话,由用户判断是不是丢弃,丢弃,会将所有的等待中的任务设置为失败
4. 聚合推文 提示词合并,人物、风格和场景 添加判无,修复部分情况无法合并
5. 新增 预设(人物,场景,风格)对提示词相关的提示
6. 修复 文案处理,流式输出内容重复问题,删除豆包(请求格式不兼容)
7. 新增 文案处理 输出内容一键格式化(注意:由于GPT输出的格式化有太多的不确定,不一定可以完全格式化,需要手动检查)
8. 聚合推文原创,新增时默认设置 修脸参数,初始和SD设置中的一致
9. 修复聚合推文选图覆盖 bug
This commit is contained in:
2024-10-15 19:33:37 +08:00
parent 92c1d99efd
commit 224ee47984
101 changed files with 1354 additions and 1008 deletions
+1 -1
View File
@@ -44,7 +44,7 @@ export default defineComponent({
let softwareStore = useSoftwareStore()
onMounted(async () => {
debugger
softwareStore.SoftColor = SoftColor
window.api.getSettingDafultData(async (value) => {
await window.darkMode.toggle(value.theme)
@@ -18,9 +18,9 @@ export default defineComponent({
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
@@ -250,7 +250,7 @@ async function imageDragOver(e) {
}
async function ModifyLock() {
debugger
if (!data.value.imageLock) {
// 锁定之前,判断是不是有
if (!outImagePath.value) {
@@ -83,7 +83,6 @@ export default defineComponent({
* 提示词菜单下拉操作
*/
async function ReverseSelect(key) {
debugger
switch (key) {
case 'remove_reverse': // 删除反推提示词
let res = await window.book.ResetGptReverseData(
@@ -162,7 +161,6 @@ export default defineComponent({
// 处理批次的翻译
function TranslateBatchParams(from, to) {
debugger
let translateData = []
for (let i = index.value; i < reverseManageStore.selectBookTaskDetail.length; i++) {
const element = reverseManageStore.selectBookTaskDetail[i]
@@ -208,7 +206,6 @@ export default defineComponent({
// 单句翻译
async function TranslateOne(key) {
debugger
let translateData = []
switch (key) {
case 'translate_english':
@@ -243,7 +240,6 @@ export default defineComponent({
* 重选反推提示词
*/
async function SelectReversePrompt() {
debugger
// 判断当前是不是又反推提示词
if (!data.value.reversePrompt || data.value.reversePrompt.length <= 0) {
message.error('当前没有反推提示词')
@@ -114,7 +114,7 @@ export default defineComponent({
style: `width : ${dialogWidth}px; height : ${dialogHeight}px`,
maskClosable: false,
onClose: async () => {
debugger
console.log(selectStyleRef)
// 将数据保存到当前的数据中
// reverseManageStore.selectBookTask.styleList = toRaw(selectStyleRef.value.selectStyle)
@@ -61,7 +61,7 @@ export default defineComponent({
setup(props) {
let hh = props.height
let maxHeight = props.height - 80
debugger
let data = ref(JSON.parse(JSON.stringify(props.initData)))
const message = useMessage()
let dialog = useDialog()
@@ -210,7 +210,7 @@ export default defineComponent({
style: `width : ${dialogWidth}px; min-height : ${dialogHeight}px`,
maskClosable: false,
onClose: async () => {
debugger
console.log(wenkeRef.value.word)
let word = wenkeRef.value.data
if (word == null || word == '') {
@@ -565,7 +565,7 @@ export default defineComponent({
})
}
} else if (type.value == 'mj_reverse' || type.value == 'sd_reverse') {
debugger
if (data.value.length != reverseManageStore.selectBookTaskDetail.length) {
message.error('检测到导入的字幕数据和分镜对不上,请先对齐')
return
@@ -188,7 +188,7 @@ export default defineComponent({
// 选择MP4文件夹
await window.api.SelectFile(ext, (value) => {
debugger
if (value.code == 0) {
message.error(value.message)
return
@@ -227,7 +227,7 @@ export default defineComponent({
oldVideoPath: {
required: true,
validator(rule, value) {
debugger
if (isEmpty(value)) {
// 判断是不是原创,原创不能选择视频文件,反推必选
if (
@@ -253,7 +253,7 @@ export default defineComponent({
message.error('请检查必填字段')
return
}
debugger
loading.value = true
let res = await reverseManageStore.SaveSelectBook(cloneDeep(reverseManageStore.selectBook))
loading.value = false
@@ -286,7 +286,7 @@ export default defineComponent({
*/
async function OpenFolder(param) {
let res = null
debugger
if (param == 'imageFolder') {
res = await window.system.OpenFolder({
folderPath: reverseManageStore.selectBook.imageFolder,
@@ -108,7 +108,7 @@ async function DeleteBookData(e) {
negativeText: '取消',
onPositiveClick: async () => {
da?.destroy()
debugger
softwareStore.spin.spinning = true
softwareStore.spin.tip = '正在删除小说数据。。。'
let res = await window.book.DeleteBookData(book.value.id)
@@ -117,7 +117,7 @@ async function DeleteBookData(e) {
message.error(res.message)
return
}
debugger
// 这边直接把数据删除了就行
reverseManageStore.bookData = reverseManageStore.bookData.filter(
(item) => item.id != book.value.id
@@ -48,7 +48,7 @@ export default defineComponent({
props: ['bookTask'],
setup(props) {
debugger
let message = useMessage()
let dialog = useDialog()
let bookTask = ref(props.bookTask)
@@ -63,7 +63,7 @@ export default defineComponent({
* @param e
*/
async function ReSetBookTaskDetail(e) {
debugger
e.stopPropagation()
dialog.warning({
title: '重置小说任务',
@@ -171,7 +171,7 @@ export default defineComponent({
*/
async function ClipDraft(e) {
e.stopPropagation()
debugger
dialog.info({
closeOnEsc: false,
title: '生成草稿前检查',
@@ -103,7 +103,7 @@ export default defineComponent({
*/
async function DataTableStripedUpdate() {
// 修改数据
debugger
// 直接提交修改
let res = await softwareStore.SaveSoftware()
console.log(res)
@@ -115,7 +115,7 @@ export default defineComponent({
// 选择下拉菜单
async function SelectDropdown(key) {
debugger
console.log(key)
softwareStore.softWare.reverse_data_table_size = key
// 直接提交修改
@@ -16,7 +16,7 @@ import { ref, onMounted, defineComponent, onUnmounted, toRaw, nextTick, watchEff
import { useMessage, NLog } from 'naive-ui'
import Artplayer from '../../../Components/Artplayer.vue'
import { useReverseManageStore } from '../../../../../../stores/reverseManage.ts'
import { DEFINE_STRING } from '../../../../../../define/define_string.ts'
import { DEFINE_STRING } from '../../../../../../define/define_string'
export default defineComponent({
components: { Artplayer, NLog },
@@ -47,7 +47,7 @@ export default defineComponent({
onMounted(async () => {
// 监听返回的日志数据
window.api.setEventListen([DEFINE_STRING.SYSTEM.RETURN_LOGGER], (value) => {
debugger
debuger
if (value.code == 0) {
message.error('添加日志输出失败,但是不影响使用')
logger.value += value.message + '\n'
@@ -73,7 +73,7 @@ export default defineComponent({
props: ['bookTask', 'type'],
setup(props) {
let bookTask = ref(props.bookTask)
debugger
let type = ref(props.type)
let backgroundMusicOptions = ref([])
let message = useMessage()
@@ -133,7 +133,7 @@ export default defineComponent({
bookTask.value.id,
OperateBookType.BOOKTASK
)
debugger
if (res.code == 0) {
message.error(res.message)
} else {
@@ -657,7 +657,7 @@ export default defineComponent({
* @param to 目标语言
*/
async function TranslateService(from, to) {
debugger
let translateData = []
for (let i = 0; i < reverseManageStore.selectBookTaskDetail.length; i++) {
const element = reverseManageStore.selectBookTaskDetail[i]
@@ -743,7 +743,7 @@ export default defineComponent({
let tempData = []
for (let i = 0; i < reverseManageStore.selectBookTaskDetail.length; i++) {
debugger
const element = reverseManageStore.selectBookTaskDetail[i]
tempData.push({
no: element.no,
@@ -50,6 +50,7 @@
>
</div>
</n-form-item>
<div style="color: red;">注意人物提示词英文才是实际合并的提示词数据请和出图的提示词语言保持一致中文或英文</div>
<n-form-item label="人物提示词(英文)" path="prompt">
<n-input
type="textarea"
@@ -27,6 +27,7 @@
>翻译提示词</n-button
>
</n-form-item>
<div style="color: red;">注意场景提示词描述英文 才是实际合并的提示词数据请和出图的提示词语言保持一致中文或英文</div>
<n-form-item label="场景提示词描述(英文)" path="prompt">
<n-input
type="textarea"
@@ -36,6 +36,7 @@
</n-tooltip>
</div>
</n-form-item>
<div style="color: red;">注意风格提示词描述英文 才是实际合并的提示词数据请和出图的提示词语言保持一致中文或英文</div>
<n-form-item label="风格提示词描述(英文)" path="prompt">
<n-input
type="textarea"
@@ -247,7 +248,7 @@ export default defineComponent({
}
imageLoading.value = true
await window.sd.txt2img(JSON.stringify([d]), async (value) => {
debugger
if (value.code == 0) {
message.error(value.message)
imageLoading.value = false
@@ -51,7 +51,7 @@ export default defineComponent({
// 做个计算属性
let showReversePrompt = computed(() => {
debugger
let res = []
for (let i = 0; i < data.value.reversePrompt?.length; i++) {
let item = data.value.reversePrompt[i]
@@ -133,7 +133,7 @@ export default defineComponent({
]
onMounted(async () => {
debugger
calcHeight()
setTimeout(() => {
@@ -155,7 +155,7 @@ export default defineComponent({
})
function calcHeight() {
debugger
// 视口的高度
let height = window.innerHeight
maxHeight.value = height - 120
@@ -82,7 +82,7 @@ export default defineComponent({
}
pagination.value.pageCount = res_count
debugger
// 开始获取批次任务
let bookTask = await reverseManageStore.GetBookTaskDataFromDB({
bookId: reverseManageStore.selectBook.id
@@ -99,7 +99,7 @@ export default defineComponent({
async function InitData() {
try {
// 初始化数据
debugger
await GetBookByCondition()
} catch (error) {
message.error(error.message)
@@ -43,7 +43,7 @@ export default defineComponent({
},
setup() {
debugger
let message = useMessage()
let softwareStore = useSoftwareStore()
let reverseManageStore = useReverseManageStore()
@@ -105,7 +105,7 @@ export default defineComponent({
width: 215,
fixed: 'right',
render(row, index) {
debugger
return h(BookTaskListAction, {
bookTask: row
})
@@ -132,7 +132,7 @@ onMounted(() => {})
let UpdateCharacterTagsDebounced = debounce(UpdateCharacterTags, 500)
async function UpdateCharacterTags(character, index) {
debugger
// 开始保存,获取所有的选中的人物
let checkedCharacterTags = characterTags.value
.filter((item) => item.checked)
@@ -154,7 +154,7 @@ async function UpdateCharacterTags(character, index) {
let UpdateSceneTagsDebounced = debounce(UpdateSceneTags, 500)
async function UpdateSceneTags(scene, index) {
debugger
console.log('1233', scene, index)
// 开始保存,获取所有的选中的场景
let checkedSceneTags = sceneTags.value.filter((item) => item.checked).map((item) => item.id)
@@ -288,7 +288,7 @@ async function SelectStyle() {
style: `width : ${dialogWidth}px; height : ${dialogHeight}px`,
maskClosable: false,
onClose: async () => {
debugger
console.log(selectStyleRef)
// 将数据保存到当前的数据中
// reverseManageStore.selectBookTask.styleList = toRaw(selectStyleRef.value.selectStyle)
@@ -178,7 +178,7 @@ async function SingleGenerateImage() {
// 下生图
async function NextGenerateImage() {
debugger
let res = undefined
let bookTaskDetails = reverseManageStore.selectBookTaskDetail.filter(
(item, index) => index >= props.index && !item.imageLock
@@ -165,7 +165,7 @@ async function CharacterLibrary() {
let dialogWidth = window.innerWidth * 0.6
let dialogHeight = window.innerHeight * 0.9
let word = '' // 这边要拼接一下word
debugger
let temp_arr = []
for (let i = 0; i < reverseManageStore.selectBookTaskDetail.length; i++) {
const element = reverseManageStore.selectBookTaskDetail[i]
@@ -235,7 +235,7 @@ async function ResetGPTPrompt() {
onPositiveClick: async () => {
da?.destroy()
softwareStore.spin.spinning = true
debugger
softwareStore.spin.tip = '正在重置推理提示词,请稍后。。。'
let res = await window.book.ResetGptReverseData(
reverseManageStore.selectBookTask.id,
@@ -373,7 +373,7 @@ async function GetPromptAll() {
* @param {Boolean} cover - 是否覆盖现有图像
*/
async function AddFluxImageAll(type, cover) {
debugger
let messageName = DEFINE_STRING.BOOK.FLUX_API_IMAGE_GENERATE_RETURN
let taskType = BookBackTaskType.FLUX_API_IMAGE
if (type == BookImageCategory.FLUX_FORGE) {
@@ -96,7 +96,6 @@ const createColumns = ({}) => {
className: 'empty-margin',
fixed: 'left',
render(row, index) {
console.log('row', row, index)
return h(DatatableAfterGpt, { initData: row, index: index })
}
},
@@ -31,7 +31,7 @@ export default defineComponent({
onMounted(() => {})
onUnmounted(() => {
debugger
reverseManageStore.selectBookTaskDetail = undefined
})
@@ -2,7 +2,12 @@
<div style="height: 200px">
<div style="height: 40px"></div>
<div style="display: flex">
<n-input :disabled="true" v-model:value="machineId" type="text" placeholder="唯一码" />
<n-input
:disabled="true"
v-model:value="systemStore.machineId"
type="text"
placeholder="唯一码"
/>
<n-popover trigger="click">
<template #trigger>
<n-button text style="width: 24px; font-size: 24px; color: skyblue; display: flex; heigh">
@@ -14,7 +19,23 @@
<span>VXxiangbie88</span>
</n-popover>
</div>
<div style="color: red; margin: 10px">
<div style="margin: 10px">
<strong>怎么激活 --> </strong>
<strong
style="color: #e18a3b; margin-left: 10px"
@click="OpenTeach('activate')"
class="url_class"
>软件激活教程 -->
</strong>
<strong
style="margin-left: 10px; color: #ea5514"
@click="OpenTeach('lms')"
class="url_class"
>
后台入口
</strong>
</div>
<!-- <div style="margin: 10px; color: red">
如未激活将上面的码给管理员激活
<n-popover trigger="hover" raw :show-arrow="false">
<template #trigger>
@@ -26,7 +47,7 @@
preview-disabled
/>
</n-popover>
</div>
</div> -->
<div style="margin: 10px; font-size: large; color: red">
教程视频<span class="url_class" @click="OpenTeach('video')">向北-LAITool</span>
</div>
@@ -39,62 +60,46 @@
</div>
</template>
<script>
<script setup>
import { defineComponent, ref, h, onMounted, toRaw } from 'vue'
import { useMessage, NInput, NButton, NIcon, NPopover, NImage, NTag } from 'naive-ui'
import { InformationCircle } from '@vicons/ionicons5'
import { useSystemStore } from '../../../../stores/system'
export default defineComponent({
components: {
NInput,
NButton,
NIcon,
InformationCircle,
NPopover,
NImage,
NTag
},
setup() {
let machineId = ref('')
let message = useMessage()
let machineId = ref('')
let message = useMessage()
const systemStore = useSystemStore()
onMounted(async () => {
// 获取机械码
await window.api.GetMachineId((value) => {
if (value.code == 0) {
message.error(value.message)
return
}
machineId.value = value.value
})
})
onMounted(async () => {})
function OpenTeach(type) {
switch (type) {
case 'doc':
window.api.OpenUrl(
'https://rvgyir5wk1c.feishu.cn/docx/RZYCdG7ZpoKsIzxBEzccNEIFn8f?from=from_copylink'
)
break
case 'video':
window.api.OpenUrl('https://space.bilibili.com/110586931')
default:
break
}
}
function OpenQueDoc() {
function OpenTeach(type) {
switch (type) {
case 'doc':
window.api.OpenUrl(
'https://pvwu1oahp5m.feishu.cn/sheets/G5s3sX0KahH1XQtWDazcF70anUb?from=from_copylink'
'https://rvgyir5wk1c.feishu.cn/docx/RZYCdG7ZpoKsIzxBEzccNEIFn8f?from=from_copylink'
)
}
return {
machineId,
OpenQueDoc,
OpenTeach
}
break
case 'video':
window.api.OpenUrl('https://space.bilibili.com/110586931')
break
case 'activate':
window.api.OpenUrl(
'https://rvgyir5wk1c.feishu.cn/docx/RNijdu3w4o4tRlxBhdccWhRpnfg?from=from_copylink'
)
break
case "lms" :
window.api.OpenUrl('https://lms.laitool.cn')
break
default:
break
}
})
}
function OpenQueDoc() {
window.api.OpenUrl(
'https://pvwu1oahp5m.feishu.cn/sheets/G5s3sX0KahH1XQtWDazcF70anUb?from=from_copylink'
)
}
</script>
<style>
@@ -208,14 +208,14 @@ export default defineComponent({
// 初始化选中的数据
async function InitStyleData() {
debugger
if (!props.imageStyle || !props.customizeImageStyle) {
return
}
selectStyle.value = []
// 开始初始化
await window.api.GetImageStyleInfomation(JSON.stringify(props.imageStyle), (value) => {
debugger
if (value.code == 0) {
message.error(value.message)
return
@@ -276,7 +276,7 @@ export default defineComponent({
}
async function closeTag(image) {
debugger
let index = selectStyle.value.findIndex((item) => item.id == image.id)
if (index != -1) {
selectStyle.value.splice(index, 1)
@@ -56,7 +56,7 @@ export default defineComponent({
onMounted(async () => {})
async function closeTag(image) {
debugger
let index = selectStyle.value.findIndex((item) => item.id == image.id)
if (index != -1) {
selectStyle.value.splice(index, 1)
@@ -75,10 +75,16 @@
/>
</div>
</div>
<div style="display: flex; justify-content: flex-end; align-items: center; margin-right: 20px">
<n-button type="primary" @click="FormatOutput()"> 格式化 </n-button>
<div style="color: red; margin-left: 5px">
注意由于GPT输出的格式化有太多的不确定不一定可以完全格式需要手动检查
</div>
</div>
</div>
</template>
<script>
<script setup>
import { ref, onMounted, defineComponent, onUnmounted, toRaw, watch, h } from 'vue'
import {
useMessage,
@@ -98,192 +104,184 @@ 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,
NCheckbox,
NInputNumber
},
setup() {
let message = useMessage()
let dialog = useDialog()
let formValue = ref({
gptType: undefined,
gptData: undefined,
gptAI: undefined,
isStream: true,
isSplit: false,
splitNumber: 1000
})
let oldWord = ref(undefined)
let newWord = ref(undefined)
let gptTypeOptions = ref([])
let gptDataOptions = ref([])
let gptAllData = undefined
let formRef = ref(null)
let gptOptions = ref([
{ label: 'LAI API', value: 'laiapi' },
{ label: 'KIMI', value: 'kimi' },
{ label: 'DouBao', value: 'doubao' }
])
let softwareStore = useSoftwareStore()
let allPromptDataOptions = ref([])
let message = useMessage()
let dialog = useDialog()
let formValue = ref({
gptType: undefined,
gptData: undefined,
gptAI: undefined,
isStream: true,
isSplit: false,
splitNumber: 1000
})
let oldWord = ref('')
let newWord = ref('')
let gptTypeOptions = ref([])
let gptDataOptions = ref([])
let gptAllData = undefined
let formRef = ref(null)
let gptOptions = ref([
{ label: 'LAI API', value: 'laiapi' },
{ label: 'KIMI', value: 'kimi' }
])
let softwareStore = useSoftwareStore()
let allPromptDataOptions = ref([])
// 加载服务端数据
async function InitServerGptOptions() {
let gptRes = await window.gpt.InitServerGptOptions()
if (gptRes.code == 0) {
message.error(gptRes.message)
return
}
gptAllData = gptRes.data
// 处理数据
gptTypeOptions.value = gptRes.data.promptType.map((item) => {
return { label: item.name, value: item.id }
})
// 加载服务端数据
async function InitServerGptOptions() {
let gptRes = await window.gpt.InitServerGptOptions()
if (gptRes.code == 0) {
message.error(gptRes.message)
return
}
gptAllData = gptRes.data
// 处理数据
gptTypeOptions.value = gptRes.data.promptType.map((item) => {
return { label: item.name, value: item.id }
})
gptDataOptions.value = gptRes.data.promptData.map((item) => {
return { label: item.name, value: item.id }
})
allPromptDataOptions.value = gptRes.data.promptData
}
gptDataOptions.value = gptRes.data.promptData.map((item) => {
return { label: item.name, value: item.id }
})
allPromptDataOptions.value = gptRes.data.promptData
}
function debounce(func, wait) {
let timeoutId
let shouldExecute = true
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) => {
return [
{
required: true,
validator(rule, value) {
if (value == null || value == '') return new Error(errorMessage)
return true
},
trigger: ['input', 'blur', 'change']
}
]
}
let rules = {
gptAI: ruleObj('必选提示词类型'),
gptData: ruleObj('必选提示词预设'),
gptType: ruleObj('必填提示词AI')
}
/**
* AI设置相关
*/
async function AISetting() {
// 判断当前数据是不是存在
// 处理数据。获取当前的所有的数据
let dialogWidth = 800
let dialogHeight = 600
dialog.create({
title: 'AI设置',
showIcon: false,
closeOnEsc: false,
content: () => h(ManageAISetting, { type: formValue.value.gptAI }),
style: `width : ${dialogWidth}px; min-height : ${dialogHeight}px`,
maskClosable: false,
onClose: async () => {}
})
}
/**
* 开始执行GPT
*/
async function ActionStart() {
// 检查是不是有数据
if (
isEmpty(formValue.value.gptType) ||
isEmpty(formValue.value.gptData) ||
isEmpty(formValue.value.gptAI)
) {
message.error('请选择完整的数据')
return
}
softwareStore.spin.spinning = true
softwareStore.spin.tip = '生成中......'
let res = await window.write.ActionStart(toRaw(formValue.value), oldWord.value)
softwareStore.spin.spinning = false
if (res.code == 0) {
message.error(res.message)
softwareStore.spin.spinning = false
return
}
newWord.value = res.data
}
/**
* 选择的提示词类型发生变化时,删选提示词预设
* @param value
* @param options
*/
async function UpdateSelectPromptType(value, options) {
gptDataOptions.value = allPromptDataOptions.value
.filter((item) => {
return item.promptTypeId == value
})
.map((item) => {
return { label: item.name, value: item.id }
})
}
return {
formValue,
gptTypeOptions,
gptDataOptions,
UpdateSelectPromptType,
oldWord,
newWord,
rules,
formRef,
AISetting,
gptOptions,
softwareStore,
ActionStart,
allPromptDataOptions
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
}, 300)
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) => {
return [
{
required: true,
validator(rule, value) {
if (value == null || value == '') return new Error(errorMessage)
return true
},
trigger: ['input', 'blur', 'change']
}
]
}
async function FormatOutput() {
let splitData = newWord.value.split('\n').filter((item) => {
return !isEmpty(item)
})
let isNumberedFormat = (str) => {
return /^\d+\./.test(str)
}
let isTextFormat = (str) => {
return /^【文本】/.test(str)
}
let type = undefined
splitData = splitData.map((item) => {
if (isNumberedFormat(item)) {
type = 'startNumber'
return item.replace(/^\d+\./, '')
} else if (isTextFormat(item)) {
type = 'startText'
return item.replace('&【', '\n【')
} else {
return item
}
})
if (type == 'startNumber') {
newWord.value = splitData.join('\n')
} else {
newWord.value = splitData.join('\n\n')
}
}
/**
* AI设置相关
*/
async function AISetting() {
// 判断当前数据是不是存在
// 处理数据。获取当前的所有的数据
let dialogWidth = 800
let dialogHeight = 600
dialog.create({
title: 'AI设置',
showIcon: false,
closeOnEsc: false,
content: () => h(ManageAISetting, { type: formValue.value.gptAI }),
style: `width : ${dialogWidth}px; min-height : ${dialogHeight}px`,
maskClosable: false,
onClose: async () => {}
})
}
/**
* 开始执行GPT
*/
async function ActionStart() {
// 检查是不是有数据
if (
isEmpty(formValue.value.gptType) ||
isEmpty(formValue.value.gptData) ||
isEmpty(formValue.value.gptAI)
) {
message.error('请选择完整的数据')
return
}
softwareStore.spin.spinning = true
softwareStore.spin.tip = '生成中......'
let res = await window.write.ActionStart(toRaw(formValue.value), oldWord.value)
softwareStore.spin.spinning = false
if (res.code == 0) {
message.error(res.message)
softwareStore.spin.spinning = false
return
}
newWord.value = res.data
}
/**
* 选择的提示词类型发生变化时,删选提示词预设
* @param value
* @param options
*/
async function UpdateSelectPromptType(value, options) {
gptDataOptions.value = allPromptDataOptions.value
.filter((item) => {
return item.promptTypeId == value
})
.map((item) => {
return { label: item.name, value: item.id }
})
}
</script>
@@ -17,7 +17,7 @@
<n-input v-model:value="aiSetting.laiapi.model" type="text" placeholder="请输入Model" />
</div>
</n-card>
<n-card title="豆包设置">
<!-- <n-card title="豆包设置">
<div style="display: flex">
<n-input
v-model:value="aiSetting.doubao.gpt_url"
@@ -37,7 +37,7 @@
placeholder="请输入豆包的模型"
/>
</div>
</n-card>
</n-card> -->
<n-card title="KIMI设置">
<div style="display: flex">
<n-input
@@ -86,7 +86,7 @@ export default defineComponent({
})
onMounted(async () => {
debugger
// 获取AIsetting
let res = await window.gpt.GetAISetting()
if (res.code == 0) {
+156 -63
View File
@@ -1,33 +1,36 @@
<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"
style="position: relative"
>
<n-menu
:collapsed="collapsed"
<n-spin :show="show">
<n-space vertical>
<n-layout has-sider style="height: 100vh; position: relative">
<n-layout-sider
bordered
collapse-mode="width"
:collapsed-width="64"
:collapsed-icon-size="22"
:options="menuOptions"
:render-icon="renderMenuIcon"
:expand-icon="expandIcon"
:width="220"
:collapsed="collapsed"
show-trigger
@collapse="collapsed = true"
@expand="collapsed = false"
style="position: relative"
>
</n-menu>
</n-layout-sider>
<n-layout-content content-style="padding: 5px 5px 5px 10px; height:100%">
<!-- <Setting></Setting> -->
<router-view></router-view>
</n-layout-content>
</n-layout>
</n-space>
<n-menu
:collapsed="collapsed"
:collapsed-width="64"
:collapsed-icon-size="22"
:options="menuOptions"
:render-icon="renderMenuIcon"
:expand-icon="expandIcon"
>
</n-menu>
</n-layout-sider>
<n-layout-content content-style="padding: 5px 5px 5px 10px; height:100%">
<!-- <Setting></Setting> -->
<router-view></router-view>
</n-layout-content>
</n-layout>
</n-space>
<template #description> 你不知道你有多幸运 </template>
</n-spin>
</template>
<script>
@@ -47,7 +50,8 @@ import {
NSwitch,
NButton,
NFloatButton,
NBadge
NBadge,
NSpin
} from 'naive-ui'
import {
@@ -67,6 +71,9 @@ import InputDialogContent from '../Original/Components/InputDialogContent.vue'
import APIIcon from '../Icon/APIIcon.vue'
import BackTaskIcon from '../Icon/BackTaskIcon.vue'
import BackTask from '../Components/BackTask/BackTask.vue'
import { useSystemStore } from '../../../../stores/system'
import { TimeDelay } from '../../../../define/Tools/time'
import { BookBackTaskStatus } from '../../../../define/enum/bookEnum'
export default defineComponent({
components: {
@@ -82,7 +89,8 @@ export default defineComponent({
APIIcon,
NFloatButton,
NBadge,
Layers
Layers,
NSpin
},
setup() {
let collapsed = ref(false)
@@ -90,9 +98,12 @@ export default defineComponent({
let machineRef = ref()
let message = useMessage()
let notification = useNotification()
let show = ref(true)
const systemStore = useSystemStore()
let key_down_ref = ref(null)
// 菜单列表图标渲染
function renderMenuIcon(option) {
if (option.key === 'sheep-man') return true
if (option.key === 'food') return null
@@ -115,12 +126,121 @@ export default defineComponent({
)
if (option.key == 'TTS_Services') return h(NIcon, null, { default: () => h(RadioOutline) })
}
// 启动后台任务
async function StartBackTask(isGiveUp) {
let startRes = await window.task.StartBackTask(isGiveUp)
if (startRes.code == 0) {
message.error(startRes.message)
} else {
message.success(startRes.message)
}
}
/** 判断是不是还是后台任务,用户确认是不是丢弃 */
async function CheckWaitTask() {
await TimeDelay(1000)
let getWaitTaskCountRes = await window.task.GetAllStatusTaskCount([
BookBackTaskStatus.WAIT,
BookBackTaskStatus.RECONNECT
])
// 报错,默认丢弃
if (getWaitTaskCountRes.code == 0) {
message.error(getWaitTaskCountRes.message)
await StartBackTask(true)
return
}
if (getWaitTaskCountRes.data && getWaitTaskCountRes.data > 0) {
// 这边提示用户是否丢弃
dialog.warning({
title: '后台任务',
content: `检测到后台未完成的任务,任务数量为 ${getWaitTaskCountRes.data},请选择操作!`,
positiveText: '继续执行',
negativeText: '丢弃所有',
onPositiveClick: async () => {
// 启动任务
await StartBackTask(false)
},
onNegativeClick: async () => {
// 丢弃任务
await StartBackTask(true)
}
})
} else {
// 启动任务
await StartBackTask(true)
}
}
/** 校验机器码的逻辑 */
async function GetMachineStatus() {
try {
// 获取机械码
const machineRes = await window.system.GetMachineId()
if (machineRes.code == 0) {
message.error(machineRes.message)
return
}
systemStore.machineId = machineRes.data
const checkMachineSatatusRes = await window.system.CheckMachineStatus(machineRes.data)
if (checkMachineSatatusRes.code == 1) {
// 自动检测成功,不同在弹窗手动进入
message.success('自动检测机器码成功')
// 判断是不是又后台任务
await CheckWaitTask()
return
} else {
message.error('自动检测机器码失败,请手动确认')
}
// 这边是调用手动检测机器码
// 弹窗,获取机器码
const da = 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 () => {
const checkMachineSatatusRes = await window.system.CheckMachineStatus(machineRes.data)
if (checkMachineSatatusRes.code == 1) {
// 自动检测成功,不同在弹窗手动进入
message.success('机器码校验成功')
da.destroy()
// 判断是不是又后台任务
await CheckWaitTask()
} else {
message.error(checkMachineSatatusRes.message)
return false
}
}
})
} catch (error) {
message.error('获取机器状态码失败,请联系管理员,错误信息如下:' + error.toString())
} finally {
show.value = false
}
}
onMounted(async () => {
// 加载版本
await window.api.GetVersion((value) => {
document.title = 'LAITool ' + value
})
let res = await window.system.GetViosionAndGpuMessage()
console.log(res)
if (res.code == 1) {
document.title = 'LAITool ' + res.data
} else {
message.success(res.message)
}
// 添加监听事件,同时按下ctrl + alt + l 打开控制台
window.addEventListener('keydown', (e) => {
@@ -215,36 +335,7 @@ export default defineComponent({
}
})
// 弹窗,获取机器码
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 () => {
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()
}
})
})
}
})
await GetMachineStatus()
window.api.getSettingDafultData(async (value) => {
window.config = value
@@ -546,7 +637,9 @@ export default defineComponent({
menuOptions,
expandIcon,
OpneBackTask,
collapsed
collapsed,
show,
systemStore
}
}
})
@@ -247,7 +247,7 @@ export default defineComponent({
}
imageLoading.value = true
await window.sd.txt2img(JSON.stringify([d]), async (value) => {
debugger
if (value.code == 0) {
message.error(value.message)
imageLoading.value = false
@@ -386,7 +386,7 @@ export default defineComponent({
negativeText: '取消',
onPositiveClick: async () => {
if (data.value.mj_message) {
debugger
// 加判断
// 只要状态不是success 和 error ,其他的都重新获取
if (data.value.mj_message.status == 'error') {
@@ -207,7 +207,7 @@ export default defineComponent({
style: `width : ${dialogWidth}px; min-height : ${dialogHeight}px`,
maskClosable: false,
onClose: async () => {
debugger
console.log(wenkeRef.value.word)
let word = wenkeRef.value.data
if (word == null || word == '') {
@@ -752,7 +752,7 @@ export default defineComponent({
* @param {*} row
*/
async function NextGenerateImage(row, ca = 'sd') {
debugger
let index = data.value.findIndex((item) => item.id == row.id)
let tempData = []
for (let i = index; i < data.value.length; i++) {
@@ -851,7 +851,7 @@ export default defineComponent({
*/
async function TranslateAll(key, index = -1) {
// 将中文翻译成英文
debugger
if (key == 'english') {
let tmp_d = []
for (let i = 0; i < data.value.length; i++) {
@@ -146,11 +146,11 @@ export default defineComponent({
message.error(value.message)
return
}
debugger
console.log(value.value)
// 拿到提示词文件地址,然后还是获取
await window.pmpt.OpenPromptFileTxt(value.value, (res) => {
debugger
console.log(res)
if (res.code == 0) {
message.error(res.message)
@@ -165,7 +165,7 @@ export default defineComponent({
positiveText: '继续',
negativeText: '取消',
onPositiveClick: async () => {
debugger
// 开始导入
for (let i = 0; i < data.value.length && i < res.data.length; i++) {
const element = res.data[i]
@@ -217,7 +217,7 @@ export default defineComponent({
* 生成所有的图片
*/
async function GenerateImageAll() {
debugger
let tmpData = cloneDeep(toRaw(data.value))
tmpData = tmpData.filter((item) => {
return item.imageLock == null || item.imageLock == false
@@ -363,11 +363,11 @@ export default defineComponent({
message.error(value.message)
return
}
debugger
console.log(value.value)
// 拿到提示词文件地址,然后还是获取
await window.pmpt.OpenPromptFileTxt(value.value, (res) => {
debugger
console.log(res)
if (res.code == 0) {
message.error(res.message)
@@ -382,7 +382,7 @@ export default defineComponent({
positiveText: '继续',
negativeText: '取消',
onPositiveClick: async () => {
debugger
// 开始导入
for (let i = 0; i < data.value.length && i < res.data.length; i++) {
const element = res.data[i]
@@ -118,13 +118,13 @@ export default defineComponent({
},
setup() {
let message = useMessage()
debugger
let settingStore = useSettingStore()
let addRef = ref(null)
let loading = ref(false)
onMounted(async () => {
debugger
console.log(settingStore)
})
let rules = {
@@ -137,7 +137,7 @@ export default defineComponent({
* 创建账号
*/
async function CreateAccount(e) {
debugger
e.preventDefault()
addRef.value?.validate(async (errors) => {
if (errors) {
@@ -289,7 +289,7 @@ export default defineComponent({
// 初始化现在设置的数据
async function InitData() {
debugger
// 获取到的是当前的配置信息
let res = await window.setting.GetMJSettingTreeData()
if (res.code == 0) {
@@ -360,7 +360,7 @@ export default defineComponent({
onMounted(async () => {
// 监听浏览器设置的中信息
window.api.setEventListen([DEFINE_STRING.DISCORD.OPERATE_REFRASH_DISCORD_URL], (value) => {
debugger
if (value.code == 0) {
message.error(value.message)
return
@@ -412,7 +412,7 @@ export default defineComponent({
*/
async function SaveMjSetting(e) {
// 在保存的时候要进行数据保存
debugger
e.preventDefault()
sampleRef.value?.validate(async (errors) => {
if (errors) {
@@ -144,8 +144,8 @@ export default defineComponent({
* 保存翻译设置
*/
async function SaveTranslateSetting() {
debugger
// 判断当前选中的数据是不是设置完善
//判断当前选中的数据是不是设置完善
let selectModel = translateSetting.value.selectModel
let settingIndex = translateSetting.value.translates.findIndex(
(item) => item.name == selectModel
+1 -1
View File
@@ -73,7 +73,7 @@ export default defineComponent({
* 切换角色的时候,修改角色的配置
*/
function ChangeCharacter(value) {
debugger
let role = roleOptions.value.find(
(item) => item.value === value
)
@@ -73,7 +73,7 @@ async function handlePageChange(currentPage) {
async function handleUpdateRow(row, index) {
if (row == null) {
debugger
// data.value.splice(index, 1)
// 直接重新加载吧
await GetTTSHistoryData(pagination.page)
+2 -2
View File
@@ -140,7 +140,7 @@ export default defineComponent({
let audioUrl = ref(null)
onMounted(async () => {
debugger
ttsOptions.value = GetTTSSelect()
// 加载服务端的TTS配置(目前的TTS配置是全局的)
@@ -276,7 +276,7 @@ export default defineComponent({
message.error(generateRes.message)
return
}
debugger
audioUrl.value = generateRes.mp3Path
softwareStore.spin.spinning = false
}
@@ -366,7 +366,7 @@ export default defineComponent({
})
return
}
debugger
GetCurrentFrameTextLodding.value = true
if (
type.value == SubtitleSavePositionType.MAIN_VIDEO ||
@@ -341,7 +341,7 @@ export default defineComponent({
* 回撤
*/
async function undo() {
debugger
if (step <= 0) {
// 如果没有可以撤销的步骤,就清空画布
imageContext.value.clearRect(
@@ -411,7 +411,7 @@ export default defineComponent({
* 查看效果
*/
async function Check() {
debugger
// 判断当前是不是有蒙板
if (canvasHistory.length == 0) {
message.error('请先选择去水印的区域')
@@ -446,7 +446,7 @@ export default defineComponent({
}
async function SaveMask() {
debugger
// 判断当前是不是又蒙板
if (canvasHistory.length <= 0) {
message.error('请先选择去水印的区域')
@@ -43,7 +43,7 @@ export default defineComponent({
}
async function selectImage(value) {
debugger
let img = await getBase64(value.file.file)
props.modifyImage(img)
}