From c1d6fe181dba79db54f4fb4e28c4edd502ded646 Mon Sep 17 00:00:00 2001 From: lq1405 <2769838458@qq.com> Date: Sat, 19 Jul 2025 12:46:27 +0800 Subject: [PATCH] temp --- resources/scripts/db/book.realm.lock | Bin 1416 -> 1416 bytes resources/scripts/db/software.realm.lock | Bin 1416 -> 1416 bytes src/define/db/model/Book/bookTask.ts | 3 + src/define/db/model/Book/bookTaskDetail.ts | 11 +- src/define/db/service/Book/bookBasic.ts | 34 +- .../db/service/Book/bookTaskDetailService.ts | 14 +- src/define/db/service/Book/bookTaskService.ts | 2 + src/define/define_string/bookDefineString.ts | 6 + src/define/enum/bookEnum.ts | 42 + src/define/enum/video.ts | 49 ++ src/main/IPCEvent/bookIpc.ts | 9 + src/main/Service/Book/BooKBasic.ts | 5 +- .../bookImageTextToVideoIndex.ts | 22 + .../bookImageTextToVideoInfo.ts | 257 ++++++ src/main/Service/Book/ReverseBook.ts | 3 +- src/main/Service/Book/bookBasicHandle.ts | 39 + src/main/Service/video/videoGlobal.ts | 1 - src/model/book/book.d.ts | 5 +- src/model/book/bookTaskDetail.d.ts | 2 + src/model/book/bookVideo.d.ts | 15 + src/preload/book/book.ts | 4 +- src/preload/book/video.ts | 13 +- src/renderer/components.d.ts | 11 + src/renderer/src/common/homeMenu.ts | 9 + src/renderer/src/common/time.ts | 41 + .../Components/Video/GenerateVideoDialog.vue | 6 +- .../Book/MJReverse/MonitorStatus.vue | 15 +- .../src/components/Book/ManageBookDetail.vue | 2 +- .../ImageTextVideo/ImageTextVideoHome.vue | 217 ++++++ .../ImageTextVideo/ImageTextVideoInfoHome.vue | 311 ++++++++ .../ImageTextVideo/ImageTextVideoBookItem.vue | 210 +++++ .../ImageTextVideoBookSidebar.vue | 103 +++ .../ImageTextVideoEmptyState.vue | 30 + .../ImageTextVideoMobileHeader.vue | 40 + .../ImageTextVideo/ImageTextVideoTaskCard.vue | 198 +++++ .../ImageTextVideo/ImageTextVideoTaskList.vue | 110 +++ .../ImageTextVideoInfoBasicInfo.vue | 72 ++ .../ImageTextVideoInfoConfig.vue | 76 ++ .../ImageTextVideoInfoEmptyState.vue | 25 + .../ImageTextVideoInfoProgress.vue | 45 ++ .../ImageTextVideoInfoTaskDetail.vue | 118 +++ .../ImageTextVideoInfoTaskList.vue | 535 +++++++++++++ .../ImageTextVideoInfoVideoConfig.vue | 138 ++++ .../ImageTextVideoInfoVideoListInfo.vue | 731 ++++++++++++++++++ .../Setting/MJSetting/MJSettingHome.vue | 2 +- src/renderer/src/main.js | 10 + src/stores/reverseManage.ts | 3 +- 47 files changed, 3570 insertions(+), 24 deletions(-) create mode 100644 src/main/Service/Book/BookImageTextToVideo/bookImageTextToVideoIndex.ts create mode 100644 src/main/Service/Book/BookImageTextToVideo/bookImageTextToVideoInfo.ts create mode 100644 src/main/Service/Book/bookBasicHandle.ts create mode 100644 src/model/book/bookVideo.d.ts create mode 100644 src/renderer/src/common/time.ts create mode 100644 src/renderer/src/components/ImageTextVideo/ImageTextVideoHome.vue create mode 100644 src/renderer/src/components/ImageTextVideo/ImageTextVideoInfoHome.vue create mode 100644 src/renderer/src/components/ImageTextVideo/components/ImageTextVideo/ImageTextVideoBookItem.vue create mode 100644 src/renderer/src/components/ImageTextVideo/components/ImageTextVideo/ImageTextVideoBookSidebar.vue create mode 100644 src/renderer/src/components/ImageTextVideo/components/ImageTextVideo/ImageTextVideoEmptyState.vue create mode 100644 src/renderer/src/components/ImageTextVideo/components/ImageTextVideo/ImageTextVideoMobileHeader.vue create mode 100644 src/renderer/src/components/ImageTextVideo/components/ImageTextVideo/ImageTextVideoTaskCard.vue create mode 100644 src/renderer/src/components/ImageTextVideo/components/ImageTextVideo/ImageTextVideoTaskList.vue create mode 100644 src/renderer/src/components/ImageTextVideo/components/ImageTextVideoInfo/ImageTextVideoInfoBasicInfo.vue create mode 100644 src/renderer/src/components/ImageTextVideo/components/ImageTextVideoInfo/ImageTextVideoInfoConfig.vue create mode 100644 src/renderer/src/components/ImageTextVideo/components/ImageTextVideoInfo/ImageTextVideoInfoEmptyState.vue create mode 100644 src/renderer/src/components/ImageTextVideo/components/ImageTextVideoInfo/ImageTextVideoInfoProgress.vue create mode 100644 src/renderer/src/components/ImageTextVideo/components/ImageTextVideoInfo/ImageTextVideoInfoTaskDetail.vue create mode 100644 src/renderer/src/components/ImageTextVideo/components/ImageTextVideoInfo/ImageTextVideoInfoTaskList.vue create mode 100644 src/renderer/src/components/ImageTextVideo/components/ImageTextVideoInfo/ImageTextVideoInfoVideoConfig.vue create mode 100644 src/renderer/src/components/ImageTextVideo/components/ImageTextVideoInfo/ImageTextVideoInfoVideoListInfo.vue diff --git a/resources/scripts/db/book.realm.lock b/resources/scripts/db/book.realm.lock index 7e8318dfbd672b9c30d6d37a98e5eb8aa477ae88..2624449808541b658146e2a7439658d23e4ee183 100644 GIT binary patch literal 1416 zcmZQ%Mj&{ zU{yB*OQ*F3VYPP=nz|FG<*=$- zh^B6W3ikB37)_nSE$rqkK~rauAcNK3jcDp#*r;Gtw+T&MM?QA*HlwKvkP^mf9-`cU Tqb* literal 1416 zcmZQ%vH(?pFgBooCWx>X;+7RB*}*D6ZbAkv baQ8vf-8ckMhpc9lJsJX|Aut*OLn#CRl_~{U literal 1416 zcmZQ% { label: string @@ -61,6 +62,7 @@ export class BookTaskModel extends Realm.Object { errorMsg: string | null isAuto: boolean // 是否自动 openVideoGenerate: boolean | null // 是否开启视频生成 + videoCategory: ImageToVideoModels // 图转视频方式 updateTime: Date createTime: Date imageCategory: BookImageCategory // 图片出图方式 @@ -96,6 +98,7 @@ export class BookTaskModel extends Realm.Object { updateTime: 'date', createTime: 'date', imageCategory: 'string', + videoCategory: "string", }, // 主键为_id primaryKey: 'id' diff --git a/src/define/db/model/Book/bookTaskDetail.ts b/src/define/db/model/Book/bookTaskDetail.ts index e67169d..08a6d3d 100644 --- a/src/define/db/model/Book/bookTaskDetail.ts +++ b/src/define/db/model/Book/bookTaskDetail.ts @@ -1,9 +1,6 @@ import Realm, { ObjectSchema } from 'realm' import { - BookBackTaskStatus, - BookBackTaskType, BookTaskStatus, - BookType, MJAction, } from '../../../enum/bookEnum' import { MJImageType } from '../../../enum/mjEnum' @@ -65,10 +62,12 @@ export class VideoMessage extends Realm.Object { bookTaskDetailId: string; status: string | null; videoUrl: string | null; + videoUrls: string[] | null; // 视频地址数组 taskId: string | null; runwayOptions: string | null; // 生成视频的一些设置 lumaOptions: string | null; // 生成视频的一些设置 klingOptions: string | null; // 生成视频的一些设置 + mjVideoOptions: string | null; // MJ生成视频的一些设置 messageData: string | null; static schema: ObjectSchema = { name: 'VideoMessage', @@ -87,7 +86,9 @@ export class VideoMessage extends Realm.Object { runwayOptions: "string?", lumaOptions: "string?", klingOptions: "string?", - messageData: 'string?' + mjVideoOptions: "string?", + messageData: 'string?', + videoUrls: 'string[]' }, primaryKey: 'id' } @@ -172,6 +173,7 @@ export class BookTaskDetailModel extends Realm.Object { bookTaskId: string videoPath: string | null // 视频地址 generateVideoPath: string | null // 生成视频地址 + subVideoPath: string[] | null // 生成的批次视频的地址 audioPath: string | null // 音频地址 word: string | null // 文案 oldImage: string | null // 旧图片(用于SD的图生图) @@ -207,6 +209,7 @@ export class BookTaskDetailModel extends Realm.Object { bookTaskId: { type: 'string', indexed: true }, videoPath: 'string?', generateVideoPath: 'string?', // 生成视频地址 + subVideoPath : "string[]", // 生成的批次视频的地址 audioPath: 'string?', word: 'string?', oldImage: 'string?', diff --git a/src/define/db/service/Book/bookBasic.ts b/src/define/db/service/Book/bookBasic.ts index 321d3ef..4f53472 100644 --- a/src/define/db/service/Book/bookBasic.ts +++ b/src/define/db/service/Book/bookBasic.ts @@ -249,6 +249,38 @@ const migration = (oldRealm: Realm, newRealm: Realm) => { newBookTask[i].klingOptions = undefined; } } + if (oldRealm.schemaVersion < 40) { + const oldBookTask = oldRealm.objects('BookTask') + const newBookTask = newRealm.objects('BookTask') + for (let i = 0; i < oldBookTask.length; i++) { + newBookTask[i].videoCategory = "RUNWAY"; + newBookTask[i].videoCategory = "RUNWAY"; + } + } + if (oldRealm.schemaVersion < 41) { + const oldBookTask = oldRealm.objects('BookTaskDetail') + const newBookTask = newRealm.objects('BookTaskDetail') + for (let i = 0; i < oldBookTask.length; i++) { + newBookTask[i].mjVideoOptions = undefined; + } + } + + if (oldRealm.schemaVersion < 42) { + const oldBookTask = oldRealm.objects('VideoMessage') + const newBookTask = newRealm.objects('VideoMessage') + for (let i = 0; i < oldBookTask.length; i++) { + newBookTask[i].videoUrls = []; + } + } + + if (oldRealm.schemaVersion < 43) { + const oldBookTask = oldRealm.objects('VideoMessage') + const newBookTask = newRealm.objects('VideoMessage') + for (let i = 0; i < oldBookTask.length; i++) { + newBookTask[i].subVideoPath = []; + } + } + } export class BaseRealmService extends BaseService { @@ -291,7 +323,7 @@ export class BaseRealmService extends BaseService { VideoMessage ], path: this.dbpath, - schemaVersion: 39, + schemaVersion: 43, migration: migration } this.realm = await Realm.open(config) diff --git a/src/define/db/service/Book/bookTaskDetailService.ts b/src/define/db/service/Book/bookTaskDetailService.ts index 289070b..7191156 100644 --- a/src/define/db/service/Book/bookTaskDetailService.ts +++ b/src/define/db/service/Book/bookTaskDetailService.ts @@ -73,6 +73,9 @@ export class BookTaskDetailService extends BaseRealmService { subImagePath: (item.subImagePath as string[])?.map((subImage) => { return JoinPath(define.project_path, subImage) }), + subVideoPath: (item.subVideoPath as string[])?.map((subVideo) => { + return JoinPath(define.project_path, subVideo) + }), characterTags: item.characterTags ? item.characterTags.map((tag) => tag) : null, sceneTags: item.sceneTags ? item.sceneTags.map((tag) => tag) : null, subValue: isEmpty(item.subValue) ? null : JSON.parse(item.subValue), @@ -202,7 +205,16 @@ export class BookTaskDetailService extends BaseRealmService { } // 开始修改 for (let key in updateData) { - bookTaskDetail[key] = updateData[key] + + let newData = updateData[key]; + + if (key == "generateVideoPath") { + if (!isEmpty(updateData[key])) { + newData = path.relative(define.project_path, updateData[key]) + } + } + + bookTaskDetail[key] = newData; } bookTaskDetail.updateTime = new Date() }) diff --git a/src/define/db/service/Book/bookTaskService.ts b/src/define/db/service/Book/bookTaskService.ts index 8021373..788d632 100644 --- a/src/define/db/service/Book/bookTaskService.ts +++ b/src/define/db/service/Book/bookTaskService.ts @@ -13,6 +13,7 @@ import { TagDefine } from '../../../tagDefine.js' import { ImageStyleDefine } from "../../../../define/iamgeStyleDefine" import { cloneDeep } from 'lodash' import { GeneralResponse } from '../../../../model/generalResponse' +import { ImageToVideoModels } from '@/define/enum/video' let dbPath = path.resolve(define.db_path, 'book.realm') @@ -91,6 +92,7 @@ export class BookTaskService extends BaseRealmService { imageFolder: JoinPath(define.project_path, bookTask.imageFolder), cacheImageList: bookTask.cacheImageList ? Array.from(bookTask.cacheImageList).map(item => JoinPath(define.project_path, item)) : [], imageCategory: bookTask.imageCategory ? bookTask.imageCategory : BookImageCategory.MJ, // 默认使用MJ出图 + videoCategory : bookTask.videoCategory ? bookTask.videoCategory : ImageToVideoModels.MJ_VIDEO } as Book.SelectBookTask; }) diff --git a/src/define/define_string/bookDefineString.ts b/src/define/define_string/bookDefineString.ts index 0972dd5..615464e 100644 --- a/src/define/define_string/bookDefineString.ts +++ b/src/define/define_string/bookDefineString.ts @@ -196,6 +196,12 @@ const BOOK = { /** Runway图转视频返回前端数据任务 */ RUNWAY_IMAGE_TO_VIDEO_RETURN: "RUNWAY_IMAGE_TO_VIDEO_RETURN", + /** 获取指定的条件的图转视频的数据,包含字批次 */ + GET_VIDEO_BOOK_INFO_LIST: "GET_VIDEO_BOOK_INFO_LIST", + + /** 获取小说图片和视频生成进度 */ + GET_BOOK_IMAGE_AND_VIDEO_PROGRESS : "GET_BOOK_IMAGE_AND_VIDEO_PROGRESS" + //#endregion } diff --git a/src/define/enum/bookEnum.ts b/src/define/enum/bookEnum.ts index 3c1091c..30b5d40 100644 --- a/src/define/enum/bookEnum.ts +++ b/src/define/enum/bookEnum.ts @@ -302,6 +302,48 @@ export enum BookTagSelectType { } +/** + * 根据小说类型值返回对应的中文标签 + * @param value 小说类型值 + * @returns 中文标签 + */ +export function GetBookTypeLabel(value: string) { + if (value == BookType.MJ_REVERSE) { + return 'MJ反推' + } else if (value == BookType.SD_REVERSE) { + return 'SD反推' + } else if (value == BookType.ORIGINAL) { + return '原创' + } else { + return '未知' + } +} + +/** + * 根据小说图片生成方式返回对应的标签 + * @param value 图片生成方式类型 + * @returns 对应的显示标签 + */ +export function GetBookImageCategoryLabel(value: string) { + switch (value) { + case BookImageCategory.MJ: + return 'MJ'; + case BookImageCategory.SD: + return 'SD'; + case BookImageCategory.ComfyUI: + return 'ComfyUI'; + case BookImageCategory.D3: + return 'D3'; + case BookImageCategory.FLUX_API: + return 'FLUX API'; + case BookImageCategory.FLUX_FORGE: + return 'FLUX FORGE'; + default: + return '未知'; + } +} + + /** * 根据Key返回指定的后台任务类型的label * @param key diff --git a/src/define/enum/video.ts b/src/define/enum/video.ts index 30f9c0a..66bcd60 100644 --- a/src/define/enum/video.ts +++ b/src/define/enum/video.ts @@ -1,3 +1,6 @@ + +//#region 图转视频类型 + /** 图片转视频的方式 */ export enum ImageToVideoModels { /** runway 生成视频 */ @@ -8,8 +11,54 @@ export enum ImageToVideoModels { KLING = "KLING", /** Pika 生成视频 */ PIKA = "PIKA", + /** MJ 图转视频 */ + MJ_VIDEO = "MJ_VIDEO" } +/** + * 图片转视频模型的名称转换 + * @param model 图片转视频的模型类型 + * @returns 模型的中文名称 + */ +export const GetImageToVideoModelsLabel = (model: ImageToVideoModels | string) => { + switch (model) { + case ImageToVideoModels.RUNWAY: + return "Runway"; + case ImageToVideoModels.LUMA: + return "Luma"; + case ImageToVideoModels.KLING: + return "可灵"; + case ImageToVideoModels.PIKA: + return "Pika"; + case ImageToVideoModels.MJ_VIDEO: + return "MJ视频"; + default: + return "未知"; + } +} + +/** + * 获取图像转视频模型选项的函数 + * + * 该函数返回一个包含所有可用图像转视频模型的选项数组。 + * 每个选项包含一个标签(label)和一个值(value)。 + * 标签通过调用 GetImageToVideoModelsLabel 函数获得,而值则直接使用 ImageToVideoModels 枚举值。 + * + * @returns 图像转视频模型选项数组,每个选项包含 label 和 value 属性 + */ +export const GetImageToVideoModelsOptions = () => { + return [ + { label: GetImageToVideoModelsLabel(ImageToVideoModels.RUNWAY), value: ImageToVideoModels.RUNWAY }, + { label: GetImageToVideoModelsLabel(ImageToVideoModels.LUMA), value: ImageToVideoModels.LUMA }, + { label: GetImageToVideoModelsLabel(ImageToVideoModels.KLING), value: ImageToVideoModels.KLING }, + { label: GetImageToVideoModelsLabel(ImageToVideoModels.PIKA), value: ImageToVideoModels.PIKA }, + { label: GetImageToVideoModelsLabel(ImageToVideoModels.MJ_VIDEO), value: ImageToVideoModels.MJ_VIDEO } + ] +} + +//#endregion + + //#region 通用 /** 生成视频的方式 */ diff --git a/src/main/IPCEvent/bookIpc.ts b/src/main/IPCEvent/bookIpc.ts index 8950e6c..fe20323 100644 --- a/src/main/IPCEvent/bookIpc.ts +++ b/src/main/IPCEvent/bookIpc.ts @@ -16,6 +16,7 @@ import { BookPrompt } from '../Service/Book/bookPrompt' import { BookGeneral } from '../Service/Book/bookGeneral' import { OperateBookType } from '../../define/enum/bookEnum' import { VideoGlobal } from '../Service/video/videoGlobal' +import { BookImageTextToVideoIndex } from "@/main/Service/Book/BookImageTextToVideo/bookImageTextToVideoIndex"; let reverseBook = new ReverseBook() let basicReverse = new BasicReverse() let subtitle = new Subtitle() @@ -31,6 +32,7 @@ let bookFrame = new BookFrame() let bookPrompt = new BookPrompt(); let bookGeneral = new BookGeneral() let videoGlobal = new VideoGlobal() +let bookImageTextToVideoIndex = new BookImageTextToVideoIndex(); export function BookIpc() { // 获取样式图片的子列表 @@ -369,6 +371,13 @@ export function BookIpc() { /** 修改小说详细分镜的Videomessage */ ipcMain.handle(DEFINE_STRING.BOOK.UPDATE_BOOK_TASK_DETAIL_VIDEO_MESSAGE, async (event, bookTaskDetailId, videoMessage) => await videoGlobal.UpdateBookTaskDetailVideoMessage(bookTaskDetailId, videoMessage)) + /** 获取指定的条件的图转视频的数据,包含子批次 */ + ipcMain.handle(DEFINE_STRING.BOOK.GET_VIDEO_BOOK_INFO_LIST, async (event, + condition: BookVideo.BookVideoInfoListQuertCondition) => await bookImageTextToVideoIndex.GetVideoBookInfoList(condition)) + + /** 获取小说图片和视频生成进度 */ + ipcMain.handle(DEFINE_STRING.BOOK.GET_BOOK_IMAGE_AND_VIDEO_PROGRESS, async (event, bookId?: string, bookTaskId?: string) => await bookImageTextToVideoIndex.bookImageTextToVideoInfo.GetBookImageAndVideoProgress(bookId, bookTaskId)) + //#endregion } diff --git a/src/main/Service/Book/BooKBasic.ts b/src/main/Service/Book/BooKBasic.ts index dc5ba04..45751e0 100644 --- a/src/main/Service/Book/BooKBasic.ts +++ b/src/main/Service/Book/BooKBasic.ts @@ -1,12 +1,11 @@ -import { BookType, OperateBookType, TagDefineType } from '../../../define/enum/bookEnum' +import { BookType } from '../../../define/enum/bookEnum' import { errorMessage, successMessage } from '../../Public/generalTools' import { BookService } from '../../../define/db/service/Book/bookService' import path from 'path' -import { CheckFileOrDirExist, CheckFolderExistsOrCreate, CopyFileOrFolder, DeleteFolderAllFile, GetSubdirectories } from '../../../define/Tools/file' +import { CheckFileOrDirExist, DeleteFolderAllFile, GetSubdirectories } from '../../../define/Tools/file' import { GeneralResponse } from '../../../model/generalResponse' import { BookServiceBasic } from '../ServiceBasic/bookServiceBasic' import { BookTask } from './bookTask' -import fs from 'fs' import { Book } from '../../../model/book/book' export class BookBasic { diff --git a/src/main/Service/Book/BookImageTextToVideo/bookImageTextToVideoIndex.ts b/src/main/Service/Book/BookImageTextToVideo/bookImageTextToVideoIndex.ts new file mode 100644 index 0000000..19a400e --- /dev/null +++ b/src/main/Service/Book/BookImageTextToVideo/bookImageTextToVideoIndex.ts @@ -0,0 +1,22 @@ +import { BookImageTextToVideoInfo } from "./bookImageTextToVideoInfo"; + + +export class BookImageTextToVideoIndex { + + bookImageTextToVideoInfo: BookImageTextToVideoInfo; + + constructor() { + this.bookImageTextToVideoInfo = new BookImageTextToVideoInfo(); + } + + //#region Info + + /** 获取用于视频生成的小说信息列表 根据查询条件返回小说数据,如果指定了bookTaskId,则返回对应小说的单个任务数据 否则返回所有启用了视频生成功能的小说及其任务数据 */ + GetVideoBookInfoList = async (condition: BookVideo.BookVideoInfoListQuertCondition) => await this.bookImageTextToVideoInfo.GetVideoBookInfoList(condition) + + + GetBookImageAndVideoProgress = async (bookId?: string, bookTaskId?: string) => await this.bookImageTextToVideoInfo.GetBookImageAndVideoProgress(bookId, bookTaskId); + + //#endregion + +} \ No newline at end of file diff --git a/src/main/Service/Book/BookImageTextToVideo/bookImageTextToVideoInfo.ts b/src/main/Service/Book/BookImageTextToVideo/bookImageTextToVideoInfo.ts new file mode 100644 index 0000000..3c8b0c9 --- /dev/null +++ b/src/main/Service/Book/BookImageTextToVideo/bookImageTextToVideoInfo.ts @@ -0,0 +1,257 @@ +import { errorMessage, successMessage } from "@/main/Public/generalTools"; +import { BookBasicHandle } from "../bookBasicHandle"; +import { isEmpty } from "lodash"; +import { CheckFileOrDirExist } from "@/define/Tools/file"; +import { Book } from "@/model/book/book"; + +// 定义进度数据的类型 +export interface ProgressData { + imageProgress: number; + videoProgress: number; + totalCount: number; + imageRate: number; + videoRate: number; +} + +// 定义嵌套的 Record 类型 +export type BookProgressRecord = Record>; + + + +export class BookImageTextToVideoInfo extends BookBasicHandle { + + constructor() { + super(); + } + + //#region GetVideoBookInfoList + /** + * 获取用于视频生成的小说信息列表 + * 根据查询条件返回小说数据,如果指定了bookTaskId,则返回对应小说的单个任务数据 + * 否则返回所有启用了视频生成功能的小说及其任务数据 + * @param condition 查询条件,包含可选的bookTaskId等参数 + * @returns 处理结果,成功时返回小说数据,失败时返回错误信息 + */ + GetVideoBookInfoList = async (condition: BookVideo.BookVideoInfoListQuertCondition) => { + try { + await this.InitBookBasicHandle(); + + // 获取小说的所有的数据 + let bookRes = this.bookService.GetBookData(condition); + + if (bookRes.code !== 1) { + return errorMessage('获取小说数据失败,错误信息:' + bookRes.message, 'BookImageTextToVideoInfo_GetVideoBookInfoList'); + } + + let bookList = bookRes.data.res_book ?? []; + if (bookList.length <= 0) { + return errorMessage('没有找到对应的小说数据,请先添加小说', 'BookImageTextToVideoInfo_GetVideoBookInfoList'); + } + + // 有指定的小说批次任务的ID情况下 只返回当前的小说数据 + if (condition.bookTaskId) { + let bookTask = this.bookTaskService.GetBookTaskDataById(condition.bookTaskId); + if (bookTask == null) { + return errorMessage('没有找到对应的小说批次数据,请先添加小说批次', 'BookImageTextToVideoInfo_GetVideoBookInfoList'); + } + // 再上面的小说数据里面获取数据 然后直接返回就行 + let bookInfo = bookList.find(book => book.id === bookTask.bookId); + if (!bookInfo) { + return errorMessage('没有找到对应的小说数据,请先添加小说', 'BookImageTextToVideoInfo_GetVideoBookInfoList'); + } + bookInfo.bookTasks = [bookTask]; + // 返回 + return successMessage(bookInfo, '获取小说批次任务数据成功', 'BookImageTextToVideoInfo_GetVideoBookInfoList'); + } + + // 没有那个数据 将所有的数据进行处理 + let res = []; + for (let i = 0; i < bookList.length; i++) { + const element = bookList[i]; + // 获取小说批次任务数据 + let bookTaskRes = this.bookTaskService.GetBookTaskData({ bookId: element.id }); + if (bookTaskRes.code != 1) { + continue; + } + if (bookTaskRes.data.bookTasks.length > 0) { + // 检查所有的 bookTasks 里面是不是开启了图转视频功能 + let videoBookTasks = bookTaskRes.data.bookTasks.filter(task => task.openVideoGenerate); + if (videoBookTasks.length <= 0) { + continue; + } else { + element.bookTasks = videoBookTasks; + res.push(element); + } + } + } + + return successMessage( + res, + '获取小说批次任务数据成功', + 'BookImageTextToVideoInfo_GetVideoBookInfoList' + ); + + } catch (error) { + return errorMessage( + '初始化BookBasicHandle失败,错误信息如下:' + error.toString(), + 'BookImageTextToVideoInfo_GetVideoBookInfoList' + ); + } + } + + //#endregion + + + //#region GetBookImageAndVideoProgress + + + /** + * 获取小说图片和视频生成的进度信息 + * 根据提供的参数查询指定小说或小说任务的图片和视频生成进度 + * @param bookId 可选,小说ID,如果提供则只返回该小说的进度数据 + * @param bookTaskId 可选,小说任务ID,如果提供则只返回该任务的进度数据 + * @returns 返回包含进度信息的对象,成功时返回进度数据,失败时返回错误信息 + */ + GetBookImageAndVideoProgress = async (bookId?: string, bookTaskId?: string) => { + try { + await this.InitBookBasicHandle(); + + let bookIds: Record = {}; + // 开始处理获取对应的小说ID和关联数据 + if (!isEmpty(bookId)) { + let bookInfo = this.bookService.GetBookDataById(bookId); + if (bookInfo == null) { + return errorMessage('没有找到对应的小说数据,请先添加小说', 'BookImageTextToVideoInfo_GetBookImageAndVideoProgress'); + } + bookIds[bookInfo.id] = []; + } else { + // 获取所有的小说数据 + let bookRes = this.bookService.GetBookData({}); + if (bookRes.code !== 1) { + return errorMessage('获取小说数据失败,错误信息:' + bookRes.message, 'BookImageTextToVideoInfo_GetBookImageAndVideoProgress'); + } + let bookList = bookRes.data.res_book ?? []; + if (bookList.length <= 0) { + return errorMessage('没有找到对应的小说数据,请先添加小说', 'BookImageTextToVideoInfo_GetBookImageAndVideoProgress'); + } + // 将所有的小说ID添加到bookIds里面 + for (let i = 0; i < bookList.length; i++) { + const element = bookList[i]; + bookIds[element.id] = []; + } + } + + // 判断小说任务ID是不是存在 存在的话判断小说任务的ID是不是再bookIds里面 在的话更新bookIds中指定的ID的值数据 + if (!isEmpty(bookTaskId)) { + let bookTaskInfo = this.bookTaskService.GetBookTaskDataById(bookTaskId); + if (bookTaskInfo == null) { + return errorMessage('没有找到对应的小说批次数据,请先添加小说批次', 'BookImageTextToVideoInfo_GetBookImageAndVideoProgress'); + } + // 判断当前的bookid 是不是再 bookIds里面 + if (bookTaskInfo.bookId && bookIds[bookTaskInfo.bookId]) { + bookIds[bookTaskInfo.bookId] = [bookTaskInfo.id]; + } else { + return errorMessage('当前的小说批次任务ID不属于指定的小说ID', 'BookImageTextToVideoInfo_GetBookImageAndVideoProgress'); + } + } else { + // 遍历 bookIds 获取所有的小说批次任务ID + for (const bookId of Object.keys(bookIds)) { + // 获取小说批次任务数据 + let bookTaskRes = this.bookTaskService.GetBookTaskData({ bookId: bookId }); + if (bookTaskRes.code !== 1) { + continue; + } + if (bookTaskRes.data.bookTasks.length > 0) { + // 检查所有的 bookTasks 里面是不是开启了图转视频功能 + let ids = bookTaskRes.data.bookTasks.map(task => task.id); + bookIds[bookId] = ids; + } + } + } + + // 遍历 bookIds 将值数据为空或者长度为0的都删除 + Object.keys(bookIds).forEach(bookId => { + if (isEmpty(bookIds[bookId]) || bookIds[bookId].length <= 0) { + delete bookIds[bookId]; + } + }); + + // 检查最终结果 + if (Object.keys(bookIds).length === 0) { + return successMessage({}, '没有找到对应的小说数据或者小说批次任务数据', 'BookImageTextToVideoInfo_GetBookImageAndVideoProgress'); + } + + // 这边开始处理数据 + let resData = await this.ProgressHandle(bookIds); + + return successMessage( + resData, + '获取小说图片和视频生成进度成功', + 'BookImageTextToVideoInfo_GetBookImageAndVideoProgress' + ); + + } catch (error) { + return errorMessage( + '获取小说图片和视频生成进度失败,错误信息如下:' + error.toString(), + 'BookImageTextToVideoInfo_GetBookImageAndVideoProgress' + ); + } + } + + /** + * 处理进度数据 + * 遍历小说ID和批次任务ID,计算每个任务的图片和视频生成进度 + * @param bookIds 小说ID和对应小说任务ID的映射关系,格式为 {bookId: [taskId1, taskId2, ...]} + * @returns 返回每本书每个任务的进度数据,包含图片进度、视频进度、总数量和完成率 + */ + private ProgressHandle = async (bookIds: Record) => { + // 这边开始处理数据 + let resData: BookProgressRecord = {}; + + // 遍历 bookIds 获取所有的小说批次任务数据 + for (const bookId of Object.keys(bookIds)) { + let bookTaskIds = bookIds[bookId]; + if (!bookTaskIds && bookTaskIds.length <= 0) { + continue; + } + resData[bookId] = {}; + + // 获取小说批次任务数据 + for (let i = 0; i < bookTaskIds.length; i++) { + const element = bookTaskIds[i]; + let bookTaskDetails = this.bookTaskDetailService.GetBookTaskData({ bookTaskId: element, bookId: bookId }); + if (bookTaskDetails.code !== 1) { + continue; + } + + // 遍历 bookTaskDetails 获取每个小说批次任务的进度数据 + let imageProgress = 0; + let videoProgress = 0; + for (let j = 0; j < bookTaskDetails.data.length; j++) { + const bookTaskDetail = bookTaskDetails.data[j] as Book.SelectBookTaskDetail; + // 检查图片信息 + if (!isEmpty(bookTaskDetail.outImagePath) && await CheckFileOrDirExist(bookTaskDetail.outImagePath)) { + imageProgress += 1; + } + // 检查视频信息 + if (!isEmpty(bookTaskDetail.videoPath) && await CheckFileOrDirExist(bookTaskDetail.videoPath)) { + videoProgress += 1; + } + } + // 开始添加数据 + resData[bookId][element] = { + imageProgress: imageProgress, + videoProgress: videoProgress, + totalCount: bookTaskDetails.data.length, + imageRate: bookTaskDetails.data.length > 0 ? (imageProgress / bookTaskDetails.data.length) * 100 : 0, + videoRate: bookTaskDetails.data.length > 0 ? (videoProgress / bookTaskDetails.data.length) * 100 : 0 + } + } + } + + return resData; + } + + //#endregion + +} \ No newline at end of file diff --git a/src/main/Service/Book/ReverseBook.ts b/src/main/Service/Book/ReverseBook.ts index 585b5a4..9e335c5 100644 --- a/src/main/Service/Book/ReverseBook.ts +++ b/src/main/Service/Book/ReverseBook.ts @@ -134,7 +134,8 @@ export class ReverseBook { return { ...item, outImagePath: isEmpty(item.outImagePath) ? item.outImagePath : item.outImagePath + '?t=' + new Date().getTime(), - subImagePath: item.subImagePath && item.subImagePath.length > 0 ? item.subImagePath.map(it => it + '?t=' + new Date().getTime()) : item.subImagePath + subImagePath: item.subImagePath && item.subImagePath.length > 0 ? item.subImagePath.map(it => it + '?t=' + new Date().getTime()) : item.subImagePath, + subVideoPath: item.subVideoPath && item.subVideoPath.length > 0 ? item.subVideoPath.map(it => it + '?t=' + new Date().getTime()) : item.subVideoPath, } }) diff --git a/src/main/Service/Book/bookBasicHandle.ts b/src/main/Service/Book/bookBasicHandle.ts new file mode 100644 index 0000000..609237a --- /dev/null +++ b/src/main/Service/Book/bookBasicHandle.ts @@ -0,0 +1,39 @@ +import { BookService } from "@/define/db/service/Book/bookService" +import { BookTaskDetailService } from "@/define/db/service/Book/bookTaskDetailService" +import { BookTaskService } from "@/define/db/service/Book/bookTaskService" +import { OptionRealmService } from "@/define/db/service/SoftWare/optionRealmService" + +export class BookBasicHandle { + bookTaskDetailService!: BookTaskDetailService + bookTaskService!: BookTaskService + optionRealmService!: OptionRealmService + bookService!: BookService + + + constructor() { + // 初始化 + } + + async InitBookBasicHandle() { + // 如果 bookTaskDetailService 已经初始化,则直接返回 + if (!this.bookTaskDetailService) { + this.bookTaskDetailService = await BookTaskDetailService.getInstance() + } + if (!this.bookTaskService) { + this.bookTaskService = await BookTaskService.getInstance() + } + if (!this.optionRealmService) { + this.optionRealmService = await OptionRealmService.getInstance() + } + if (!this.bookService) { + this.bookService = await BookService.getInstance() + } + } + + async transaction(callback: (realm: any) => void) { + await this.InitBookBasicHandle() + this.bookService.transaction(() => { + callback(this.bookService.realm) + }) + } +} \ No newline at end of file diff --git a/src/main/Service/video/videoGlobal.ts b/src/main/Service/video/videoGlobal.ts index e3ff7c3..52e5117 100644 --- a/src/main/Service/video/videoGlobal.ts +++ b/src/main/Service/video/videoGlobal.ts @@ -3,7 +3,6 @@ import { DownloadFile, GetBaseUrl } from "@/define/Tools/common"; import { errorMessage, successMessage } from "@/main/Public/generalTools"; import { BookTaskDetail } from "@/model/book/bookTaskDetail"; import { GptService } from "@/main/Service/GPT/gpt"; -import { v4 as uuidv4 } from "uuid"; import { BookServiceBasic } from "../ServiceBasic/bookServiceBasic"; import { isEmpty } from "lodash"; import path from "path"; diff --git a/src/model/book/book.d.ts b/src/model/book/book.d.ts index 21ff4ea..855bf36 100644 --- a/src/model/book/book.d.ts +++ b/src/model/book/book.d.ts @@ -1,3 +1,4 @@ +import { ImageToVideoModels } from "@/define/enum/video" import { BookBackTaskStatus, BookBackTaskType, BookTaskStatus, BookType, TaskExecuteType, BookRepalceDataType, BookImageCategory } from "../../define/enum/bookEnum" import { MJAction } from "../../define/enum/bookEnum" import { MJImageType } from "../../define/enum/mjEnum" @@ -78,6 +79,7 @@ declare namespace Book { isAuto?: boolean // 是否标记全自动 subImageFolder?: string[] | null // 子图片文件夹地址,多个 openVideoGenerate?: boolean // 是否开启视频生成 + videoCategory?: ImageToVideoModels } // 添加批次任务 @@ -151,6 +153,7 @@ declare namespace Book { bookTaskId?: string videoPath?: string // 视频地址 generateVideoPath?: string // 生成的视频地址 + subVideoPath?: string[] // 生成的批次视频的地址 audioPath?: string // 音频地址 draftDepend?: string // 草稿依赖 word?: string // 文案 @@ -178,8 +181,6 @@ declare namespace Book { updateTime?: Date } - - type QueryBookTaskCondition = { id?: string no?: number diff --git a/src/model/book/bookTaskDetail.d.ts b/src/model/book/bookTaskDetail.d.ts index 3bd3ef3..dfb2161 100644 --- a/src/model/book/bookTaskDetail.d.ts +++ b/src/model/book/bookTaskDetail.d.ts @@ -20,6 +20,8 @@ declare namespace BookTaskDetail { runwayOptions?: string; lumaOptions?: string; klingOptions?: string; + mjVideoOptions?: string; + videoUrls?: string[]; // 视频地址数组 messageData?: string; } diff --git a/src/model/book/bookVideo.d.ts b/src/model/book/bookVideo.d.ts new file mode 100644 index 0000000..1321d27 --- /dev/null +++ b/src/model/book/bookVideo.d.ts @@ -0,0 +1,15 @@ +declare namespace BookVideo { + + + /** + * 表示用于检索小说转视频信息列表的查询条件的接口。 + * + * @interface BookVideoInfoListQuertCondition + * @property {string?} [bookId] - 用于筛选视频的小说ID + * @property {string?} [bookTaskId] - 用于筛选视频的小说任务ID + */ + interface BookVideoInfoListQuertCondition { + bookId?: string; // 图书ID + bookTaskId?: string; // 图书任务ID + } +} \ No newline at end of file diff --git a/src/preload/book/book.ts b/src/preload/book/book.ts index de70dc0..948dbad 100644 --- a/src/preload/book/book.ts +++ b/src/preload/book/book.ts @@ -6,7 +6,9 @@ import { BookType, OperateBookType } from '../../define/enum/bookEnum' import Video from './video' const book = { - ...Video, + video: { + ...Video + }, // 获取小说操作类型(原创/SD反推/MJ反推) GetBookType: async () => await ipcRenderer.invoke(DEFINE_STRING.BOOK.GET_BOOK_TYPE), diff --git a/src/preload/book/video.ts b/src/preload/book/video.ts index 9ba9d84..06ea7ef 100644 --- a/src/preload/book/video.ts +++ b/src/preload/book/video.ts @@ -3,7 +3,7 @@ import { ipcRenderer } from "electron" const Video = { - /** 初始化图转视频消息 */ + /** 初始化小说图片转视频消息 */ InitVideoMessage: async (bookTaskDetailId: string) => { return await ipcRenderer.invoke(DEFINE_STRING.BOOK.INIT_VIDEO_MESSAGE, bookTaskDetailId) }, @@ -11,8 +11,17 @@ const Video = { /** 修改小说详情的VideoMessage */ UpdateBookTaskDetailVideoMessage: async (bookTaskDetailId: string, videoMessage: any) => { return await ipcRenderer.invoke(DEFINE_STRING.BOOK.UPDATE_BOOK_TASK_DETAIL_VIDEO_MESSAGE, bookTaskDetailId, videoMessage) - } + }, + /** 获取指定条件的小说图转视频数据,包含子批次 */ + GetVideoBookInfoList: async (condition: BookVideo.BookVideoInfoListQuertCondition) => { + return await ipcRenderer.invoke(DEFINE_STRING.BOOK.GET_VIDEO_BOOK_INFO_LIST, condition) + }, + + /** 获取小说图片和视频生成进度 */ + GetBookImageAndVideoProgress: async (bookId?: string, bookTaskId?: string) => { + return await ipcRenderer.invoke(DEFINE_STRING.BOOK.GET_BOOK_IMAGE_AND_VIDEO_PROGRESS, bookId, bookTaskId) + } } export default Video; \ No newline at end of file diff --git a/src/renderer/components.d.ts b/src/renderer/components.d.ts index 1f9ccdd..91cd232 100644 --- a/src/renderer/components.d.ts +++ b/src/renderer/components.d.ts @@ -8,6 +8,8 @@ export {} /* prettier-ignore */ declare module 'vue' { export interface GlobalComponents { + NAlert: typeof import('naive-ui')['NAlert'] + NAvatar: typeof import('naive-ui')['NAvatar'] NButton: typeof import('naive-ui')['NButton'] NCard: typeof import('naive-ui')['NCard'] NCheckbox: typeof import('naive-ui')['NCheckbox'] @@ -15,12 +17,16 @@ declare module 'vue' { NColorPicker: typeof import('naive-ui')['NColorPicker'] NDataTable: typeof import('naive-ui')['NDataTable'] NDivider: typeof import('naive-ui')['NDivider'] + NDrawer: typeof import('naive-ui')['NDrawer'] + NDrawerContent: typeof import('naive-ui')['NDrawerContent'] NDropdown: typeof import('naive-ui')['NDropdown'] NDynamicInput: typeof import('naive-ui')['NDynamicInput'] NDynamicTags: typeof import('naive-ui')['NDynamicTags'] NEmpty: typeof import('naive-ui')['NEmpty'] NForm: typeof import('naive-ui')['NForm'] NFormItem: typeof import('naive-ui')['NFormItem'] + NGrid: typeof import('naive-ui')['NGrid'] + NGridItem: typeof import('naive-ui')['NGridItem'] NIcon: typeof import('naive-ui')['NIcon'] NImage: typeof import('naive-ui')['NImage'] NImageGroup: typeof import('naive-ui')['NImageGroup'] @@ -28,10 +34,14 @@ declare module 'vue' { NInputNumber: typeof import('naive-ui')['NInputNumber'] NLayout: typeof import('naive-ui')['NLayout'] NLayoutSider: typeof import('naive-ui')['NLayoutSider'] + NList: typeof import('naive-ui')['NList'] + NListItem: typeof import('naive-ui')['NListItem'] NLog: typeof import('naive-ui')['NLog'] NMenu: typeof import('naive-ui')['NMenu'] + NModal: typeof import('naive-ui')['NModal'] NPopover: typeof import('naive-ui')['NPopover'] NProgress: typeof import('naive-ui')['NProgress'] + NScrollbar: typeof import('naive-ui')['NScrollbar'] NSelect: typeof import('naive-ui')['NSelect'] NSlider: typeof import('naive-ui')['NSlider'] NSpace: typeof import('naive-ui')['NSpace'] @@ -42,6 +52,7 @@ declare module 'vue' { NTabs: typeof import('naive-ui')['NTabs'] NTag: typeof import('naive-ui')['NTag'] NText: typeof import('naive-ui')['NText'] + NThing: typeof import('naive-ui')['NThing'] NTooltip: typeof import('naive-ui')['NTooltip'] NTree: typeof import('naive-ui')['NTree'] NUpload: typeof import('naive-ui')['NUpload'] diff --git a/src/renderer/src/common/homeMenu.ts b/src/renderer/src/common/homeMenu.ts index 0174c6d..a7d761c 100644 --- a/src/renderer/src/common/homeMenu.ts +++ b/src/renderer/src/common/homeMenu.ts @@ -8,6 +8,7 @@ import { SettingsOutline, DuplicateOutline, GridOutline, + VideocamOutline, RadioOutline, BookOutline } from '@vicons/ionicons5' @@ -86,6 +87,13 @@ export const menuDataSource = [ type: 'route', icon: 'grid' }, + { + label: '图/文生视频', + key: 'image_text_video', + routeName: 'image_text_video', + type: 'route', + icon: 'videocam' + }, { label: 'API服务', key: 'lai_api', @@ -163,6 +171,7 @@ const iconMap = { plane: PaperPlaneOutline, duplicate: DuplicateOutline, grid: GridOutline, + videocam: VideocamOutline, api: APIIcon, radio: RadioOutline, settings: SettingsOutline, diff --git a/src/renderer/src/common/time.ts b/src/renderer/src/common/time.ts new file mode 100644 index 0000000..32054c3 --- /dev/null +++ b/src/renderer/src/common/time.ts @@ -0,0 +1,41 @@ +export function FormatDate(date: Date, onlyDay: boolean = false): string { + // 如果传入的是字符串,尝试将其转换为 Date 对象 + if (typeof date === 'string') { + date = new Date(date); + } + if (!(date instanceof Date) || isNaN(date.getTime())) { + return ''; + } + + // 判断时间是不是 0001-01-01T08:00:00 + if (date.getFullYear() === 1) { + return ''; + } + + if (onlyDay) { + return date.getFullYear() + '-' + + pad(date.getMonth() + 1) + '-' + + pad(date.getDate()); + } + return date.getFullYear() + '-' + + pad(date.getMonth() + 1) + '-' + + pad(date.getDate()) + ' ' + + pad(date.getHours()) + ':' + + pad(date.getMinutes()) + ':' + + pad(date.getSeconds()); +} + + +function pad(number: number) { + return (number < 10 ? '0' : '') + number; +} + + +/** + * 延时多少秒,返回一个Promise + * @param time 延时时间,单位毫秒 + * @returns viod + */ +export async function TimeDelay(time: number): Promise { + return new Promise(resolve => setTimeout(resolve, time)); +} diff --git a/src/renderer/src/components/Book/Components/Video/GenerateVideoDialog.vue b/src/renderer/src/components/Book/Components/Video/GenerateVideoDialog.vue index c050afe..2ac73a4 100644 --- a/src/renderer/src/components/Book/Components/Video/GenerateVideoDialog.vue +++ b/src/renderer/src/components/Book/Components/Video/GenerateVideoDialog.vue @@ -80,7 +80,7 @@ async function GetBookTaskDetailOption() { videoMessage.value = res.data } else { // 这边初始化 - let initRes = await window.book.InitVideoMessage(props.bookTaskDetailId) + let initRes = await window.book.video.InitVideoMessage(props.bookTaskDetailId) console.log('InitVideoMessage', initRes) if (initRes.code != 1) { message.error(initRes.message) @@ -96,7 +96,7 @@ async function GetBookTaskDetailOption() { if (ValidateJson(videoMessage.value.lumaOptions)) { lumaOptions.value = JSON.parse(videoMessage.value.lumaOptions) lumaOptions.value.request_model = - lumaOptions.value.request_model == null ? 'fast' : lumaOptions.value.request_model + lumaOptions.value.request_model == null ? 'fast' : lumaOptions.value.request_model lumaOptions.value.image_url = videoMessage.value.imageUrl } if (ValidateJson(videoMessage.value.klingOptions)) { @@ -158,7 +158,7 @@ async function SaveSimpleOptions() { } console.log('saveVideoMessageObject', saveVideoMessageObject) - let res = await window.book.UpdateBookTaskDetailVideoMessage( + let res = await window.book.video.UpdateBookTaskDetailVideoMessage( props.bookTaskDetailId, saveVideoMessageObject ) diff --git a/src/renderer/src/components/Book/MJReverse/MonitorStatus.vue b/src/renderer/src/components/Book/MJReverse/MonitorStatus.vue index f11c003..da0ed23 100644 --- a/src/renderer/src/components/Book/MJReverse/MonitorStatus.vue +++ b/src/renderer/src/components/Book/MJReverse/MonitorStatus.vue @@ -67,7 +67,7 @@ + + diff --git a/src/renderer/src/components/ImageTextVideo/ImageTextVideoInfoHome.vue b/src/renderer/src/components/ImageTextVideo/ImageTextVideoInfoHome.vue new file mode 100644 index 0000000..db44b8b --- /dev/null +++ b/src/renderer/src/components/ImageTextVideo/ImageTextVideoInfoHome.vue @@ -0,0 +1,311 @@ + + + + + diff --git a/src/renderer/src/components/ImageTextVideo/components/ImageTextVideo/ImageTextVideoBookItem.vue b/src/renderer/src/components/ImageTextVideo/components/ImageTextVideo/ImageTextVideoBookItem.vue new file mode 100644 index 0000000..4ead533 --- /dev/null +++ b/src/renderer/src/components/ImageTextVideo/components/ImageTextVideo/ImageTextVideoBookItem.vue @@ -0,0 +1,210 @@ + + + + + diff --git a/src/renderer/src/components/ImageTextVideo/components/ImageTextVideo/ImageTextVideoBookSidebar.vue b/src/renderer/src/components/ImageTextVideo/components/ImageTextVideo/ImageTextVideoBookSidebar.vue new file mode 100644 index 0000000..b20bf86 --- /dev/null +++ b/src/renderer/src/components/ImageTextVideo/components/ImageTextVideo/ImageTextVideoBookSidebar.vue @@ -0,0 +1,103 @@ + + + + + diff --git a/src/renderer/src/components/ImageTextVideo/components/ImageTextVideo/ImageTextVideoEmptyState.vue b/src/renderer/src/components/ImageTextVideo/components/ImageTextVideo/ImageTextVideoEmptyState.vue new file mode 100644 index 0000000..0d98733 --- /dev/null +++ b/src/renderer/src/components/ImageTextVideo/components/ImageTextVideo/ImageTextVideoEmptyState.vue @@ -0,0 +1,30 @@ + + + + + diff --git a/src/renderer/src/components/ImageTextVideo/components/ImageTextVideo/ImageTextVideoMobileHeader.vue b/src/renderer/src/components/ImageTextVideo/components/ImageTextVideo/ImageTextVideoMobileHeader.vue new file mode 100644 index 0000000..260c37f --- /dev/null +++ b/src/renderer/src/components/ImageTextVideo/components/ImageTextVideo/ImageTextVideoMobileHeader.vue @@ -0,0 +1,40 @@ + + + + + diff --git a/src/renderer/src/components/ImageTextVideo/components/ImageTextVideo/ImageTextVideoTaskCard.vue b/src/renderer/src/components/ImageTextVideo/components/ImageTextVideo/ImageTextVideoTaskCard.vue new file mode 100644 index 0000000..1a257fd --- /dev/null +++ b/src/renderer/src/components/ImageTextVideo/components/ImageTextVideo/ImageTextVideoTaskCard.vue @@ -0,0 +1,198 @@ + + + + + diff --git a/src/renderer/src/components/ImageTextVideo/components/ImageTextVideo/ImageTextVideoTaskList.vue b/src/renderer/src/components/ImageTextVideo/components/ImageTextVideo/ImageTextVideoTaskList.vue new file mode 100644 index 0000000..460c85d --- /dev/null +++ b/src/renderer/src/components/ImageTextVideo/components/ImageTextVideo/ImageTextVideoTaskList.vue @@ -0,0 +1,110 @@ + + + + + diff --git a/src/renderer/src/components/ImageTextVideo/components/ImageTextVideoInfo/ImageTextVideoInfoBasicInfo.vue b/src/renderer/src/components/ImageTextVideo/components/ImageTextVideoInfo/ImageTextVideoInfoBasicInfo.vue new file mode 100644 index 0000000..6f95518 --- /dev/null +++ b/src/renderer/src/components/ImageTextVideo/components/ImageTextVideoInfo/ImageTextVideoInfoBasicInfo.vue @@ -0,0 +1,72 @@ + + + + + diff --git a/src/renderer/src/components/ImageTextVideo/components/ImageTextVideoInfo/ImageTextVideoInfoConfig.vue b/src/renderer/src/components/ImageTextVideo/components/ImageTextVideoInfo/ImageTextVideoInfoConfig.vue new file mode 100644 index 0000000..d284a22 --- /dev/null +++ b/src/renderer/src/components/ImageTextVideo/components/ImageTextVideoInfo/ImageTextVideoInfoConfig.vue @@ -0,0 +1,76 @@ + + + + + diff --git a/src/renderer/src/components/ImageTextVideo/components/ImageTextVideoInfo/ImageTextVideoInfoEmptyState.vue b/src/renderer/src/components/ImageTextVideo/components/ImageTextVideoInfo/ImageTextVideoInfoEmptyState.vue new file mode 100644 index 0000000..118c564 --- /dev/null +++ b/src/renderer/src/components/ImageTextVideo/components/ImageTextVideoInfo/ImageTextVideoInfoEmptyState.vue @@ -0,0 +1,25 @@ + + + + + diff --git a/src/renderer/src/components/ImageTextVideo/components/ImageTextVideoInfo/ImageTextVideoInfoProgress.vue b/src/renderer/src/components/ImageTextVideo/components/ImageTextVideoInfo/ImageTextVideoInfoProgress.vue new file mode 100644 index 0000000..e313ab5 --- /dev/null +++ b/src/renderer/src/components/ImageTextVideo/components/ImageTextVideoInfo/ImageTextVideoInfoProgress.vue @@ -0,0 +1,45 @@ + + + + + diff --git a/src/renderer/src/components/ImageTextVideo/components/ImageTextVideoInfo/ImageTextVideoInfoTaskDetail.vue b/src/renderer/src/components/ImageTextVideo/components/ImageTextVideoInfo/ImageTextVideoInfoTaskDetail.vue new file mode 100644 index 0000000..fbecde5 --- /dev/null +++ b/src/renderer/src/components/ImageTextVideo/components/ImageTextVideoInfo/ImageTextVideoInfoTaskDetail.vue @@ -0,0 +1,118 @@ + + + + + diff --git a/src/renderer/src/components/ImageTextVideo/components/ImageTextVideoInfo/ImageTextVideoInfoTaskList.vue b/src/renderer/src/components/ImageTextVideo/components/ImageTextVideoInfo/ImageTextVideoInfoTaskList.vue new file mode 100644 index 0000000..15a52fa --- /dev/null +++ b/src/renderer/src/components/ImageTextVideo/components/ImageTextVideoInfo/ImageTextVideoInfoTaskList.vue @@ -0,0 +1,535 @@ + + + + + diff --git a/src/renderer/src/components/ImageTextVideo/components/ImageTextVideoInfo/ImageTextVideoInfoVideoConfig.vue b/src/renderer/src/components/ImageTextVideo/components/ImageTextVideoInfo/ImageTextVideoInfoVideoConfig.vue new file mode 100644 index 0000000..d46cf94 --- /dev/null +++ b/src/renderer/src/components/ImageTextVideo/components/ImageTextVideoInfo/ImageTextVideoInfoVideoConfig.vue @@ -0,0 +1,138 @@ + + + + + diff --git a/src/renderer/src/components/ImageTextVideo/components/ImageTextVideoInfo/ImageTextVideoInfoVideoListInfo.vue b/src/renderer/src/components/ImageTextVideo/components/ImageTextVideoInfo/ImageTextVideoInfoVideoListInfo.vue new file mode 100644 index 0000000..83d62d9 --- /dev/null +++ b/src/renderer/src/components/ImageTextVideo/components/ImageTextVideoInfo/ImageTextVideoInfoVideoListInfo.vue @@ -0,0 +1,731 @@ + + + + + diff --git a/src/renderer/src/components/Setting/MJSetting/MJSettingHome.vue b/src/renderer/src/components/Setting/MJSetting/MJSettingHome.vue index de414db..436155c 100644 --- a/src/renderer/src/components/Setting/MJSetting/MJSettingHome.vue +++ b/src/renderer/src/components/Setting/MJSetting/MJSettingHome.vue @@ -25,7 +25,7 @@ import MJImagePackage from './MJImagePackage.vue' import { MJImageType } from '@/define/enum/mjEnum' import { isEmpty } from 'lodash' import { GetMJUrlOptions } from '@/define/api/apiUrlDefine' -import { GetImageProxyUrlOptions, ImagePackageProxyOptions } from '@/define/data/settingData' +import { GetImageProxyUrlOptions } from '@/define/data/settingData' let softwareStore = useSoftwareStore() let optionStore = useOptionStore() diff --git a/src/renderer/src/main.js b/src/renderer/src/main.js index 4bb9f41..9771e5f 100644 --- a/src/renderer/src/main.js +++ b/src/renderer/src/main.js @@ -103,6 +103,16 @@ const routes = [ name: 'manage_book', component: () => import('./components/Book/ManageBookDetail.vue') }, + { + path: '/image_text_video', + name: 'image_text_video', + component: () => import('./components/ImageTextVideo/ImageTextVideoHome.vue') + }, + { + path: '/image_text_video_info/:id', + name: 'image_text_video_info', + component: () => import('./components/ImageTextVideo/ImageTextVideoInfoHome.vue') + }, { path: '/test_options', name: 'test_options', diff --git a/src/stores/reverseManage.ts b/src/stores/reverseManage.ts index 7c1dfa0..74de29b 100644 --- a/src/stores/reverseManage.ts +++ b/src/stores/reverseManage.ts @@ -266,7 +266,8 @@ export const useReverseManageStore = defineStore('reverseManage', { ...item, outImagePath: item.outImagePath ? item.outImagePath + '?t=' + new Date().getTime() : undefined, subImagePath: item.subImagePath ? item.subImagePath.map(item => item + '?t=' + new Date().getTime()) : [], - oldImage: item.oldImage ? item.oldImage + '?t=' + new Date().getTime() : undefined + oldImage: item.oldImage ? item.oldImage + '?t=' + new Date().getTime() : undefined, + generateVideoPath: item.generateVideoPath ? item.generateVideoPath + '?t=' + new Date().getTime() : undefined, } }) // 这边开始修改数据,