diff --git a/package-lock.json b/package-lock.json index d8f86a8..7a3a0ed 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "laitool", - "version": "3.2.0", + "version": "3.2.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "laitool", - "version": "3.2.0", + "version": "3.2.1", "hasInstallScript": true, "dependencies": { "@alicloud/alimt20181012": "^1.2.0", @@ -30,7 +30,7 @@ "lodash": "^4.17.21", "moment-timezone": "^0.5.45", "music-metadata": "^7.14.0", - "node-edge-tts": "^1.2.3", + "node-edge-tts": "^1.2.4", "node-machine-id": "^1.1.12", "npm": "^10.7.0", "pinia": "^2.1.7", @@ -6274,9 +6274,10 @@ } }, "node_modules/node-edge-tts": { - "version": "1.2.3", - "resolved": "https://registry.npmmirror.com/node-edge-tts/-/node-edge-tts-1.2.3.tgz", - "integrity": "sha512-ug2osAv7qihpbcuuhWWrnDbqDZ0q7AcIHtRumQ/PJaXV6QR2sI/1bBlUWLNk0tTF6Y6CWCYuBoHYYBQztRterg==", + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/node-edge-tts/-/node-edge-tts-1.2.4.tgz", + "integrity": "sha512-6IvNVJz+pFmgMuGGAew0MlhfexgakXGH11pXZtqfMR/l+afhK0XxxUIEOf3MEJQ8vhR3jeXEECOSW9w4LjX7Fw==", + "license": "MIT", "dependencies": { "https-proxy-agent": "^7.0.1", "ws": "^8.13.0", diff --git a/package.json b/package.json index fb0cd97..fa8282a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "laitool", - "version": "3.2.0", + "version": "3.2.1", "description": "An AI tool for image processing, video processing, and other functions.", "main": "./out/main/index.js", "author": "laitool.cn", @@ -38,7 +38,7 @@ "lodash": "^4.17.21", "moment-timezone": "^0.5.45", "music-metadata": "^7.14.0", - "node-edge-tts": "^1.2.3", + "node-edge-tts": "^1.2.4", "node-machine-id": "^1.1.12", "npm": "^10.7.0", "pinia": "^2.1.7", diff --git a/resources/image/zhanwei.png b/resources/image/zhanwei.png index 3aec420..a468910 100644 Binary files a/resources/image/zhanwei.png and b/resources/image/zhanwei.png differ diff --git a/resources/scripts/db/book.realm.lock b/resources/scripts/db/book.realm.lock index a7ba841..6b4ad75 100644 Binary files a/resources/scripts/db/book.realm.lock and b/resources/scripts/db/book.realm.lock differ diff --git a/resources/scripts/db/software.realm.lock b/resources/scripts/db/software.realm.lock index c2db7c0..de450aa 100644 Binary files a/resources/scripts/db/software.realm.lock and b/resources/scripts/db/software.realm.lock differ diff --git a/src/define/Tools/file.ts b/src/define/Tools/file.ts index 22a40b4..2ef5617 100644 --- a/src/define/Tools/file.ts +++ b/src/define/Tools/file.ts @@ -11,9 +11,9 @@ const fspromises = fs.promises * @param {*} path 文件或目录的路径 * @returns true表示存在,false表示不存在 */ -export async function CheckFileOrDirExist(path) { +export async function CheckFileOrDirExist(filePath) { try { - await fspromises.access(path) + await fspromises.access(filePath) return true // 文件或目录存在 } catch (error) { return false // 文件或目录不存在 diff --git a/src/define/db/model/Book/bookTask.ts b/src/define/db/model/Book/bookTask.ts index f54a7b6..bc9a512 100644 --- a/src/define/db/model/Book/bookTask.ts +++ b/src/define/db/model/Book/bookTask.ts @@ -49,7 +49,8 @@ export class BookTaskModel extends Realm.Object { backgroundMusic: string | null // 背景音乐ID friendlyReminder: string | null // 友情提示 imageFolder: string | null - imageStyle: string[] | null // 软件内置的样式 + imageStyle: string | null // 软件内置的样式 + cacheImageList: string[] | null // 缓存的图片列表 autoAnalyzeCharacter: string | null // 自动分析角色设置 customizeImageStyle: string[] | null // 自定义的样式 videoConfig: string | null // 合成视频设置 @@ -80,6 +81,7 @@ export class BookTaskModel extends Realm.Object { friendlyReminder: 'string?', imageFolder: 'string?', subImageFolder: "string?[]", + cacheImageList: 'string?[]', imageStyle: 'string?[]', autoAnalyzeCharacter: 'string?', customizeImageStyle: 'string?[]', diff --git a/src/define/db/service/Book/bookBackTaskListService.ts b/src/define/db/service/Book/bookBackTaskListService.ts index 8de62f6..f248a70 100644 --- a/src/define/db/service/Book/bookBackTaskListService.ts +++ b/src/define/db/service/Book/bookBackTaskListService.ts @@ -9,7 +9,7 @@ import { BaseRealmService } from './bookBasic' import { isEmpty } from 'lodash' import { OtherData } from '../../../enum/softwareEnum.js' import { BookBackTaskList } from '../../model/Book/BookBackTaskListModel.js' -import { Book } from '../../../../model/book.js' +import { Book } from '../../../../model/book/book.js' import { GeneralResponse } from '../../../../model/generalResponse.js' const { v4: uuidv4 } = require('uuid') diff --git a/src/define/db/service/Book/bookBasic.ts b/src/define/db/service/Book/bookBasic.ts index 5d8f273..31507f1 100644 --- a/src/define/db/service/Book/bookBasic.ts +++ b/src/define/db/service/Book/bookBasic.ts @@ -197,6 +197,13 @@ const migration = (oldRealm: Realm, newRealm: Realm) => { newBookTask[i].draftDepend = '' } } + if (oldRealm.schemaVersion < 29) { + const oldBookTask = oldRealm.objects('BookTask') + const newBookTask = newRealm.objects('BookTask') + for (let i = 0; i < oldBookTask.length; i++) { + newBookTask[i].cacheImageList = undefined + } + } } export class BaseRealmService extends BaseService { @@ -238,7 +245,7 @@ export class BaseRealmService extends BaseService { BookTaskDetailModel ], path: this.dbpath, - schemaVersion: 27, + schemaVersion: 29, migration: migration } this.realm = await Realm.open(config) diff --git a/src/define/db/service/Book/bookService.ts b/src/define/db/service/Book/bookService.ts index 3b72ca4..32e756f 100644 --- a/src/define/db/service/Book/bookService.ts +++ b/src/define/db/service/Book/bookService.ts @@ -10,7 +10,7 @@ import { BaseRealmService } from './bookBasic.js' import { isEmpty } from 'lodash' import { FfmpegOptions } from '../../../../main/Service/ffmpegOptions.js' import { version } from '../../../../../package.json' -import { Book } from '../../../../model/book.js' +import { Book } from '../../../../model/book/book.js' import { GeneralResponse } from '../../../../model/generalResponse.js' export class BookService extends BaseRealmService { @@ -205,7 +205,7 @@ export class BookService extends BaseRealmService { } else if (book.type == BookType.MJ_REVERSE) { imageCategory = BookImageCategory.MJ } else if (book.type == BookType.ORIGINAL) { - imageCategory = global.config.defaultImageMode + imageCategory = global.config.defaultImageMode ?? BookImageCategory.MJ } else { throw new Error('未知的小说类型') } diff --git a/src/define/db/service/Book/bookTaskDetailService.ts b/src/define/db/service/Book/bookTaskDetailService.ts index 32d4b1a..86a81ec 100644 --- a/src/define/db/service/Book/bookTaskDetailService.ts +++ b/src/define/db/service/Book/bookTaskDetailService.ts @@ -8,7 +8,7 @@ import { cloneDeep, isEmpty } from 'lodash' import { JoinPath } from '../../../Tools/file' import { BookTaskDetailModel, ReversePrompt } from '../../model/Book/bookTaskDetail.js' const { v4: uuidv4 } = require('uuid') -import { Book } from "../../../../model/book" +import { Book } from "../../../../model/book/book" import { GeneralResponse } from '../../../../model/generalResponse.js' let dbPath = path.resolve(define.db_path, 'book.realm') diff --git a/src/define/db/service/Book/bookTaskService.ts b/src/define/db/service/Book/bookTaskService.ts index 662f136..8021373 100644 --- a/src/define/db/service/Book/bookTaskService.ts +++ b/src/define/db/service/Book/bookTaskService.ts @@ -8,7 +8,7 @@ import { BaseRealmService } from './bookBasic' import { JoinPath } from '../../../Tools/file' import { BookBackTaskList } from '../../model/Book/BookBackTaskListModel.js' const { v4: uuidv4 } = require('uuid') -import { Book } from '../../../../model/book' +import { Book } from '../../../../model/book/book' import { TagDefine } from '../../../tagDefine.js' import { ImageStyleDefine } from "../../../../define/iamgeStyleDefine" import { cloneDeep } from 'lodash' @@ -89,6 +89,7 @@ export class BookTaskService extends BaseRealmService { srtPath: JoinPath(define.project_path, bookTask.srtPath), audioPath: JoinPath(define.project_path, bookTask.audioPath), 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出图 } as Book.SelectBookTask; }) diff --git a/src/define/define.js b/src/define/define.js index 0c4171e..68b2a63 100644 --- a/src/define/define.js +++ b/src/define/define.js @@ -150,7 +150,9 @@ define['hkServerUrl'] = 'https://laitool.net/' define['bakServerUrl'] = 'https://laitool.net/' define['API'] = 'f85d39ed5a40fd09966f13f12b6cf0f0' -define['lms'] = - process.env.NODE_ENV == 'development' ? 'https://localhost:44362' : 'https://lms.laitool.cn' +// define['lms'] = +// process.env.NODE_ENV == 'development' ? 'https://localhost:44362' : 'https://lms.laitool.cn' + +define['lms'] = 'https://lms.laitool.cn' export { define } diff --git a/src/define/define_string/bookDefineString.ts b/src/define/define_string/bookDefineString.ts index 28d833d..ad71884 100644 --- a/src/define/define_string/bookDefineString.ts +++ b/src/define/define_string/bookDefineString.ts @@ -107,6 +107,18 @@ const BOOK = { /** 添加一键生图后台任务 */ GENERATE_ALL_TASK_IMAGE: "GENERATE_ALL_TASK_IMAGE", + /** 上传图片到小说中,并修改小说信息 */ + UPLOAD_IMAGE_TO_BOOK_AND_UPDATE_MESSAGE: "UPLOAD_IMAGE_TO_BOOK_AND_UPDATE_MESSAGE", + + /** 上传图片到缓存 */ + UPLOAD_IMAGE_TO_CACHE: "UPLOAD_IMAGE_TO_CACHE", + + /** 获取当前小说中的所有的批次中的缓存图片 */ + GET_ALL_BOOK_TASK_IMAGE_CACHE: "GET_ALL_BOOK_TASK_IMAGE_CACHE", + + /** 保存缓存区的屠图片到小说主图或者是选图区 */ + SAVE_CACHE_IMAGE_TO_DATA: "SAVE_CACHE_IMAGE_TO_DATA", + //#endregion COMPUTE_STORYBOARD: 'COMPUTE_STORYBOARD', diff --git a/src/define/define_string/systemDefineString.ts b/src/define/define_string/systemDefineString.ts index dfbc22a..d2d5c9c 100644 --- a/src/define/define_string/systemDefineString.ts +++ b/src/define/define_string/systemDefineString.ts @@ -10,5 +10,11 @@ export const SYSTEM = { /** 检查机器码状态 */ CHECK_MACHINE_STATUS: "CHECK_MACHINE_STATUS", /** 获取软件版本信息,更新信息,首页内容,公告等 */ - GET_REMOTE_SYSTEM_INFORMATION: 'GET_REMOTE_SYSTEM_INFORMATION' + GET_REMOTE_SYSTEM_INFORMATION: 'GET_REMOTE_SYSTEM_INFORMATION', + + /** 选择单个指定文件后缀的文件 */ + SELECT_SINGLE_FILE: "SELECT_SINGLE_FILE", + + /** 选择多个指定文件后缀的文件 */ + SELECT_MULTIPLE_FILE: "SELECT_MULTIPLE_FILE", } \ No newline at end of file diff --git a/src/define/enum/bookEnum.ts b/src/define/enum/bookEnum.ts index 9725a28..1a30586 100644 --- a/src/define/enum/bookEnum.ts +++ b/src/define/enum/bookEnum.ts @@ -1,3 +1,5 @@ +import { TaskModal } from "@/model/task"; + export enum BookType { // 原创 ORIGINAL = 'original', @@ -333,70 +335,194 @@ export function GetBookBackTaskTypeLabel(key: string) { * @param key * @returns */ -export function GetBookTaskDetailStatusLabel(key: string) { +export function GetBookTaskDetailStatusLabel(key: string): TaskModal.TaskStatus { switch (key) { case BookTaskStatus.WAIT: - return '等待'; + return { + status: BookTaskStatus.WAIT, + label: '等待', + type: 'warning' + }; case BookTaskStatus.STORYBOARD: - return '分镜计算中'; + return { + status: BookTaskStatus.STORYBOARD, + label: '分镜计算中', + type: 'info' + }; case BookTaskStatus.STORYBOARD_FAIL: - return '分镜计算失败'; + return { + status: BookTaskStatus.STORYBOARD_FAIL, + label: '分镜计算失败', + type: 'error' + }; case BookTaskStatus.STORYBOARD_DONE: - return '分镜计算完成'; + return { + status: BookTaskStatus.STORYBOARD_DONE, + label: '分镜计算完成', + type: 'success' + }; case BookTaskStatus.SPLIT: - return '分割视频中'; + return { + status: BookTaskStatus.SPLIT, + label: '分割视频中', + type: 'info' + }; case BookTaskStatus.SPLIT_FAIL: - return '分割视频失败'; + return { + status: BookTaskStatus.SPLIT_FAIL, + label: '分割视频失败', + type: 'error' + }; case BookTaskStatus.SPLIT_DONE: - return '分割视频完成'; + return { + status: BookTaskStatus.SPLIT_DONE, + label: '分割视频完成', + type: 'success' + }; case BookTaskStatus.AUDIO: - return '提取音频中'; + return { + status: BookTaskStatus.AUDIO, + label: '提取音频中', + type: 'info' + }; case BookTaskStatus.AUDIO_FAIL: - return '提取音频失败'; + return { + status: BookTaskStatus.AUDIO_FAIL, + label: '提取音频失败', + type: 'error' + }; case BookTaskStatus.AUDIO_DONE: - return '提取音频完成'; + return { + status: BookTaskStatus.AUDIO_DONE, + label: '提取音频完成', + type: 'success' + }; case BookTaskStatus.RECOGNIZE: - return '识别字幕中'; + return { + status: BookTaskStatus.RECOGNIZE, + label: '识别字幕中', + type: 'info' + }; case BookTaskStatus.RECOGNIZE_FAIL: - return '识别字幕失败'; + return { + status: BookTaskStatus.RECOGNIZE_FAIL, + label: '识别字幕失败', + type: 'error' + }; case BookTaskStatus.RECOGNIZE_DONE: - return '识别字幕完成'; + return { + status: BookTaskStatus.RECOGNIZE_DONE, + label: '识别字幕完成', + type: 'success' + }; case BookTaskStatus.FRAME: - return '抽帧中'; + return { + status: BookTaskStatus.FRAME, + label: '抽帧中', + type: 'info' + }; case BookTaskStatus.FRAME_FAIL: - return '抽帧失败'; + return { + status: BookTaskStatus.FRAME_FAIL, + label: '抽帧失败', + type: 'error' + }; case BookTaskStatus.FRAME_DONE: - return '抽帧完成'; + return { + status: BookTaskStatus.FRAME_DONE, + label: '抽帧完成', + type: 'success' + }; case BookTaskStatus.REVERSE: - return '反推中'; + return { + status: BookTaskStatus.REVERSE, + label: '反推中', + type: 'info' + }; case BookTaskStatus.REVERSE_FAIL: - return '反推失败'; + return { + status: BookTaskStatus.REVERSE_FAIL, + label: '反推失败', + type: 'error' + }; case BookTaskStatus.REVERSE_DONE: - return '反推完成'; + return { + status: BookTaskStatus.REVERSE_DONE, + label: '反推完成', + type: 'success' + }; case BookTaskStatus.IMAGE: - return '生成图片中'; + return { + status: BookTaskStatus.IMAGE, + label: '生成图片中', + type: 'info' + }; case BookTaskStatus.IMAGE_FAIL: - return '生成图片失败'; + return { + status: BookTaskStatus.IMAGE_FAIL, + label: '生成图片失败', + type: 'error' + }; case BookTaskStatus.IMAGE_DONE: - return '生成图片完成'; + return { + status: BookTaskStatus.IMAGE_DONE, + label: '生成图片完成', + type: 'success' + }; case BookTaskStatus.HD: - return '高清中'; + return { + status: BookTaskStatus.HD, + label: '高清中', + type: 'info' + }; case BookTaskStatus.HD_FAIL: - return '高清失败'; + return { + status: BookTaskStatus.HD_FAIL, + label: '高清失败', + type: 'error' + }; case BookTaskStatus.HD_DONE: - return '高清完成'; + return { + status: BookTaskStatus.HD_DONE, + label: '高清完成', + type: 'success' + }; case BookTaskStatus.COMPOSING: - return '合成视频中'; + return { + status: BookTaskStatus.COMPOSING, + label: '合成视频中', + type: 'info' + }; case BookTaskStatus.COMPOSING_FAIL: - return '合成视频失败'; + return { + status: BookTaskStatus.COMPOSING_FAIL, + label: '合成视频失败', + type: 'error' + }; case BookTaskStatus.COMPOSING_DONE: - return '合成视频完成'; + return { + status: BookTaskStatus.COMPOSING_DONE, + label: '合成视频完成', + type: 'success' + }; case BookTaskStatus.DRAFT_DONE: - return '添加草稿完成'; + return { + status: BookTaskStatus.DRAFT_DONE, + label: '添加草稿完成', + type: 'success' + }; case BookTaskStatus.DRAFT_FAIL: - return '添加草稿失败'; + return { + status: BookTaskStatus.DRAFT_FAIL, + label: '添加草稿失败', + type: 'error' + }; default: - return key; + return { + status: "UNKNOWN", + label: "UNKNOWN", + type: 'warning' + }; } } @@ -405,21 +531,50 @@ export function GetBookTaskDetailStatusLabel(key: string) { * @param key * @returns */ -export function GetBookBackTaskStatusLabel(key: string) { +export function GetBookBackTaskStatusLabel(key: string): TaskModal.TaskStatus { + switch (key) { case BookBackTaskStatus.WAIT: - return '等待'; + return { + status: BookBackTaskStatus.WAIT, + label: '等待', + type: 'warning' + }; case BookBackTaskStatus.RUNNING: - return '运行中'; + return { + status: BookBackTaskStatus.RUNNING, + label: '运行中', + type: 'info' + }; case BookBackTaskStatus.PAUSE: - return '暂停'; + return { + status: BookBackTaskStatus.PAUSE, + label: '暂停', + type: 'warning' + }; case BookBackTaskStatus.DONE: - return '完成'; + return { + status: BookBackTaskStatus.DONE, + label: '完成', + type: 'success' + }; case BookBackTaskStatus.FAIL: - return '失败'; + return { + status: BookBackTaskStatus.FAIL, + label: '失败', + type: 'error' + }; case BookBackTaskStatus.RECONNECT: - return '重连'; + return { + status: BookBackTaskStatus.RECONNECT, + label: '重连', + type: 'warning' + }; default: - return key; + return { + status: "UNKNOWN", + label: "UNKNOWN", + type: 'warning' + }; } } diff --git a/src/main/IPCEvent/bookIpc.ts b/src/main/IPCEvent/bookIpc.ts index 8cc9ddb..fa07c15 100644 --- a/src/main/IPCEvent/bookIpc.ts +++ b/src/main/IPCEvent/bookIpc.ts @@ -280,6 +280,23 @@ export function BookIpc() { async (event, ids: string[], operateBookType: OperateBookType) => await bookImage.GenerateAllTaskImage(ids, operateBookType) ) + /**上传图片到小说中,并修改小说信息 */ + ipcMain.handle( + DEFINE_STRING.BOOK.UPLOAD_IMAGE_TO_BOOK_AND_UPDATE_MESSAGE, + async (event, bookTaskDetailId: string, imageFile: string | string[], option: string) => await bookImage.UpLoadImageToBookAndUpdateMessage(bookTaskDetailId, imageFile, option) + ) + + /** 上传图片到缓存 */ + ipcMain.handle(DEFINE_STRING.BOOK.UPLOAD_IMAGE_TO_CACHE, + async (event, bookTaskId: string, imageFile: string | string[]) => await bookImage.UpLoadImageToCache(bookTaskId, imageFile) + ) + + /** 获取当前小说中的所有的批次中的缓存图片 */ + ipcMain.handle(DEFINE_STRING.BOOK.GET_ALL_BOOK_TASK_IMAGE_CACHE, async (event, bookTaskId: string) => await bookImage.GetAllBookTaskImageCache(bookTaskId)) + + /** 保存缓存区的屠图片到小说主图或者是选图区 */ + ipcMain.handle(DEFINE_STRING.BOOK.SAVE_CACHE_IMAGE_TO_DATA, async (event, bookTaskDetailId: string, imageFile: string | string[], option: string) => await bookImage.SaveCacheImageToData(bookTaskDetailId, imageFile, option)) + //#endregion diff --git a/src/main/IPCEvent/dbIpc.ts b/src/main/IPCEvent/dbIpc.ts index a93099c..f506fb0 100644 --- a/src/main/IPCEvent/dbIpc.ts +++ b/src/main/IPCEvent/dbIpc.ts @@ -1,7 +1,7 @@ import { ipcMain } from 'electron' import { DEFINE_STRING } from '../../define/define_string' import { errorMessage, successMessage } from '../Public/generalTools' -import { Book } from '../../model/book' +import { Book } from '../../model/book/book' import { BookTaskService } from '../../define/db/service/Book/bookTaskService' import { BookTaskDetailService } from '../../define/db/service/Book/bookTaskDetailService' import { BookService } from '../../define/db/service/Book/bookService' diff --git a/src/main/IPCEvent/systemIpc.ts b/src/main/IPCEvent/systemIpc.ts index a958fe6..4af500a 100644 --- a/src/main/IPCEvent/systemIpc.ts +++ b/src/main/IPCEvent/systemIpc.ts @@ -28,5 +28,11 @@ function SystemIpc() { ipcMain.handle(DEFINE_STRING.SYSTEM.CHECK_MACHINE_STATUS, async (event, value: string) => await systemInfo.CheckMachineStatus(value)) /** 获取软件版本信息,更新信息,首页内容,公告等 */ ipcMain.handle(DEFINE_STRING.SYSTEM.GET_REMOTE_SYSTEM_INFORMATION, async (event) => await systemInfo.GetRemoteSystemInformation()) + + /** 选择单个指定文件后缀的文件 */ + ipcMain.handle(DEFINE_STRING.SYSTEM.SELECT_SINGLE_FILE, async (event, value: string[]) => await electronInterface.SelectSingleFile(value)) + + /** 选择多个指定文件后缀的文件 */ + ipcMain.handle(DEFINE_STRING.SYSTEM.SELECT_MULTIPLE_FILE, async (event, value: string[]) => await electronInterface.SelectMultipleFile(value)) } export { SystemIpc } diff --git a/src/main/Service/Book/BooKBasic.ts b/src/main/Service/Book/BooKBasic.ts index 89643bd..66b4f44 100644 --- a/src/main/Service/Book/BooKBasic.ts +++ b/src/main/Service/Book/BooKBasic.ts @@ -7,7 +7,7 @@ import { GeneralResponse } from '../../../model/generalResponse' import { BookServiceBasic } from '../ServiceBasic/bookServiceBasic' import { BookTask } from './bookTask' import fs from 'fs' -import { Book } from '../../../model/book' +import { Book } from '../../../model/book/book' export class BookBasic { bookServiceBasic: BookServiceBasic diff --git a/src/main/Service/Book/ReverseBook.ts b/src/main/Service/Book/ReverseBook.ts index 2571aec..845091c 100644 --- a/src/main/Service/Book/ReverseBook.ts +++ b/src/main/Service/Book/ReverseBook.ts @@ -9,7 +9,7 @@ import path from 'path' import { BasicReverse } from './basicReverse' import { BookTaskDetailService } from '../../../define/db/service/Book/bookTaskDetailService' import { LogScheduler } from "../task/logScheduler" -import { Book } from '../../../model/book' +import { Book } from '../../../model/book/book' import { LoggerStatus, OtherData, ResponseMessageType } from '../../../define/enum/softwareEnum' import { GeneralResponse } from '../../../model/generalResponse' import { Subtitle } from '../Subtitle/subtitle' diff --git a/src/main/Service/Book/basicReverse.ts b/src/main/Service/Book/basicReverse.ts index 51354f7..d584a23 100644 --- a/src/main/Service/Book/basicReverse.ts +++ b/src/main/Service/Book/basicReverse.ts @@ -21,7 +21,7 @@ import { BookType, TaskExecuteType } from '../../../define/enum/bookEnum' -import { Book } from '../../../model/book' +import { Book } from '../../../model/book/book' import { GeneralResponse } from '../../../model/generalResponse' const fspromises = fs.promises diff --git a/src/main/Service/Book/bookFrame.ts b/src/main/Service/Book/bookFrame.ts index b683669..1533b1c 100644 --- a/src/main/Service/Book/bookFrame.ts +++ b/src/main/Service/Book/bookFrame.ts @@ -6,7 +6,7 @@ import path from 'path'; import { FfmpegOptions } from "../ffmpegOptions"; import { CheckFileOrDirExist, CopyFileOrFolder, DeleteFolderAllFile } from "../../../define/Tools/file"; import fs from 'fs'; -import { Book } from "../../../model/book"; +import { Book } from "../../../model/book/book"; import { LogScheduler } from '../task/logScheduler'; import { BookBasic } from "./BooKBasic"; import { LoggerStatus, OtherData } from "../../../define/enum/softwareEnum"; diff --git a/src/main/Service/Book/bookGeneral.ts b/src/main/Service/Book/bookGeneral.ts index ce3e0ed..ad8b635 100644 --- a/src/main/Service/Book/bookGeneral.ts +++ b/src/main/Service/Book/bookGeneral.ts @@ -1,6 +1,6 @@ import { isEmpty } from "lodash"; import { BookRepalceDataType } from "../../../define/enum/bookEnum"; -import { Book } from "../../../model/book"; +import { Book } from "../../../model/book/book"; import { GeneralResponse } from "../../../model/generalResponse"; import { errorMessage, successMessage } from "../../Public/generalTools"; import { BookServiceBasic } from "../ServiceBasic/bookServiceBasic"; diff --git a/src/main/Service/Book/bookImage.ts b/src/main/Service/Book/bookImage.ts index e9b87b6..10ac105 100644 --- a/src/main/Service/Book/bookImage.ts +++ b/src/main/Service/Book/bookImage.ts @@ -1,7 +1,7 @@ import { BookBackTaskType, BookImageCategory, BookType, MJAction, OperateBookType, TaskExecuteType } from "../../../define/enum/bookEnum"; import { GeneralResponse } from "../../../model/generalResponse"; import { errorMessage, successMessage } from "../../Public/generalTools"; -import { Book } from "../../../model/book"; +import { Book } from "../../../model/book/book"; import path from 'path' import { Tools } from "../../../main/tools" import { ImageSplit } from "../../../define/Tools/image"; @@ -263,7 +263,7 @@ export class BookImage { //#endregion - + //#region 将指定的批次任务,添加里面的所有的分镜到出图任务中 /** * 将指定的批次任务,添加里面的所有的分镜到出图任务中 * @param ids 批次任务ID @@ -344,6 +344,9 @@ export class BookImage { } } + //#endregion + + //#region 生成所有的图片,这个方法主要是分流,根据批次生成的方式,添加对应的数据 /** * 生成所有的图片,这个方法主要是分流,根据批次生成的方式,添加对应的数据 * @param bookTaskId @@ -369,6 +372,8 @@ export class BookImage { } } + //#endregion + //#region 对图片进行锁定或者是解锁操作 /** * 对图片进行锁定或者是解锁操作 @@ -583,4 +588,208 @@ export class BookImage { } } //#endregion + + //#region 上传图片到小说中,并修改小说信息 + + /** + * 上传并修改一个 + * @param bookTaskDetailId + * @param imageFile + * @param option + */ + private async UploadOne(bookTaskDetailId: string, imageFile: string, option: string): Promise { + console.log('开始上传图片', bookTaskDetailId, imageFile, option) + if (!await CheckFileOrDirExist(path.resolve(imageFile))) { + throw new Error(`图片文件 ${imageFile} 不存在,请检查`) + } + // 修改数据库数据 + let bookTaskDetail = await this.bookServiceBasic.GetBookTaskDetailDataById(bookTaskDetailId); + // 将图片复制到对应的文件夹中 + // 生成一个0-10的随机数 + let random = Math.floor(Math.random() * 10); + let newImagePath = path.join(define.project_path, `${bookTaskDetail.bookId}/data/Upload/${bookTaskDetail.name}_${Date.now()}_${random}.png`); + await CheckFolderExistsOrCreate(path.dirname(newImagePath)); + await CopyFileOrFolder(imageFile, newImagePath); + if (option == "outImagePath") { + let outImagePath = bookTaskDetail.outImagePath; + let bookTask = await this.bookServiceBasic.GetBookTaskDataById(bookTaskDetail.bookTaskId); + if (isEmpty(bookTaskDetail.outImagePath)) { + outImagePath = path.join(define.project_path, `${bookTaskDetail.bookId}/tmp/${bookTask.name}/${bookTaskDetail.name}.png`); + } + await CheckFolderExistsOrCreate(path.dirname(outImagePath)); + await CopyFileOrFolder(newImagePath, outImagePath); + await this.bookServiceBasic.UpdateBookTaskDetail(bookTaskDetailId, { + outImagePath: path.relative(define.project_path, outImagePath) + }) + await this.bookServiceBasic.UpdateBookTaskDetailMjMessage(bookTaskDetailId, { + progress: 100, + status: 'success', + category: MJImageType.IMPORT, + messageId: '', + action: MJAction.IMAGINE, + }) + return outImagePath + '?t=' + new Date().getTime() + } else if (option == "subImagePath") { + // 修改数据库数据 + let subImagePath = bookTaskDetail.subImagePath ?? []; + subImagePath.push(newImagePath); + await this.bookServiceBasic.UpdateBookTaskDetail(bookTaskDetailId, { + subImagePath: subImagePath.map((item) => path.relative(define.project_path, item)) + }) + return newImagePath + '?t=' + new Date().getTime() + } else { + throw new Error("无效的操作类型,请检查") + } + } + + /** + * 上传图片到小说中,并修改小说信息 + * @param bookTaskDetailId 小说分镜ID + * @param imageFile 图片文件地址 + * @param option 操作类型 "outImagePath" | "subImagePath" + */ + public async UpLoadImageToBookAndUpdateMessage(bookTaskDetailId: string, imageFile: string | string[], option: string): Promise { + try { + if (option == "outImagePath") { + let res = await this.UploadOne(bookTaskDetailId, imageFile as string, option) + return successMessage(res, '上传图片,并修改小说信息成功', 'BookImage_UpLoadImageToBookAndUpdateMessage') + } else if (option == "subImagePath") { + let subImage = [] as string[] + for (let i = 0; i < (imageFile as string[]).length; i++) { + let res = await this.UploadOne(bookTaskDetailId, imageFile[i], option); + subImage.push(res); + } + return successMessage(subImage as string[], '上传图片,并修改小说信息成功', 'BookImage_UpLoadImageToBookAndUpdateMessage') + } else { + throw new Error("无效的操作类型,请检查") + } + } catch (error) { + return errorMessage('上传图片到小说中,并修改小说信息失败,错误信息如下:' + error.message, 'BookImage_UpLoadImageToBookAndUpdateMessage') + } + } + //#endregion + + //#region 上传图片到缓存区 + + /** + * 上传单个图片到缓存区 + * @param bookTaskId 小说任务ID + * @param imageFile 图片文件地址 + */ + async UpLoadOneImageToCache(bookTaskId: string, imageFile: string): Promise { + let bookTask = await this.bookServiceBasic.GetBookTaskDataById(bookTaskId); + let cacheImagePath = path.join(define.project_path, `${bookTask.bookId}/data/Cache/${Date.now()}_${Math.floor(Math.random() * 10)}.png`); + imageFile = imageFile.split("?t=")[0]; + imageFile = imageFile.split("?time=")[0]; + if (imageFile.startsWith("file:/")) { + imageFile = imageFile.replace("file:///", ""); + imageFile = imageFile.replace("file://", ""); + imageFile = imageFile.replace("file:/", ""); + } + if (!await CheckFileOrDirExist(imageFile)) { + throw new Error(`图片文件 ${imageFile} 不存在,请检查`) + } + await CheckFolderExistsOrCreate(path.dirname(cacheImagePath)); + await CopyFileOrFolder(imageFile, cacheImagePath); + // 修改缓存区数据 + let cacheImageList = bookTask.cacheImageList ?? []; + cacheImageList.push(cacheImagePath); + await this.bookServiceBasic.UpdetedBookTaskData(bookTaskId, { + cacheImageList: cacheImageList.map((item) => path.relative(define.project_path, item)) + }) + } + + /** + * 上传图片到缓存区 + * @param bookTaskId + * @param imageFile + */ + public async UpLoadImageToCache(bookTaskId: string, imageFile: string | string[]) { + try { + // 判断是不是一个数组 + if (imageFile instanceof Array) { + for (let i = 0; i < imageFile.length; i++) { + let image = imageFile[i]; + await this.UpLoadOneImageToCache(bookTaskId, image) + } + } else if (typeof imageFile === 'string') { + await this.UpLoadOneImageToCache(bookTaskId, imageFile) + } else { + throw new Error('未知的数据类型,请检查') + } + return successMessage(null, '上传图片到缓存中成功', 'BookImage_UpLoadImageToCache') + } catch (error) { + return errorMessage('上传图片到缓存中失败,错误信息如下:' + error.message, 'BookImage_UpLoadImageToCache') + } + } + + //#endregion + + //#region 获取当前小说中的所有的批次中的缓存图片 + + /** + * 获取当前小说中的所有的批次中的缓存图片 + * @param bookTaskId 小说任务ID + * @returns + */ + public async GetAllBookTaskImageCache(bookTaskId: string) { + try { + if (isEmpty(bookTaskId)) { + throw new Error('没有找到对应的批次任务,请检查') + } + + let bookTask = await this.bookServiceBasic.GetBookTaskDataById(bookTaskId); + + let bookTasks = (await this.bookServiceBasic.GetBookTaskData({ + bookId: bookTask.bookId + })).bookTasks; + + if (bookTasks.length <= 0) { + throw new Error('没有找到对应的批次任务,请检查') + } + let result = [] as BookTask.BookTaskImageCacheImageList[] + for (let i = 0; i < bookTasks.length; i++) { + const element = bookTasks[i]; + let cacheImageList = element.cacheImageList ?? []; + if (cacheImageList.length > 0) { + // 检查图片文件是不是存在,不存在移除 + let cacheImageListTemp = [] as string[] + for (let i = 0; i < cacheImageList.length; i++) { + const element = cacheImageList[i]; + if (await CheckFileOrDirExist(element)) { + cacheImageListTemp.push(element) + } + } + result.push({ + bookTaskName: element.name, + bookId: element.bookId, + bookTaskId: element.id, + imagePaths: cacheImageListTemp + }) + } + } + return successMessage(result, '获取当前小说中的所有的批次中的缓存图片成功', 'BookImage_GetAllBookTaskImageCache') + + } catch (error) { + return errorMessage('获取当前小说中的所有的批次中的缓存图片失败,错误信息如下:' + error.message, 'BookImage_GetAllBookTaskImageCache') + } + } + //#endregion + + + //#region 保存缓存区的屠图片到小说主图或者是选图区 + + /** + * 保存缓存区的屠图片到小说主图或者是选图区 + * @param bookTaskDetailId 小说分镜ID + * @param imageFile 图片文件地址 + * @param option 操作 "outImagePath" (imageFile为字符串) | "subImagePath(imageFile为字符串数组)" + * @returns + */ + async SaveCacheImageToData(bookTaskDetailId: string, imageFile: string | string[], option: string) { + return await this.UpLoadImageToBookAndUpdateMessage(bookTaskDetailId, imageFile, option) + } + + //#endregion + } diff --git a/src/main/Service/Book/bookPrompt.ts b/src/main/Service/Book/bookPrompt.ts index 5dcd05d..0306763 100644 --- a/src/main/Service/Book/bookPrompt.ts +++ b/src/main/Service/Book/bookPrompt.ts @@ -1,6 +1,6 @@ import { isEmpty } from "lodash"; import { BookType, OperateBookType } from "../../../define/enum/bookEnum"; -import { Book } from "../../../model/book"; +import { Book } from "../../../model/book/book"; import { GeneralResponse } from "../../../model/generalResponse"; import { errorMessage, SendReturnMessage, successMessage } from "../../Public/generalTools"; import { BookServiceBasic } from "../ServiceBasic/bookServiceBasic"; diff --git a/src/main/Service/Book/bookTask.ts b/src/main/Service/Book/bookTask.ts index 59753ac..b6ba6b3 100644 --- a/src/main/Service/Book/bookTask.ts +++ b/src/main/Service/Book/bookTask.ts @@ -1,7 +1,7 @@ import { CheckFileOrDirExist, CheckFolderExistsOrCreate, CopyFileOrFolder, DeleteFolderAllFile } from "../../../define/Tools/file"; import { AddBookTaskCopyData, BookImageCategory, BookTaskStatus, BookType, CopyImageType, OperateBookType } from "../../../define/enum/bookEnum"; import { errorMessage, successMessage } from "../../Public/generalTools"; -import { Book } from "../../../model/book"; +import { Book } from "../../../model/book/book"; import path from 'path' import { add, cloneDeep, isEmpty } from "lodash"; import { define } from '../../../define/define' @@ -122,7 +122,7 @@ export class BookTask { async CopyBookTaskBaseData(bookTask: Book.SelectBookTask, addNewBookTask: Book.AddBookTask, no: number): Promise { let name = 'output_' + no.toString().padStart(5, '0'); let imageFolder = path.join(define.project_path, `${bookTask.bookId}/tmp/${name}`); - let imageCategory = global.config.defaultImageMode; + let imageCategory = global.config.defaultImageMode ?? BookImageCategory.MJ; let book = await this.bookServiceBasic.GetBookDataById(bookTask.bookId) if (!isEmpty(bookTask.imageCategory)) { imageCategory = bookTask.imageCategory; @@ -132,7 +132,7 @@ export class BookTask { } else if (book.type == BookType.SD_REVERSE) { imageCategory = BookImageCategory.SD } else if (book.type == BookType.ORIGINAL) { - imageCategory = global.config.defaultImageMode + imageCategory = global.config.defaultImageMode ?? BookImageCategory.MJ } } diff --git a/src/main/Service/Book/bookVideo.ts b/src/main/Service/Book/bookVideo.ts index 394049c..4541d0f 100644 --- a/src/main/Service/Book/bookVideo.ts +++ b/src/main/Service/Book/bookVideo.ts @@ -1,5 +1,5 @@ import { BookBackTaskStatus, BookBackTaskType, BookTaskStatus, OperateBookType, TaskExecuteType } from "../../../define/enum/bookEnum"; -import { Book } from "../../../model/book"; +import { Book } from "../../../model/book/book"; import { errorMessage, successMessage } from "../../Public/generalTools"; import { GeneralResponse } from "../../../model/generalResponse"; import { Setting } from '../../../main/setting/setting' diff --git a/src/main/Service/Book/imageStyle.ts b/src/main/Service/Book/imageStyle.ts index 8437d7f..4a264ab 100644 --- a/src/main/Service/Book/imageStyle.ts +++ b/src/main/Service/Book/imageStyle.ts @@ -1,6 +1,6 @@ import { TagDefineType } from "../../../define/enum/bookEnum"; import { ImageStyleDefine } from "../../../define/iamgeStyleDefine"; -import { Book } from "../../../model/book"; +import { Book } from "../../../model/book/book"; import { GeneralResponse } from "../../../model/generalResponse"; import { TagCustomize } from "../../Original/TagCustomize"; import { errorMessage, successMessage } from "../../Public/generalTools"; diff --git a/src/main/Service/GPT/gpt.ts b/src/main/Service/GPT/gpt.ts index a7bf2f0..2856bab 100644 --- a/src/main/Service/GPT/gpt.ts +++ b/src/main/Service/GPT/gpt.ts @@ -2,7 +2,7 @@ import { isEmpty } from "lodash"; import { gptDefine } from "../../../define/gptDefine"; import axios from "axios"; import { RetryWithBackoff } from "../../../define/Tools/common"; -import { Book } from "../../../model/book"; +import { Book } from "../../../model/book/book"; /** * 一些GPT相关的服务都在这边 diff --git a/src/main/Service/MJ/mj.ts b/src/main/Service/MJ/mj.ts index 6d68be0..68e50f9 100644 --- a/src/main/Service/MJ/mj.ts +++ b/src/main/Service/MJ/mj.ts @@ -1,5 +1,5 @@ import { isEmpty } from "lodash"; -import { Book } from "../../../model/book"; +import { Book } from "../../../model/book/book"; import { checkStringValueAddPrefix, checkStringValueAddSuffix, errorMessage, successMessage } from "../../Public/generalTools"; import { CheckFolderExistsOrCreate, CopyFileOrFolder, JoinPath } from "../../../define/Tools/file"; import { define } from "../../../define/define" diff --git a/src/main/Service/SD/sd.ts b/src/main/Service/SD/sd.ts index 226cf35..1308582 100644 --- a/src/main/Service/SD/sd.ts +++ b/src/main/Service/SD/sd.ts @@ -1,4 +1,4 @@ -import { Book } from "../../../model/book"; +import { Book } from "../../../model/book/book"; import { GeneralResponse } from "../../../model/generalResponse"; import { checkStringValueAddSuffix, errorMessage, successMessage } from "../../Public/generalTools"; import { define } from '../../../define/define' diff --git a/src/main/Service/ServiceBasic/bookBackTaskServiceBasic.ts b/src/main/Service/ServiceBasic/bookBackTaskServiceBasic.ts index 8be1ca4..8f512e3 100644 --- a/src/main/Service/ServiceBasic/bookBackTaskServiceBasic.ts +++ b/src/main/Service/ServiceBasic/bookBackTaskServiceBasic.ts @@ -1,6 +1,6 @@ import { BookBackTaskStatus, BookBackTaskType, TaskExecuteType } from "../../../define/enum/bookEnum"; import { BookBackTaskListService } from "../../../define/db/service/Book/bookBackTaskListService"; -import { Book } from "../../../model/book"; +import { Book } from "../../../model/book/book"; import { TaskModal } from "@/model/task"; import { cloneDeep, isEmpty } from "lodash"; diff --git a/src/main/Service/ServiceBasic/bookBasic.ts b/src/main/Service/ServiceBasic/bookBasic.ts index 53f78ec..70b8eac 100644 --- a/src/main/Service/ServiceBasic/bookBasic.ts +++ b/src/main/Service/ServiceBasic/bookBasic.ts @@ -1,5 +1,5 @@ import { BookService } from "../../../define/db/service/Book/bookService"; -import { Book } from "../../../model/book"; +import { Book } from "../../../model/book/book"; export class BookBasic { bookService: BookService diff --git a/src/main/Service/ServiceBasic/bookServiceBasic.ts b/src/main/Service/ServiceBasic/bookServiceBasic.ts index de9477a..4ca5a62 100644 --- a/src/main/Service/ServiceBasic/bookServiceBasic.ts +++ b/src/main/Service/ServiceBasic/bookServiceBasic.ts @@ -1,7 +1,7 @@ import { DEFINE_STRING } from "../../../define/define_string"; import { GeneralResponse } from "../../../model/generalResponse"; import { BookService } from "../../../define/db/service/Book/bookService"; -import { Book } from "../../../model/book"; +import { Book } from "../../../model/book/book"; import { BookBackTaskStatus, BookBackTaskType, BookTaskStatus, TaskExecuteType } from "../../../define/enum/bookEnum"; import BookBackTaskServiceBasic from "./bookBackTaskServiceBasic"; import { BookBasic } from "./bookBasic"; diff --git a/src/main/Service/ServiceBasic/bookTaskDetailServiceBasic.ts b/src/main/Service/ServiceBasic/bookTaskDetailServiceBasic.ts index b47c8b7..a040caf 100644 --- a/src/main/Service/ServiceBasic/bookTaskDetailServiceBasic.ts +++ b/src/main/Service/ServiceBasic/bookTaskDetailServiceBasic.ts @@ -1,6 +1,6 @@ import { BookTaskDetailService } from "../../../define/db/service/Book/bookTaskDetailService"; import { BookTaskStatus } from "../../../define/enum/bookEnum"; -import { Book } from "../../../model/book"; +import { Book } from "../../../model/book/book"; import { BookTaskService } from "../../../define/db/service/Book/bookTaskService"; export default class BookTaskDetailServiceBasic { diff --git a/src/main/Service/ServiceBasic/bookTaskServiceBasic.ts b/src/main/Service/ServiceBasic/bookTaskServiceBasic.ts index c656fa3..d2ffe18 100644 --- a/src/main/Service/ServiceBasic/bookTaskServiceBasic.ts +++ b/src/main/Service/ServiceBasic/bookTaskServiceBasic.ts @@ -1,5 +1,5 @@ import { BookTaskService } from "../../../define/db/service/Book/bookTaskService"; -import { Book } from "../../../model/book"; +import { Book } from "../../../model/book/book"; import { BookService } from "../../../define/db/service/Book/bookService"; export default class BookTaskServiceBasic { diff --git a/src/main/Service/Subtitle/subtitle.ts b/src/main/Service/Subtitle/subtitle.ts index 12f9f53..8022978 100644 --- a/src/main/Service/Subtitle/subtitle.ts +++ b/src/main/Service/Subtitle/subtitle.ts @@ -11,7 +11,7 @@ import { GetFilesWithExtensions } from '../../../define/Tools/file' import { shell } from 'electron' -import { Book } from '../../../model/book' +import { Book } from '../../../model/book/book' import fs from 'fs' import { GeneralResponse } from '../../../model/generalResponse' import { BookServiceBasic } from '../ServiceBasic/bookServiceBasic' diff --git a/src/main/Service/Subtitle/subtitleService.ts b/src/main/Service/Subtitle/subtitleService.ts index e7b9525..d2859de 100644 --- a/src/main/Service/Subtitle/subtitleService.ts +++ b/src/main/Service/Subtitle/subtitleService.ts @@ -13,7 +13,7 @@ import { BookServiceBasic } from "../ServiceBasic/bookServiceBasic"; import { Subtitle } from "./subtitle"; import { LogScheduler } from "../task/logScheduler"; import { BookTaskStatus, BookType, OperateBookType } from "../../../define/enum/bookEnum"; -import { Book } from "../../../model/book"; +import { Book } from "../../../model/book/book"; import { TimeStringToMilliseconds } from "../../../define/Tools/time"; export class SubtitleService { diff --git a/src/main/Service/Translate/TranslateService.ts b/src/main/Service/Translate/TranslateService.ts index e004cd9..2a2a31e 100644 --- a/src/main/Service/Translate/TranslateService.ts +++ b/src/main/Service/Translate/TranslateService.ts @@ -4,7 +4,7 @@ import { errorMessage, successMessage } from "../../Public/generalTools"; import { Translate } from "./Translate"; import { DEFINE_STRING } from "../../../define/define_string" import { TranslateAPIType, TranslateType } from "../../../define/enum/translate"; -import { Book } from "../../../model/book"; +import { Book } from "../../../model/book/book"; import { ResponseMessageType } from "../../../define/enum/softwareEnum"; import { isEmpty } from "lodash"; import { ValidateJson } from "../../../define/Tools/validate"; diff --git a/src/main/Service/system/electronInterface.ts b/src/main/Service/system/electronInterface.ts index 864ee67..84e90bc 100644 --- a/src/main/Service/system/electronInterface.ts +++ b/src/main/Service/system/electronInterface.ts @@ -1,7 +1,8 @@ -import { shell } from "electron"; +import { dialog, shell } from "electron"; import { CheckFileOrDirExist } from "../../../define/Tools/file"; import { errorMessage, successMessage } from "../../Public/generalTools"; import path from 'path'; +import { GeneralResponse } from "@/model/generalResponse"; /** 打开指定的文件夹的方法 */ @@ -29,6 +30,7 @@ export default class ElectronInterface { } await shell.openPath(value) } + /** * 打开对应的文件夹 * @param params @@ -57,4 +59,47 @@ export default class ElectronInterface { return errorMessage('打开文件夹错误,错误信息如下:' + error.message, 'SystemIpc_OPEN_FOLDER') } } + + + /** + * 选择单个指定文件后缀的文件 + * @param value 后缀列表 + */ + public async SelectSingleFile(value: string[]): Promise { + try { + let { filePaths } = await dialog.showOpenDialog({ + properties: ['openFile'], + filters: [{ name: 'fileName', extensions: value }] + }) + if (filePaths.length === 0) { + throw new Error('没有选择的文件'); + } + return successMessage(filePaths[0], '选择文件成功', 'SystemIpc_SelectSingleFile') + } catch (error) { + return errorMessage('选择文件错误,错误信息如下:' + error.message, 'SystemIpc_SelectSingleFile'); + } + } + + /** + * 选择多个指定文件后缀的文件 + * @param value 文件后缀列表 + * @returns + */ + public async SelectMultipleFile(value: string[]): Promise { + try { + const { filePaths } = await dialog.showOpenDialog({ + properties: ['openFile', 'multiSelections'], + filters: [{ name: 'fileName', extensions: value }] + }); + + if (filePaths.length === 0) { + throw new Error('没有选择的文件'); + } + + return successMessage(filePaths, '选择文件成功', 'SystemIpc_SelectMultipleFile'); + } catch (error) { + console.error('选择文件错误:', error); // 记录错误日志 + return errorMessage('选择文件错误,错误信息如下:' + error.message, 'SystemIpc_SelectMultipleFile'); + } + } } \ No newline at end of file diff --git a/src/main/Service/system/systeminfo.ts b/src/main/Service/system/systeminfo.ts index 81b9cd1..d2b123e 100644 --- a/src/main/Service/system/systeminfo.ts +++ b/src/main/Service/system/systeminfo.ts @@ -140,10 +140,10 @@ export default class SystemInfo { throw new Error(res.data.message) } - global.endTime = res.data.endTime - global.permissions = res.data.permissions + global.endTime = res.data.data.deactivationTime + global.permissions = res.data.data.permissions global.CheckMachineId = true - return successMessage(res.data, '获取机器码状态成功') + return successMessage(res.data.data, '获取机器码状态成功') } catch (error) { return errorMessage('获取机器码状态错误,错误信息如下:' + error.message, 'SystemIpc_CHECK_MACHINE_STATUS') } diff --git a/src/main/Service/tts.ts b/src/main/Service/tts.ts index ffb3977..7174fbc 100644 --- a/src/main/Service/tts.ts +++ b/src/main/Service/tts.ts @@ -203,7 +203,8 @@ export class TTS { saveSubtitles: true, pitch: `${edgeTTS.pitch}%`, rate: `${edgeTTS.rate}%`, - volume: `${edgeTTS.volumn}%` + volume: `${edgeTTS.volumn}%`, + timeout : 10000 }) let ttsRes = await tts.ttsPromise(text, mp3Path) console.log(ttsRes) diff --git a/src/main/Service/watermark.ts b/src/main/Service/watermark.ts index 99d64a3..4834c6c 100644 --- a/src/main/Service/watermark.ts +++ b/src/main/Service/watermark.ts @@ -22,7 +22,7 @@ import { BookService } from '../../define/db/service/Book/bookService'; import { OperateBookType } from '../../define/enum/bookEnum'; import { GeneralResponse } from '../../model/generalResponse'; import { BookTaskDetailService } from '../../define/db/service/Book/bookTaskDetailService'; -import { Book } from '../../model/book'; +import { Book } from '../../model/book/book'; import { DEFINE_STRING } from '../../define/define_string'; import { BookTaskService } from '../../define/db/service/Book/bookTaskService'; diff --git a/src/model/book.d.ts b/src/model/book/book.d.ts similarity index 97% rename from src/model/book.d.ts rename to src/model/book/book.d.ts index 8873687..cc83279 100644 --- a/src/model/book.d.ts +++ b/src/model/book/book.d.ts @@ -1,9 +1,8 @@ -import { BookBackTaskStatus, BookBackTaskType, BookTaskStatus, BookType, TaskExecuteType, BookRepalceDataType, BookImageCategory } from "../define/enum/bookEnum" -import { MJAction } from "../define/enum/bookEnum" -import { MJImageType } from "../define/enum/mjEnum" +import { BookBackTaskStatus, BookBackTaskType, BookTaskStatus, BookType, TaskExecuteType, BookRepalceDataType, BookImageCategory } from "../../define/enum/bookEnum" +import { MJAction } from "../../define/enum/bookEnum" +import { MJImageType } from "../../define/enum/mjEnum" declare namespace Book { - type SelectBook = { id?: string, no?: number, @@ -61,6 +60,7 @@ declare namespace Book { friendlyReminder?: string | null // 友情提示 imageFolder?: string, customizeImageStyle?: string[], + cacheImageList?: string[], prefixPrompt?: string, suffixPrompt?: string, styleList?: BookStyle[] | DefineBookStyle[] // 样式列表, diff --git a/src/model/book/bookTask.d.ts b/src/model/book/bookTask.d.ts new file mode 100644 index 0000000..e101e9c --- /dev/null +++ b/src/model/book/bookTask.d.ts @@ -0,0 +1,8 @@ +declare namespace BookTask { + type BookTaskImageCacheImageList = { + bookTaskName: string; + bookTaskId: string; + bookId: string; + imagePaths: string[]; + } +} \ No newline at end of file diff --git a/src/model/task.d.ts b/src/model/task.d.ts index 8012e87..2d353c4 100644 --- a/src/model/task.d.ts +++ b/src/model/task.d.ts @@ -1,4 +1,4 @@ -import { BookBackTaskStatus, BookBackTaskType, TaskExecuteType } from "@/define/enum/bookEnum" +import { BookBackTaskStatus, BookBackTaskType, BookTaskStatus, TaskExecuteType } from "@/define/enum/bookEnum" declare namespace TaskModal { interface Task { @@ -45,4 +45,12 @@ declare namespace TaskModal { count: number, data: BackTaskCollection[] } + + type TaskStatus = { + status: BookBackTaskStatus | "UNKNOWN" | BookTaskStatus; + label: string; + type?: string; + color?: string; + } & ({ type: string } | { color: string }) + } \ No newline at end of file diff --git a/src/preload/book.ts b/src/preload/book.ts index 16c8ef6..f584a51 100644 --- a/src/preload/book.ts +++ b/src/preload/book.ts @@ -1,6 +1,6 @@ import { ipcRenderer } from 'electron' import { DEFINE_STRING } from '../define/define_string' -import { Book } from '../model/book' +import { Book } from '../model/book/book' import { SubtitleModel } from '../model/subtitle' import { BookType, OperateBookType } from '../define/enum/bookEnum' @@ -182,6 +182,16 @@ const book = { /** 添加一键生图后台任务 */ GenerateAllTaskImage: async (ids: string[], operateBookType: OperateBookType) => await ipcRenderer.invoke(DEFINE_STRING.BOOK.GENERATE_ALL_TASK_IMAGE, ids, operateBookType), + /** 上传图片到小说中,并修改小说信息 */ + UpLoadImageToBookAndUpdateMessage: async (bookTaskDetailId: string, imageFile: string | string[], option: string) => await ipcRenderer.invoke(DEFINE_STRING.BOOK.UPLOAD_IMAGE_TO_BOOK_AND_UPDATE_MESSAGE, bookTaskDetailId, imageFile, option), + + /** 上传图片到缓存 */ + UpLoadImageToCache: async (bookTaskId: string, imageFile: string | string[]) => await ipcRenderer.invoke(DEFINE_STRING.BOOK.UPLOAD_IMAGE_TO_CACHE, bookTaskId, imageFile), + /** 获取当前小说中的所有的批次中的缓存图片 */ + GetAllBookTaskImageCache: async (bookTaskId: string) => await ipcRenderer.invoke(DEFINE_STRING.BOOK.GET_ALL_BOOK_TASK_IMAGE_CACHE, bookTaskId), + /** 保存缓存区的屠图片到小说主图或者是选图区 */ + SaveCacheImageToData: async (bookTaskDetailId: string, imageFile: string | string[], option: string) => await ipcRenderer.invoke(DEFINE_STRING.BOOK.SAVE_CACHE_IMAGE_TO_DATA, bookTaskDetailId, imageFile, option), + //#endregion //#region 一键反推的单个任务 diff --git a/src/preload/db.ts b/src/preload/db.ts index d87db87..e8a7f59 100644 --- a/src/preload/db.ts +++ b/src/preload/db.ts @@ -1,6 +1,6 @@ import { ipcRenderer } from 'electron' import { DEFINE_STRING } from '../define/define_string' -import { Book } from '../model/book' +import { Book } from '../model/book/book' const db = { //#region 小说相关的修改 diff --git a/src/preload/system.ts b/src/preload/system.ts index 322c990..fca0bc2 100644 --- a/src/preload/system.ts +++ b/src/preload/system.ts @@ -14,7 +14,13 @@ const system = { /** 检查机器码状态 */ CheckMachineStatus: (value: string) => ipcRenderer.invoke(DEFINE_STRING.SYSTEM.CHECK_MACHINE_STATUS, value), /** 获取软件版本信息,更新信息,首页内容,公告等 */ - GetRemoteSystemInformation : () => ipcRenderer.invoke(DEFINE_STRING.SYSTEM.GET_REMOTE_SYSTEM_INFORMATION) - + GetRemoteSystemInformation: () => ipcRenderer.invoke(DEFINE_STRING.SYSTEM.GET_REMOTE_SYSTEM_INFORMATION), + + /** 选择单个指定文件后缀的文件 */ + SelectSingleFile: (value: string[]) => ipcRenderer.invoke(DEFINE_STRING.SYSTEM.SELECT_SINGLE_FILE, value), + + /** 选择多个指定文件后缀的文件 */ + SelectMultipleFile: (value: string[]) => ipcRenderer.invoke(DEFINE_STRING.SYSTEM.SELECT_MULTIPLE_FILE, value), + } export { system } diff --git a/src/renderer/src/App.vue b/src/renderer/src/App.vue index 7002c5c..d5ff828 100644 --- a/src/renderer/src/App.vue +++ b/src/renderer/src/App.vue @@ -6,11 +6,13 @@ :theme="softwareStore.globalSetting.theme == 'dark' ? darkTheme : null" > - - - - - + + + + + + + @@ -24,6 +26,7 @@ import { NMessageProvider, NDialogProvider, NConfigProvider, + NModalProvider, darkTheme, NNotificationProvider, NSpin @@ -38,13 +41,13 @@ export default defineComponent({ NDialogProvider, NMessageProvider, NNotificationProvider, + NModalProvider, NSpin }, setup() { let softwareStore = useSoftwareStore() onMounted(async () => { - softwareStore.SoftColor = SoftColor window.api.getSettingDafultData(async (value) => { await window.darkMode.toggle(value.theme) @@ -80,8 +83,8 @@ export default defineComponent({ /* Customize the scrollbar */ ::-webkit-scrollbar { - width: 2px; - height: 4px; + width: 4px; + height: 6px; } /* Track */ diff --git a/src/renderer/src/components/BackTask/TaskDataTable.vue b/src/renderer/src/components/BackTask/TaskDataTable.vue index 5b3d3b0..5c93cef 100644 --- a/src/renderer/src/components/BackTask/TaskDataTable.vue +++ b/src/renderer/src/components/BackTask/TaskDataTable.vue @@ -103,6 +103,7 @@ import { NFormItem, NInput, NButton, + NTag, NGrid, NGridItem, NSelect @@ -144,7 +145,10 @@ let columns = [ { title: '状态', key: 'status', - minWidth: 100 + minWidth: 100, + render: (row) => { + return renderStatus(row) + } }, { title: '失败原因', @@ -156,6 +160,14 @@ let columns = [ } ] +function renderStatus(row) { + return h( + NTag, + { bordered: false, type: GetBookBackTaskStatusLabel(row.status).type }, + { default: GetBookBackTaskStatusLabel(row.status).label } + ) +} + async function ResetQuery() { softwareStore.ResetBackTaskQueryData() await query(1, pagination.value.pageSize) @@ -237,7 +249,7 @@ let GeBookBackTaskStatus = () => { let options = [] for (const key in BookBackTaskStatus) { options.push({ - label: GetBookBackTaskStatusLabel(BookBackTaskStatus[key]), + label: GetBookBackTaskStatusLabel(BookBackTaskStatus[key]).label, value: BookBackTaskStatus[key] }) } diff --git a/src/renderer/src/components/Book/Components/Image/BookTaskImageCache.vue b/src/renderer/src/components/Book/Components/Image/BookTaskImageCache.vue new file mode 100644 index 0000000..3bf95bb --- /dev/null +++ b/src/renderer/src/components/Book/Components/Image/BookTaskImageCache.vue @@ -0,0 +1,300 @@ + + + + + diff --git a/src/renderer/src/components/Book/Components/Image/SelectRegionImage.vue b/src/renderer/src/components/Book/Components/Image/SelectRegionImage.vue new file mode 100644 index 0000000..e6a3676 --- /dev/null +++ b/src/renderer/src/components/Book/Components/Image/SelectRegionImage.vue @@ -0,0 +1,119 @@ + + + + + diff --git a/src/renderer/src/components/Book/Components/ManageBook/BookTaskDetailOptions.vue b/src/renderer/src/components/Book/Components/ManageBook/BookTaskDetailOptions.vue new file mode 100644 index 0000000..f60a550 --- /dev/null +++ b/src/renderer/src/components/Book/Components/ManageBook/BookTaskDetailOptions.vue @@ -0,0 +1,101 @@ + + + diff --git a/src/renderer/src/components/Book/MJReverse/DatatableGenerateImage.vue b/src/renderer/src/components/Book/MJReverse/DatatableGenerateImage.vue index 93c9700..25d2789 100644 --- a/src/renderer/src/components/Book/MJReverse/DatatableGenerateImage.vue +++ b/src/renderer/src/components/Book/MJReverse/DatatableGenerateImage.vue @@ -50,7 +50,21 @@ @drop="imageDragDrop" @dragover="imageDragOver" > -
+
+ + + + + + - - - - - - - - - - -
+ +
-
+
+
+ + + 上传本地图片到选图区 + + + + 上传选图区图片到缓存区 + + + + 从缓存区下载图片到选图区 + +
+ + + + + +
diff --git a/src/renderer/src/components/Book/MJReverse/DatatableHeaderGenerateImage.vue b/src/renderer/src/components/Book/MJReverse/DatatableHeaderGenerateImage.vue index 2c652db..6b6da4c 100644 --- a/src/renderer/src/components/Book/MJReverse/DatatableHeaderGenerateImage.vue +++ b/src/renderer/src/components/Book/MJReverse/DatatableHeaderGenerateImage.vue @@ -43,7 +43,7 @@ import { NSelect, NButton, useMessage, useDialog, NPopover, NIcon } from 'naive- import { useSoftwareStore } from '../../../../../stores/software' import { useReverseManageStore } from '../../../../../stores/reverseManage' import { Download } from '@vicons/ionicons5' -import { OperateBookType } from '../../../../../define/enum/bookEnum' +import { BookImageCategory, OperateBookType } from '../../../../../define/enum/bookEnum' let softwareStore = useSoftwareStore() let message = useMessage() let dialog = useDialog() @@ -53,7 +53,7 @@ let image_options = ref([]) let select = computed(() => reverseManageStore.selectBookTask.imageCategory ? reverseManageStore.selectBookTask.imageCategory - : softwareStore.globalSetting.defaultImageMode + : softwareStore.globalSetting.defaultImageMode ?? BookImageCategory.MJ ) onMounted(async () => { diff --git a/src/renderer/src/components/Book/MJReverse/DatatableHeaderImage.vue b/src/renderer/src/components/Book/MJReverse/DatatableHeaderImage.vue index 7b8d9d8..c83a1c1 100644 --- a/src/renderer/src/components/Book/MJReverse/DatatableHeaderImage.vue +++ b/src/renderer/src/components/Book/MJReverse/DatatableHeaderImage.vue @@ -8,132 +8,188 @@ @update:value="handleUpdateValue" :options="options" /> - - 一键锁定 - - 一拆四 + + + +
- diff --git a/src/renderer/src/components/Book/MJReverse/ManageBookDetailButton.vue b/src/renderer/src/components/Book/MJReverse/ManageBookDetailButton.vue index 5b5f488..3b740d8 100644 --- a/src/renderer/src/components/Book/MJReverse/ManageBookDetailButton.vue +++ b/src/renderer/src/components/Book/MJReverse/ManageBookDetailButton.vue @@ -84,7 +84,7 @@ :color="softwareStore.SoftColor.ORANGE" style="margin-left: 5px" size="small" - @click="GenerateImageAll" + @click="GenerateImageAll(true)" > 一键生图 @@ -138,7 +138,13 @@ import VideoCanvas from '../../VideoSubtitle/VideoCanvas.vue' import { SubtitleSavePositionType } from '../../../../../define/enum/waterMarkAndSubtitle.ts' import { DEFINE_STRING } from '../../../../../define/define_string/index.ts' import Setting from './Setting.vue' -import { BookType, OperateBookType } from '../../../../../define/enum/bookEnum.ts' +import { + BookBackTaskType, + BookImageCategory, + BookType, + OperateBookType, + TaskExecuteType +} from '../../../../../define/enum/bookEnum.ts' import TranslateSetting from '../../Setting/TranslateSetting.vue' import { TranslateType } from '../../../../../define/enum/translate.ts' import { ContainsChineseOrPunctuation } from '../../../../../define/Tools/common.ts' @@ -464,6 +470,10 @@ async function handleSelect(key) { await Translate('translate_english') break + case 'generate_space_image': //生成未生成的图片 + await GenerateImageAll(false) + break + case 'translate_setting': // 翻译设置 await Translate('translate_setting') break @@ -780,18 +790,124 @@ async function TranslateService(from, to) { } /** - * 生成所有图片 + * 根据指定类型为所有书籍任务生成图像 + * @param {String} type - 小说图像类别 + * @param {Boolean} cover - 是否覆盖现有图像 */ -async function GenerateImageAll() { - let res = await window.book.GenerateImageAll( - reverseManageStore.selectBookTask.id, - reverseManageStore.selectBookTask.imageCategory - ) - if (res.code == 0) { - message.error(res.message) +async function AddFluxImageAll(type, cover) { + let messageName = DEFINE_STRING.BOOK.FLUX_API_IMAGE_GENERATE_RETURN + let taskType = BookBackTaskType.FLUX_API_IMAGE + if (type == BookImageCategory.FLUX_FORGE) { + messageName = DEFINE_STRING.BOOK.FLUX_FORGE_IMAGE_GENERATE_RETURN + taskType = BookBackTaskType.FLUX_FORGE_IMAGE + } else if (type == BookImageCategory.FLUX_API) { + messageName = DEFINE_STRING.BOOK.FLUX_API_IMAGE_GENERATE_RETURN + taskType = BookBackTaskType.FLUX_API_IMAGE + } else if (type == BookImageCategory.D3) { + messageName = DEFINE_STRING.BOOK.D3_IMAGE_GENERATE_RETURN + taskType = BookBackTaskType.D3_IMAGE + } else if (type == BookImageCategory.SD) { + messageName = DEFINE_STRING.BOOK.SD_IMAGE_GENERATE_RETURN + taskType = BookBackTaskType.SD_IMAGE + } else { + message.error('未知的图像类别') return } - message.success(res.message) + // 这边过滤所有的锁定的分镜 + let bookTaskDetails = reverseManageStore.selectBookTaskDetail.filter((item) => !item.imageLock) + + if (cover) { + // 添加全部的任务 + let tasks = [] + for (let i = 0; i < bookTaskDetails.length; i++) { + const element = bookTaskDetails[i] + tasks.push({ + bookId: reverseManageStore.selectBook.id, + type: taskType, + executeType: TaskExecuteType.AUTO, + bookTaskId: reverseManageStore.selectBookTask.id, + bookTaskDetailId: element.id, + messageName: messageName + }) + } + if (tasks.length <= 0) { + message.error('没有需要生成的分镜') + return + } + let res = await await window.task.AddMultiBookBackTask(tasks) + window.api.showGlobalMessage(res) + } else { + // 添加未生成的任务 + let tasks = [] + for (let i = 0; i < bookTaskDetails.length; i++) { + const element = bookTaskDetails[i] + if (!element.mjMessage) { + tasks.push({ + bookId: reverseManageStore.selectBook.id, + type: taskType, + executeType: TaskExecuteType.AUTO, + bookTaskId: reverseManageStore.selectBookTask.id, + bookTaskDetailId: element.id, + messageName: messageName + }) + } + } + if (tasks.length == 0) { + message.error('没有未生成的分镜,或者都被锁定了') + return + } + let res = await await window.task.AddMultiBookBackTask(tasks) + window.api.showGlobalMessage(res) + } + return +} + +/** + * 生成所有图片 + */ +async function GenerateImageAll(cover = true) { + let da = dialog.warning({ + title: '生成所有图片提示', + content: `即将开始生成 ${cover ? '所有的' : '从未生成过的分镜'} 图片,当前的生图模式为 ${ + reverseManageStore.selectBookTask.imageCategory + },开始执行会有1-20秒的延迟,除了被锁定的图片,其余的图片都会重新生成,是否继续?`, + positiveText: '继续', + negativeText: '取消', + onPositiveClick: async () => { + try { + da?.destroy() + debugger + if (reverseManageStore.selectBookTask.imageCategory == BookImageCategory.MJ) { + let res = await window.mj.AddMJGenerateImageTask( + reverseManageStore.selectBookTask.id, + OperateBookType.BOOKTASK, + DEFINE_STRING.BOOK.MJ_IMAGE_GENERATE_RETURN, + cover + ) + if (res?.code == 1) { + message.success(res.message) + } else { + message.error(res.message) + } + } else if (reverseManageStore.selectBookTask.imageCategory == BookImageCategory.SD) { + await AddFluxImageAll(BookImageCategory.SD, cover) + } else if ( + reverseManageStore.selectBookTask.imageCategory == BookImageCategory.FLUX_FORGE + ) { + await AddFluxImageAll(BookImageCategory.FLUX_FORGE, cover) + } else if (reverseManageStore.selectBookTask.imageCategory == BookImageCategory.FLUX_API) { + await AddFluxImageAll(BookImageCategory.FLUX_API, cover) + } else if (reverseManageStore.selectBookTask.imageCategory == BookImageCategory.D3) { + await AddFluxImageAll(BookImageCategory.D3, cover) + } else { + message.error('不支持的生图类型') + return + } + } catch (error) { + message.error(error.message) + } + } + }) } /** @@ -973,6 +1089,7 @@ let translateOptions = [ } ] let generateOptions = [ + { label: '生成未出图分镜', key: 'generate_space_image' }, { label: '停止生图', key: 'stop_image_generate' diff --git a/src/renderer/src/components/Book/MJReverse/ManageBookReverseTable.vue b/src/renderer/src/components/Book/MJReverse/ManageBookReverseTable.vue index 77bb288..4c67b1c 100644 --- a/src/renderer/src/components/Book/MJReverse/ManageBookReverseTable.vue +++ b/src/renderer/src/components/Book/MJReverse/ManageBookReverseTable.vue @@ -27,6 +27,7 @@ import DatatableAfterGpt from './DatatableAfterGpt.vue' import DatatableGenerateImage from './DatatableGenerateImage.vue' import ODataTableAction from '../Original/ODataTableAction.vue' import SDReversePrompt from './SDReversePrompt.vue' +import BookTaskDetailOptions from '../Components/ManageBook/BookTaskDetailOptions.vue' let softwareStore = useSoftwareStore() let reverseManageStore = useReverseManageStore() @@ -117,7 +118,9 @@ const columns = [ }, { // 参数 - title: '参数', + title(row) { + return h(BookTaskDetailOptions, { style: 'font-size: 24px;margin-left: 5px' }) + }, key: 'parameter', width: '110', render(row, index) { @@ -126,7 +129,7 @@ const columns = [ }, { title() { - return h(DatatableHeaderImage) + return h(DatatableHeaderImage, { style: 'font-size: 24px; margin-left: 5px' }) }, width: 300, className: 'empty-margin', diff --git a/src/renderer/src/components/Book/ManageBookTask.vue b/src/renderer/src/components/Book/ManageBookTask.vue index 7ab721b..b0df464 100644 --- a/src/renderer/src/components/Book/ManageBookTask.vue +++ b/src/renderer/src/components/Book/ManageBookTask.vue @@ -1,6 +1,14 @@ @@ -30,7 +28,9 @@ import ODataTableHeaderPrompt from './ODatatableHeaderPrompt.vue' import ODatatablePrompt from './ODatatablePrompt.vue' import ODataTableAction from './ODataTableAction.vue' import DatatableHeaderGenerateImage from '../MJReverse/DatatableHeaderGenerateImage.vue' +import DatatableHeaderImage from '../MJReverse/DatatableHeaderImage.vue' import DatatableGenerateImage from '../MJReverse/DatatableGenerateImage.vue' +import BookTaskDetailOptions from '../Components/ManageBook/BookTaskDetailOptions.vue' import { useReverseManageStore } from '../../../../../stores/reverseManage' import { useSoftwareStore } from '../../../../../stores/software' let reverseManageStore = useReverseManageStore() @@ -141,7 +141,9 @@ const createColumns = ({}) => { }, { // 参数 - title: '参数', + title(row) { + return h(BookTaskDetailOptions, { style: 'font-size: 24px;margin-left: 5px' }) + }, key: 'parameter', width: '130', render(row, index) { @@ -151,7 +153,8 @@ const createColumns = ({}) => { { // 出图 title(row) { - return h(DatatableHeaderGenerateImage) + // return h(DatatableHeaderGenerateImage) + return h(DatatableHeaderImage, { style: 'font-size: 24px; margin-left: 5px' }) }, key: 'options', className: 'empty-margin', diff --git a/src/renderer/src/components/Icon/DownloadRound.vue b/src/renderer/src/components/Icon/DownloadRound.vue new file mode 100644 index 0000000..4efa19b --- /dev/null +++ b/src/renderer/src/components/Icon/DownloadRound.vue @@ -0,0 +1,12 @@ + diff --git a/src/renderer/src/components/Icon/MenuOpenRound.vue b/src/renderer/src/components/Icon/MenuOpenRound.vue new file mode 100644 index 0000000..79d0f07 --- /dev/null +++ b/src/renderer/src/components/Icon/MenuOpenRound.vue @@ -0,0 +1,12 @@ + diff --git a/src/renderer/src/components/Icon/OpenInBrowserRound.vue b/src/renderer/src/components/Icon/OpenInBrowserRound.vue new file mode 100644 index 0000000..c8a279e --- /dev/null +++ b/src/renderer/src/components/Icon/OpenInBrowserRound.vue @@ -0,0 +1,12 @@ + diff --git a/src/renderer/src/components/Icon/UploadRound.vue b/src/renderer/src/components/Icon/UploadRound.vue new file mode 100644 index 0000000..a26b615 --- /dev/null +++ b/src/renderer/src/components/Icon/UploadRound.vue @@ -0,0 +1,14 @@ + diff --git a/src/stores/reverseManage.ts b/src/stores/reverseManage.ts index 49a572e..7b71c2d 100644 --- a/src/stores/reverseManage.ts +++ b/src/stores/reverseManage.ts @@ -2,7 +2,7 @@ import { messageDark, useMessage } from 'naive-ui' import { defineStore } from 'pinia' import { errorMessage, successMessage } from '../main/Public/generalTools' import { BookTaskStatus } from '../define/enum/bookEnum' -import { Book } from '../model/book' +import { Book } from '../model/book/book' import { GeneralResponse } from '../model/generalResponse' import { PresetModel } from '../model/preset'