V 2.2.9 自动匹配,手动排序

This commit is contained in:
lq1405 2024-06-13 00:37:31 +08:00
parent 3774e9fe55
commit 79a1929e79
76 changed files with 2499 additions and 1042 deletions

View File

@ -2,7 +2,6 @@
import { resolve } from "path";
import { defineConfig, externalizeDepsPlugin } from "electron-vite";
import vue from "@vitejs/plugin-vue";
import Jsx from "@vitejs/plugin-vue-jsx";
var electron_vite_config_default = defineConfig({
main: {
plugins: [externalizeDepsPlugin()]

55
package-lock.json generated
View File

@ -1,12 +1,12 @@
{
"name": "laitool",
"version": "2.2.8",
"version": "2.2.9",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "laitool",
"version": "2.2.6",
"version": "2.2.8",
"hasInstallScript": true,
"dependencies": {
"@alicloud/alimt20181012": "^1.2.0",
@ -35,6 +35,7 @@
"node-reg": "^0.2.4",
"npm": "^10.7.0",
"paddle": "^1.0.0",
"pinia": "^2.1.7",
"sharp": "^0.33.2",
"systeminformation": "^5.22.10",
"tencentcloud-sdk-nodejs": "^4.0.821",
@ -9281,6 +9282,56 @@
"node": ">=6"
}
},
"node_modules/pinia": {
"version": "2.1.7",
"resolved": "https://registry.npmmirror.com/pinia/-/pinia-2.1.7.tgz",
"integrity": "sha512-+C2AHFtcFqjPih0zpYuvof37SFxMQ7OEG2zV9jRI12i9BOy3YQVAHwdKtyyc8pDcDyIc33WCIsZaCFWU7WWxGQ==",
"dependencies": {
"@vue/devtools-api": "^6.5.0",
"vue-demi": ">=0.14.5"
},
"funding": {
"url": "https://github.com/sponsors/posva"
},
"peerDependencies": {
"@vue/composition-api": "^1.4.0",
"typescript": ">=4.4.4",
"vue": "^2.6.14 || ^3.3.0"
},
"peerDependenciesMeta": {
"@vue/composition-api": {
"optional": true
},
"typescript": {
"optional": true
}
}
},
"node_modules/pinia/node_modules/vue-demi": {
"version": "0.14.8",
"resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.8.tgz",
"integrity": "sha512-Uuqnk9YE9SsWeReYqK2alDI5YzciATE0r2SkA6iMAtuXvNTMNACJLJEXNXaEy94ECuBe4Sk6RzRU80kjdbIo1Q==",
"hasInstallScript": true,
"bin": {
"vue-demi-fix": "bin/vue-demi-fix.js",
"vue-demi-switch": "bin/vue-demi-switch.js"
},
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/antfu"
},
"peerDependencies": {
"@vue/composition-api": "^1.0.0-rc.1",
"vue": "^3.0.0-0 || ^2.6.0"
},
"peerDependenciesMeta": {
"@vue/composition-api": {
"optional": true
}
}
},
"node_modules/pixelmatch": {
"version": "4.0.2",
"license": "ISC",

View File

@ -1,6 +1,6 @@
{
"name": "laitool",
"version": "2.2.8",
"version": "2.2.9",
"description": "An Electron application with Vue",
"main": "./out/main/index.js",
"author": "example.com",
@ -43,6 +43,7 @@
"node-reg": "^0.2.4",
"npm": "^10.7.0",
"paddle": "^1.0.0",
"pinia": "^2.1.7",
"sharp": "^0.33.2",
"systeminformation": "^5.22.10",
"tencentcloud-sdk-nodejs": "^4.0.821",
@ -85,8 +86,6 @@
"resources/scripts/model/**",
"resources/scripts/Lai.exe",
"resources/scripts/_internal/**",
"resources/scripts/lama/lama_inpaint.exe",
"resources/scripts/lama/model/**",
"resources/scripts/discordScript.js",
"resources/tmp/**",
"resources/icon.ico"

View File

@ -0,0 +1,298 @@
accelerate==0.30.1
addict==2.4.0
aiofiles==23.2.1
aiohttp==3.8.6
aiosignal==1.3.1
alibabacloud-bailian20230601==1.6.1
alibabacloud-credentials==0.3.3
alibabacloud-endpoint-util==0.0.3
alibabacloud-gateway-spi==0.0.1
alibabacloud-openapi-util==0.2.2
alibabacloud-tea==0.3.6
alibabacloud-tea-openapi==0.3.9
alibabacloud-tea-util==0.3.12
alibabacloud-tea-xml==0.0.2
aliyun-python-sdk-core==2.15.0
aliyun-python-sdk-kms==2.16.2
altair==5.3.0
altgraph==0.17.4
annotated-types==0.6.0
anthropic==0.26.1
antlr4-python3-runtime==4.9.3
anyio==4.3.0
APScheduler==3.10.4
arxiv==2.1.0
astor==0.8.1
asttokens==2.4.1
async-timeout==4.0.3
attrdict==2.0.1
attrs==23.2.0
av==11.0.0
azure-cognitiveservices-speech==1.37.0
Babel==2.15.0
backports.tarfile==1.1.1
baidu-aip==4.16.13
bce-python-sdk==0.9.11
beautifulsoup4==4.12.3
bidict==0.23.1
blinker==1.8.2
broadscope-bailian==1.3.1
cachetools==5.3.3
certifi==2024.2.2
cffi==1.16.0
cfgv==3.4.0
chardet==5.2.0
charset-normalizer==3.3.2
chatgpt-tool-hub==0.5.0
cheroot==10.0.1
click==8.1.7
colorama==0.4.6
coloredlogs==15.0.1
comtypes==1.4.2
contourpy==1.2.1
controlnet-aux==0.0.3
crcmod==1.7
cryptography==42.0.5
cssselect==1.2.0
cssutils==2.11.0
ctranslate2==4.1.0
curl_cffi==0.6.4
cx-Logging==3.1.0
cx_Freeze==6.15.16
cycler==0.12.1
Cython==3.0.10
dashscope==1.19.2
datasets==2.18.0
decorator==4.4.2
diffusers==0.27.2
dill==0.3.8
dingtalk-stream==0.18.1
distlib==0.3.8
distro==1.9.0
dnspython==2.6.1
dulwich==0.22.1
easydict==1.13
edge-tts==6.1.12
einops==0.7.0
elevenlabs==1.0.3
email_validator==2.1.1
et-xmlfile==1.1.0
exceptiongroup==1.2.1
executing==2.0.1
fastapi==0.108.0
fastapi-cli==0.0.2
faster-whisper==1.0.1
feedparser==6.0.10
ffmpy==0.3.2
filelock==3.13.1
fire==0.6.0
Flask==3.0.3
flask-babel==4.0.0
flatbuffers==24.3.7
fonttools==4.53.0
frozenlist==1.4.1
fsspec==2024.2.0
future==1.0.0
gast==0.5.4
google-ai-generativelanguage==0.6.4
google-api-core==2.19.0
google-api-python-client==2.130.0
google-auth==2.29.0
google-auth-httplib2==0.2.0
google-generativeai==0.5.4
googleapis-common-protos==1.63.0
gradio==4.21.0
gradio_client==0.12.0
grpcio==1.64.0
grpcio-status==1.62.2
gTTS==2.5.1
h11==0.14.0
HTMLParser==0.0.2
httpcore==1.0.5
httplib2==0.22.0
httptools==0.6.1
httpx==0.27.0
huggingface-hub==0.23.2
humanfriendly==10.0
identify==2.5.36
idna==3.6
imageio==2.34.0
imageio-ffmpeg==0.4.9
imgaug==0.4.0
importlib_metadata==7.0.2
importlib_resources==6.4.0
install==1.3.5
IOPaint==1.3.3
ipython==8.24.0
itsdangerous==2.2.0
jaraco.context==5.3.0
jaraco.functools==4.0.1
jedi==0.19.1
Jinja2==3.1.3
jiter==0.4.0
jmespath==0.10.0
jsonschema==4.22.0
jsonschema-specifications==2023.12.1
kiwisolver==1.4.5
langid==1.1.6
lazy_loader==0.4
lief==0.14.1
linkai==0.0.6.0
lmdb==1.4.1
loguru==0.7.2
lxml==5.2.2
markdown-it-py==3.0.0
MarkupSafe==2.1.5
matplotlib==3.9.0
matplotlib-inline==0.1.7
mdurl==0.1.2
modelscope==1.13.1
more-itertools==10.2.0
moviepy==1.0.3
mpmath==1.3.0
multidict==6.0.5
multiprocess==0.70.16
networkx==3.2.1
nodeenv==1.8.0
Nuitka==2.1.2
numpy==1.24.2
omegaconf==2.3.0
onnxruntime==1.17.1
openai==0.27.8
opencv-contrib-python==4.6.0.66
opencv-python==4.6.0.66
opencv-python-headless==4.9.0.80
openpyxl==3.1.2
opt-einsum==3.3.0
optionaldict==0.1.2
ordered-set==4.1.0
orjson==3.10.3
oss2==2.18.4
packaging==24.0
paddleocr==2.7.3
paddlepaddle==2.6.1
pandas==2.2.1
parso==0.8.4
pdf2docx==0.5.8
pefile==2023.2.7
peft==0.7.1
piexif==1.1.3
pillow==10.3.0
platformdirs==4.2.0
pre-commit==3.7.1
premailer==3.10.0
proglog==0.1.10
prompt-toolkit==3.0.43
proto-plus==1.23.0
protobuf==3.20.2
psutil==5.9.8
pure-eval==0.2.2
pyarrow==15.0.1
pyarrow-hotfix==0.6
pyasn1==0.6.0
pyasn1_modules==0.4.0
pyclipper==1.3.0.post5
pycparser==2.21
pycryptodome==3.20.0
pydantic==2.5.3
pydantic_core==2.14.6
pydub==0.25.1
Pygments==2.18.0
pyinstaller==6.5.0
pyinstaller-hooks-contrib==2024.3
PyJWT==2.8.0
PyMuPDF==1.24.5
PyMuPDFb==1.24.3
pyOpenSSL==24.1.0
pyoxidizer==0.24.0
pyparsing==3.1.2
pypiwin32==223
pypng==0.20220715.0
PyQRCode==1.2.1
pyreadline3==3.4.1
pytesseract==0.3.10
python-dateutil==2.9.0.post0
python-docx==1.1.2
python-dotenv==1.0.1
python-engineio==4.9.1
python-multipart==0.0.9
python-socketio==5.7.2
pyttsx3==2.90
pytz==2024.1
pywin32==306
pywin32-ctypes==0.2.2
PyYAML==6.0.1
qrcode==7.4.2
rapidfuzz==3.9.3
rarfile==4.2
referencing==0.35.1
regex==2024.5.15
requests==2.31.0
rich==13.7.1
rpds-py==0.18.1
rsa==4.9
ruff==0.4.7
safetensors==0.4.3
scenedetect==0.6.3
scikit-image==0.23.2
scipy==1.12.0
semantic-version==2.10.0
sgmllib3k==1.0.0
shapely==2.0.4
shellingham==1.5.4
simple-websocket==1.0.0
simplejson==3.19.2
six==1.16.0
sniffio==1.3.1
sortedcontainers==2.4.0
soupsieve==2.5
SpeechRecognition==3.10.4
stack-data==0.6.3
starlette==0.32.0.post1
sympy==1.12
tenacity==8.2.3
termcolor==2.4.0
tifffile==2024.5.22
tiktoken==0.4.0
timm==1.0.3
tokenizers==0.19.1
tomli==2.0.1
tomlkit==0.12.0
toolz==0.12.1
torch==2.1.2+cu118
torchvision==0.16.2+cu118
tqdm==4.66.2
traitlets==5.14.3
transformers==4.41.2
typer==0.12.3
typer-config==1.4.0
typing_extensions==4.10.0
tzdata==2024.1
tzlocal==5.2
ujson==5.9.0
uritemplate==4.1.1
urllib3==2.2.1
utility==1.0
uvicorn==0.29.0
virtualenv==20.26.2
visualdl==2.5.3
watchfiles==0.21.0
wcwidth==0.2.13
web.py==0.62
websocket-client==1.2.0
websockets==11.0.3
wechatpy==1.8.18
Werkzeug==3.0.3
wikipedia==1.4.0
win32-setctime==1.1.0
wolframalpha==5.0.0
wsproto==1.2.0
xlrd==2.0.1
xmltodict==0.13.0
xxhash==3.4.1
yacs==0.1.8
yapf==0.40.2
yarl==1.9.4
zhipuai==2.1.0.20240521
zipp==3.18.1
zstandard==0.22.0

View File

@ -87,15 +87,7 @@ export class DiscordAPI {
if (typeof res_data == "string") {
res_data = JSON.parse(res_data);
}
if (res_data && res_data.code != 1) {
if (res_data.message) {
throw new Error(res_data.message);
} else if (res_data.description) {
throw new Error(res_data.description)
} else {
throw new Error("未知错误,可联系管理员排查");
}
}
// 直接返回,错误信息外面判断
return res_data;
} catch (error) {
throw error;

View File

@ -6,6 +6,7 @@ export const DEFINE_STRING = {
GET_DEFINE_CONFIG_JSON_BY_PROPERTY: "GET_DEFINE_CONFIG_JSON_BY_PROPERTY",
GET_IMAGE_GENERATE_CATEGORY: "GET_IMAGE_GENERATE_CATEGORY",
SHOW_MAIN_NOTIFICATION: "SHOW_MAIN_NOTIFICATION",
SHOW_GLOABAL_MESSAGE: "SHOW_GLOABAL_MESSAGE",
CHECK_MACHINE_ID: "CHECK_MACHINE_ID",
GET_CUSTOMIZE_GPT_PROMPT: "GET_CUSTOMIZE_GPT_PROMPT",
GENERATE_GPT_EXAMPLE_OUT: "GENERATE_GPT_EXAMPLE_OUT",
@ -159,7 +160,9 @@ export const DEFINE_STRING = {
GET_GENERATED_MJ_IMAGE_AND_SPLIT: "GET_GENERATED_MJ_IMAGE_AND_SPLIT",
DOWNLOAD_IMAGE_URL_AND_SPLIT: "DOWNLOAD_IMAGE_URL_AND_SPLIT",
GET_MJ_IMAGE_SCALE: 'GET_MJ_IMAGE_SCALE',
GET_MJ_IMAGE_ROBOT_MODEL: "GET_MJ_IMAGE_ROBOT_MODEL"
GET_MJ_IMAGE_ROBOT_MODEL: "GET_MJ_IMAGE_ROBOT_MODEL",
MACTH_USER_RETURN: "MACTH_USER_RETURN",
AUTO_MATCH_USER: "AUTO_MATCH_USER",
},
DISCORD: {
OPERATE_REFRASH_DISCORD_URL: "OPERATE_REFRASH_DISCORD_URL",
@ -188,5 +191,15 @@ export const DEFINE_STRING = {
},
SYSTEM: {
OPEN_FILE: "OPEN_FILE",
},
SETTING: {
GET_DATA_BY_TYPE_AND_PROPERTY: "GET_DATA_BY_TYPE_AND_PROPERTY",
SAVE_DATA_BY_TYPE_AND_PROPERTY: "SAVE_DATA_BY_TYPE_AND_PROPERTY",
DELETE_DATA_BY_TYPE_AND_PROPERTY: "DELETE_DATA_BY_TYPE_AND_PROPERTY",
},
PROMPT: {
GET_SORT_OPTIONS: "GET_SORT_OPTIONS",
SAVE_PROMPT_SORT_DATA: "SAVE_PROMPT_SORT_DATA",
GET_PROMPT_SORT_DATA: "GET_PROMPT_SORT_DATA"
}
}

View File

@ -1,3 +1,15 @@
export const LOGGER_DEFINE = {
REMOVE_WATERMARK: "去除水印",
ORIGINAL_AUTO_MATCH_USER: "原创自动匹配用户",
PROMPT: {
GET_PROMPT_SORT_OPTIONS: "获取所有的排序选项",
SAVE_PROMPT_SORT_DATA: "保存提示词排序的数据",
GET_PROMPT_SORT_DATA: "获取提示词排序的数据"
},
GLOBAL: {
PARAM_ERROR: "参数错误",
}
}

View File

@ -2,6 +2,7 @@
let fspromises = require('fs').promises;
import { get, cloneDeep } from 'lodash';
import { define } from '../define';
import { errorMessage } from '../../main/generalTools';
export class DynamicSetting {
constructor(global) {
@ -114,6 +115,71 @@ export class DynamicSetting {
throw error;
}
}
}
// 初始化一个对象
let dynamic = new DynamicSetting(global);
/**
* 将传入的数据和当前的数据进行拼接返回判断类型
* @param {*} value
*/
export async function GetDataByTypeAndProperty(value) {
try {
// 判断value的类型是不是string
if (typeof value == "string") {
value = JSON.parse(value);
}
// 判断必要的数据是不是存在
if (!value.mainType || !value.property) {
throw new Error("传入的数据不完整");
}
value.defaultData = value.defaultData ? value.defaultData : [];
let res = await dynamic.getDataByTypeAndProperty('dynamic', value.mainType, value.property, [], []);
return res;
} catch (error) {
return errorMessage(error.toString());
}
}
/**
* 保存数据注意这里不能传递回调函数
* @param {*} value
*/
export async function SaveDataByTypeAndProperty(value) {
try {
if (typeof value == "string") {
value = JSON.parse(value);
}
// 判断必要的数据是不是存在
if (!value.mainType || !value.property || !value.data) {
throw new Error("传入的数据不完整");
}
let res = await dynamic.saveDataByTypeAndProperty(value.data, value.mainType, value.property, null);
return res;
} catch (error) {
return errorMessage(error.toString());
}
}
/**
* 删除数据
* @param {*} value
*/
export async function DeleteDataByTypeAndProperty(value) {
try {
if (typeof value == "string") {
value = JSON.parse(value);
}
// 判断必要的数据是不是存在
if (!value.id || !value.mainType || !value.property) {
throw new Error("传入的数据不完整");
}
let res = await dynamic.deleteDataByTypeAndProperty(value.id, value.mainType, value.property);
return res;
} catch (error) {
return errorMessage(error.toString());
}
}

View File

@ -214,8 +214,8 @@ export const ImageSetting = {
* @param {*} value
* 0 define中的指定属性指定的配置文件
* 1 要获取的什么属性信息 propertyproperty 为null赶回当前配置文件的所有数据
* 2 是不是要校验属性不存在
* 3 属性没有找到的默认值
* 2 要写入的值
* 3 是不是要校验属性不存在
*/
async SaveDefineConfigJsonByProperty(value) {
try {

View File

@ -0,0 +1,32 @@
import { PromptIpc } from "./promptIpc"
import { SettingIpc } from './settingIpc.js'
import { ImageGenerateIpc } from './imageGenerateIpc.js'
import { WritingIpc } from './writingIpc.js'
import { VideoGenerateIpc } from './videoGenerateIpc'
import { TranslateIpc } from './translateIpc.js'
import { GptIpc } from './gptIpc.js'
import { MjIpc } from './mjIpc.js'
import { OriginalImageGenerateIpc } from './originalImageGenerateIpc'
import { SdIpc } from './sdIpc.js'
import { MainIpc } from './mainIpc.js'
import { GlobalIpc } from "./globalIpc.js";
import { ImageIpc } from "./imageIpc.js";
import { SystemIpc } from "./system.js";
export function RegisterIpc(createWindow) {
PromptIpc()
SettingIpc();
ImageGenerateIpc();
WritingIpc();
VideoGenerateIpc();
TranslateIpc();
GptIpc();
SdIpc();
MjIpc();
MainIpc(createWindow);
OriginalImageGenerateIpc();
GlobalIpc();
ImageIpc();
SystemIpc();
}

View File

@ -63,6 +63,9 @@ function MjIpc() {
// 获取所有的MJ生图模型
ipcMain.handle(DEFINE_STRING.MJ.GET_MJ_IMAGE_ROBOT_MODEL, async (event) => await mjSimple.GetMJImageRobotModel());
// 自动匹配用户表标签
ipcMain.handle(DEFINE_STRING.MJ.AUTO_MATCH_USER, async (event, value) => await mJOriginalImageGenerate.AutoMatchUser(value));
/**
* 监听DISCORD界面创建消息并修改数据
*/

View File

@ -0,0 +1,18 @@
import { ipcMain } from "electron";
import { DEFINE_STRING } from '../../define/define_string'
import { Prompt } from "../Public/Prompt";
let prompt = new Prompt();
function PromptIpc() {
// 获取所有的排序选项
ipcMain.handle(DEFINE_STRING.PROMPT.GET_SORT_OPTIONS, (event) => prompt.GetPromptSortOptions());
// 保存提示词排序数据
ipcMain.handle(DEFINE_STRING.PROMPT.SAVE_PROMPT_SORT_DATA, (event, value) => prompt.SavePromptSort(value));
// 获取已经保存的提示词数据
ipcMain.handle(DEFINE_STRING.PROMPT.GET_PROMPT_SORT_DATA, (event) => prompt.GetPromptSort())
}
export {
PromptIpc
}

View File

@ -2,11 +2,13 @@ const {
ipcMain, app
} = require("electron")
import { DEFINE_STRING } from '../../define/define_string'
import { GetDataByTypeAndProperty, SaveDataByTypeAndProperty, DeleteDataByTypeAndProperty } from '../../define/setting/dynamicSetting';
import {
Setting
} from '../setting/setting'
let setting = new Setting(global);
async function SettingIpc() {
// 获取背景音乐配置列表
@ -65,6 +67,21 @@ async function SettingIpc() {
// // 保存指定的配置文件里面指定的属性的数据
ipcMain.handle(DEFINE_STRING.SAVE_DEFINE_CONFIG_JSON_BY_PROPERTY, async (event, value) => await setting.SaveDefineConfigJsonByProperty(value))
//#region 动态设置(只是动态设置)
// 获取动态配置的的指定主分类指定的属性的数据只是获取动态的type定死了dynamic
ipcMain.handle(DEFINE_STRING.SETTING.GET_DATA_BY_TYPE_AND_PROPERTY, async (event, value) => await GetDataByTypeAndProperty(value));
// 保存动态配置的的指定主分类,指定的属性的数据
ipcMain.handle(DEFINE_STRING.SETTING.SAVE_DATA_BY_TYPE_AND_PROPERTY, async (event, value) => await SaveDataByTypeAndProperty(value));
// 删除动态配置的的指定主分类,指定的属性的数据
ipcMain.handle(DEFINE_STRING.SETTING.DELETE_DATA_BY_TYPE_AND_PROPERTY, async (event, value) => await DeleteDataByTypeAndProperty(value));
//#endregion
}
export {

View File

@ -8,11 +8,14 @@ import { Tools } from "../tools";
import path from 'path'
import sharp from 'sharp'
import { define } from "../../define/define";
import { AwesomeRegx } from "awesome-js";
import { AwesomeHelp } from "awesome-js";
import { checkStringValueAddSuffix, errorMessage, successMessage } from "../generalTools";
import { ImageSetting } from "../../define/setting/imageSetting";
import { DiscordAPI } from "../../api/discordApi";
import { GPT } from "../Public/GPT";
import { TagDefine } from "../../define/tagDefine";
import { cloneDeep } from "lodash";
import { LOGGER_DEFINE } from "../../define/logger_define";
const { v4: uuidv4 } = require('uuid');
/**
@ -26,15 +29,122 @@ export class MJOriginalImageGenerate {
this.tools = new Tools();
this.discordAPI = new DiscordAPI();
this.gpt = new GPT(global);
this.tagDefine = new TagDefine(global);
}
/**
* 返回指定的人物到前端
* @param {*} data
*/
sendChangeMessage(data) {
this.global.newWindow[0].win.webContents.send(DEFINE_STRING.DISCORD.MAIN_DISCORD_MESSAGE_CHANGE, data);
sendChangeMessage(data, message_name = DEFINE_STRING.DISCORD.MAIN_DISCORD_MESSAGE_CHANGE) {
this.global.newWindow[0].win.webContents.send(message_name, data);
}
/**
* 通过文本自动匹配数据
* @param {*} value
*/
async AutoMatchUser(value) {
try {
value = JSON.parse(value);
// 获取所有的角色数据,包括别名
// 获取所有的角色数据
let character_tags = await this.tagDefine.getTagDataByTypeAndProperty("dynamic", "character_tags");
if (character_tags.code == 0) {
return errorMessage("获取角色数据错误,错误信息如下:" + character_tags.message, LOGGER_DEFINE.ORIGINAL_AUTO_MATCH_USER)
}
character_tags = character_tags.data;
if (character_tags.length == 0) {
return errorMessage("请先添加角色数据", LOGGER_DEFINE.ORIGINAL_AUTO_MATCH_USER)
}
let character_tags_data = [];
for (let i = 0; i < character_tags.length; i++) {
let item = character_tags[i];
// 这边还要判断是不是显示只有显示的才hi自动匹配
if (!item.hasOwnProperty("isShow") || !item.isShow) {
continue;
}
let temp_name = [item.label];
// 判断当前的数是不是存在别名
if (item.children && item.children.length > 0) {
for (let j = 0; j < item.children.length; j++) {
const element = item.children[j];
temp_name.push(element.label);
}
}
character_tags_data.push({
key: item.key,
value: item.value,
names: temp_name
})
}
if (character_tags_data.length == 0) {
return errorMessage("当前没有显示的角色数据,请先选择哪些是要显示的角色数据", LOGGER_DEFINE.ORIGINAL_AUTO_MATCH_USER)
}
for (let i = 0; i < value.length; i++) {
const element = value[i];
let res_data = {
code: 1,
id: element.id, // 当前 data 的ID
match_character: [],
}
// 获取当前的字幕数据
let temp_sub = [];
for (let j = 0; element.suValue && j < element.suValue.length; j++) {
const element = array[j];
temp_sub.push(element.srt_value);
}
let word = "";
if (temp_sub.length == 0) {
word = element.after_gpt;
} else {
word = temp_sub.join(",");
}
let match_keys = [];
// 开始循环判断,只要又一个满足就跳出新婚换
for (let j = 0; j < character_tags_data.length; j++) {
const item = character_tags_data[j];
let names = AwesomeHelp.makeSensitiveMap(item.names);
// 开始判断
let name_res = AwesomeHelp.checkSensitiveWord(word, false, names);
if (name_res.size > 0) {
match_keys.push(item.key);
}
}
// 判断是不是又匹配到的数据
if (match_keys.length > 0) {
// 进行数据的处理通过对应的key获取对应的数据将所有的数进行返回
for (let i = 0; i < match_keys.length; i++) {
const item = match_keys[i];
let index = character_tags.findIndex(x => x.key == item);
if (index == -1) {
continue;
}
let temp_item_data = cloneDeep(character_tags[index]);
if (temp_item_data.children) {
delete temp_item_data.children
}
res_data.match_character.push(temp_item_data)
}
}
// 开始往前端传递数据
this.sendChangeMessage(res_data, DEFINE_STRING.MJ.MACTH_USER_RETURN);
}
return successMessage(null, "人物标签自动匹配完成", LOGGER_DEFINE.ORIGINAL_AUTO_MATCH_USER)
} catch (error) {
return errorMessage("通过文本自动匹配数据错误,错误信息如下:" + error.message, LOGGER_DEFINE.ORIGINAL_AUTO_MATCH_USER)
}
}
/**
* 初始化MJ设置
*/
@ -290,6 +400,11 @@ export class MJOriginalImageGenerate {
"Authorization": mjSetting.api_key
}
res = await this.discordAPI.mjApiImagine(imagine_url, data, headers);
if (res.code == 24) {
throw new Error("提示词包含敏感词,请修改后重试");
}
} else if (imagine_url.includes("api.ephone.ai")) {
// ePhoneAPI
let headers = {
@ -306,6 +421,15 @@ export class MJOriginalImageGenerate {
}
res = await this.discordAPI.mjApiImagine(imagine_url, data, headers);
}
// 错误检查
if (res.code == 23) {
throw new Error("生图队列已满,请稍后尝试");
}
if (res.code != 1 && res.code != 22) {
throw new Error("未知错误,可联系管理员排查" + res.description);
}
// 创建成功,开始下一个
this.sendChangeMessage({
code: 1,
@ -406,7 +530,6 @@ export class MJOriginalImageGenerate {
}
let style_ids = await this.pm.GetConfigJson(JSON.stringify(["image_style", []]), false);
let image_styles = await ImageStyleDefine.getImageStyleStringByIds(style_ids.data);
// 替换风格的逻辑
let current_task = null;
@ -419,7 +542,7 @@ export class MJOriginalImageGenerate {
// 拼接提示词
// 图生图的链接
// 获取风格词 + 命令后缀
let prompt = " " + image_styles + old_prompt + (mjSetting.image_suffix ? mjSetting.image_suffix : "");
let prompt = old_prompt + (mjSetting.image_suffix ? mjSetting.image_suffix : "");
// 判断当前生图模式
let request_model = mjSetting.request_model

View File

@ -62,13 +62,12 @@ export class OriginalImageGenerate {
let seed = sd_setting.setting.seed;
let style_ids = await this.pm.GetConfigJson(JSON.stringify(["image_style", []]), false);
let image_styles = await ImageStyleDefine.getImageStyleStringByIds(style_ids.data);
for (let i = 0; i < data.length; i++) {
const element = data[i];
let adetailer = element.adetailer;
let imageJson = JSON.parse(await fspromises.readFile(path.normalize(element.prompt_json), 'utf-8'));
let prompt = sd_setting.webui.prompt + image_styles + ',' + element.prompt;
let prompt = sd_setting.webui.prompt + ',' + element.prompt;
// 添加前缀
if (prefix_prompt) {
prompt = prefix_prompt + ',' + prompt;

View File

@ -3,7 +3,7 @@ import path, { resolve } from "path";
import { Tools } from "../tools";
import fs from "fs";
import { ImageSetting } from "../../define/setting/imageSetting";
import { isEmpty, reject } from "lodash";
import { isEmpty } from "lodash";
import { basicApi } from "../../api/apiBasic";
import sharp from 'sharp';
import { file, image } from "../../define/Tools";

82
src/main/Public/Prompt.js Normal file
View File

@ -0,0 +1,82 @@
import { errorMessage, successMessage } from "../generalTools";
import { LOGGER_DEFINE } from '../../define/logger_define'
import { Setting } from "../setting/setting";
export class Prompt {
constructor() {
this.setting = new Setting(global);
}
/**
* 获取所有的排序选项
*/
GetPromptSortOptions() {
return successMessage([
{
label: '人物',
value: 'character'
}, {
label: '场景',
value: 'scene'
}, {
label: '提示词',
value: 'prompt'
}, {
label: '风格',
value: 'style'
}
], null, LOGGER_DEFINE.PROMPT.GET_PROMPT_SORT_OPTIONS);
}
/**
* 保存SD排序的选项
* @param {*} value
*/
async SavePromptSort(value) {
try {
// 将当前数据保存
await this.setting.SaveDefineConfigJsonByProperty(JSON.stringify(['img_base', 'prompt_sort', value]));
return successMessage(null, "保存提示词排序顺序成功", LOGGER_DEFINE.PROMPT.SAVE_PROMPT_SORT_DATA);
} catch (error) {
return errorMessage(error.toString(), LOGGER_DEFINE.PROMPT.SAVE_PROMPT_SORT_DATA);
}
}
/**
* 获取当前的
*/
async GetPromptSort() {
try {
let res = await this.setting.GetDefineConfigJsonByProperty(JSON.stringify(['img_base', 'prompt_sort', false, []]))
if (res.code == 0) {
throw new Error(res.message);
}
res = res.data;
if (res && res.length == 0) {
res = [
{
label: '风格',
value: 'style'
},
{
label: '人物',
value: 'character'
},
{
label: '场景',
value: 'scene'
},
{
label: '提示词',
value: 'prompt'
}
]
}
return successMessage(res, "获取数据成功", LOGGER_DEFINE.PROMPT.GET_PROMPT_SORT_DATA)
} catch (error) {
return errorMessage(error.toString(), LOGGER_DEFINE.PROMPT.GET_PROMPT_SORT_DATA)
}
}
}

View File

@ -110,7 +110,7 @@ export class SD {
return successMessage(data);
} catch (error) {
return errorMessage("加载数据失败,错误信息如下:" +error.toString());
return errorMessage("加载数据失败,错误信息如下:" + error.toString());
}
}

View File

@ -13,6 +13,8 @@ const execAsync = util.promisify(exec);
const { v4: uuidv4 } = require('uuid'); // 引入UUID库来生成唯一标识符
let fspromises = require("fs").promises;
import { ImageSetting } from "../../define/setting/imageSetting";
import { errorMessage } from "../generalTools";
import { LOGGER_DEFINE } from "../../define/logger_define";
export class ImageGenerate {
@ -339,7 +341,7 @@ export class ImageGenerate {
// 监听总批次完成
this.global.requestQuene.setBatchCompletionCallback(batch, (failedTasks) => {
debugger
if (failedTasks.length > 0) {
let message = `
批次生成任务都已完成
@ -489,16 +491,10 @@ export class ImageGenerate {
}
else {
return {
code: 0,
message: "参数错误"
}
return errorMessage("参数错误", LOGGER_DEFINE.GLOBAL.PARAM_ERROR)
}
} catch (error) {
return {
code: 0,
message: error.toString()
}
return errorMessage(error.toString(), "imageGenerate_DownloadImageFile");
}
}
}

View File

@ -364,8 +364,12 @@ export class VideoGenerate {
await fspromises.writeFile(project_config_path, JSON.stringify(obj));
// let task_list = JSON.parse(await fspromises.readFile(path.join(this.global.config.project_path,'scripts/task_')));
let scriptPath = path.join(define.scripts_path, 'Lai.exe');
let gpu = this.global.gpu.type;
if (video_config.libx264) {
gpu = "OTHER"
}
// 执行生成图片的脚本
let script = `cd "${define.scripts_path}" && "${scriptPath}" -c "${project_config_path.replaceAll('\\', '/')}" "${this.global.gpu.type}"`;
let script = `cd "${define.scripts_path}" && "${scriptPath}" -c "${project_config_path.replaceAll('\\', '/')}" "${gpu}"`;
const output = await execAsync(script, { maxBuffer: 1024 * 1024 * 10, encoding: 'utf-8' });
if (output.stderr != '') {
obj.status = "video_error";

View File

@ -382,7 +382,7 @@ function startObserving() {
if (window.observer) {
return;
}
debugger
// 没有开始监听
MutationObserverElement();
console.log("开始监听")

View File

@ -507,7 +507,7 @@ export class DiscordSimple {
if (window.observer) {
return;
}
debugger
// 没有开始监听
MutationObserverElement();
console.log("开始监听")

View File

@ -1052,7 +1052,13 @@ async function StartStoryboarding(value) {
global.newWindow[0].win.webContents.send(DEFINE_STRING.GET_FRAME_RETUN, { code: 1, data: "正在调用进程。请勿关闭程序" })
let cc = `${path.join(define.scripts_path, 'Lai.exe')}`;
let child = spawn(cc, ["-a", value.video_path, frame_path, input_path, value.sensitivity, global.gpu.type], { encoding: 'utf-8' });
// 获取生成视频设置
let video_config = JSON.parse(await fspromises.readFile(define.video_config, 'utf-8'));
let gpu = global.gpu.type;
if (video_config.libx264) {
gpu = "OTHER";
}
let child = spawn(cc, ["-a", value.video_path, frame_path, input_path, value.sensitivity, gpu], { encoding: 'utf-8' });
child.on('error', console.error)
child.stdout.on('data', (data) => {
console.log(data.toString());

View File

@ -72,8 +72,8 @@ function checkStringValueDeletePrefix(value, prefix) {
* @returns
*/
function successMessage(data, message = null, service = null) {
if (service && message) {
global.logger.info(service, `成功返回数据`);
if (service) {
global.logger.info(service, message ? message : '成功返回数据');
}
return {
code: 1,
@ -89,8 +89,8 @@ function successMessage(data, message = null, service = null) {
* @returns
*/
function errorMessage(message, service = null) {
if (service && message) {
global.logger.error(service, message);
if (service) {
global.logger.error(service, message ? message : '未知报错,没有捕获的错误');
}
return {
code: 0,

View File

@ -18,22 +18,9 @@ import { Setting } from './setting/setting.js'
import { has, isEmpty } from 'lodash'
// ipc
import { SettingIpc } from './IPCEvent/settingIpc.js'
import { ImageGenerateIpc } from './IPCEvent/imageGenerateIpc.js'
import { WritingIpc } from './IPCEvent/writingIpc.js'
import { VideoGenerateIpc } from './IPCEvent/videoGenerateIpc'
import { TranslateIpc } from './IPCEvent/translateIpc.js'
import { GptIpc } from './IPCEvent/gptIpc.js'
import { MjIpc } from './IPCEvent/mjIpc.js'
import { OriginalImageGenerateIpc } from './IPCEvent/originalImageGenerateIpc'
import { SdIpc } from './IPCEvent/sdIpc.js'
import { DiscordIpc, RemoveDiscordIpc } from './IPCEvent/discordIpc.js'
import { MainIpc } from './IPCEvent/mainIpc.js'
import { GlobalIpc } from "./IPCEvent/globalIpc.js";
import { ImageIpc } from "./IPCEvent/imageIpc.js";
import { SystemIpc } from "./IPCEvent/system.js";
import { system } from "systeminformation";
import { Logger } from "./logger.js";
import { RegisterIpc } from "./IPCEvent/index.js";
let tools = new Tools();
let imageGenerate = new ImageGenerate(global);
@ -226,20 +213,7 @@ app.on('window-all-closed', () => {
}
})
SettingIpc();
ImageGenerateIpc();
WritingIpc();
VideoGenerateIpc();
TranslateIpc();
GptIpc();
SdIpc();
MjIpc();
MainIpc(createWindow);
OriginalImageGenerateIpc();
GlobalIpc();
ImageIpc();
SystemIpc();
RegisterIpc(createWindow);
ipcMain.handle('dark-mode:toggle', (event, value) => {

View File

@ -317,7 +317,11 @@ export class Setting {
/**
* 获取指定的配置文件里面指定的属性的数据
* @param {*} value
* @param {*} value 执行方法必要的信息
* 0 define中的指定属性指定的配置文件
* 1 要获取的什么属性信息 propertyproperty 为null赶回当前配置文件的所有数据
* 2 是不是要校验属性不存在
* 3 属性没有找到的默认值
*/
async GetDefineConfigJsonByProperty(value) {
return ImageSetting.GetDefineConfigJsonByProperty(value);
@ -326,6 +330,11 @@ export class Setting {
/**
* 保存指定的配置文件里面指定的属性的数据
* @param {*} value
* 0 define中的指定属性指定的配置文件
* 1 要获取的什么属性信息 propertyproperty 为null赶回当前配置文件的所有数据
* 2 要写入的值
* 3 是不是要校验属性不存在
*/
async SaveDefineConfigJsonByProperty(value) {
return ImageSetting.SaveDefineConfigJsonByProperty(value);

View File

@ -6,6 +6,8 @@ import { mj } from './mj.js';
import { sd } from './sd.js';
import { img } from './img.js';
import { system } from './system.js';
import { setting } from './setting.js'
import { prompt } from './prompt.js';
// Custom APIs for renderer
let events = [];
@ -395,19 +397,23 @@ const api = {
// 打开全局通知框
showGlobalNotificationDialog: (value) => ipcRenderer.send(DEFINE_STRING.SHOW_MAIN_NOTIFICATION, value),
// 打开全局的消息框
showGlobalMessage: (value) => ipcRenderer.send(DEFINE_STRING.SHOW_GLOABAL_MESSAGE, value),
// 知道文件地址获取文件base64编码
GetFileBase64: async (value, callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.GET_FILE_BASE64, value)),
// 打开调试控制台
OpenDevTools: () => ipcRenderer.send(DEFINE_STRING.OPEN_DEV_TOOLS),
// 打开调试控制台密码
OpenDevToolsPassword: async (value, callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.OPEN_DEV_TOOLS_PASSWORD, value)),
}
// Use `contextBridge` APIs to expose Electron APIs to
// renderer only if context isolation is enabled, otherwise
// just add to the DOM global.
if (process.contextIsolated) {
try {
contextBridge.exposeInMainWorld('electron', electronAPI)
contextBridge.exposeInMainWorld('api', api)
contextBridge.exposeInMainWorld('mj', mj)
@ -415,6 +421,8 @@ if (process.contextIsolated) {
contextBridge.exposeInMainWorld("sd", sd)
contextBridge.exposeInMainWorld("img", img)
contextBridge.exposeInMainWorld("system", system)
contextBridge.exposeInMainWorld("setting", setting)
contextBridge.exposeInMainWorld("pmpt", prompt)
contextBridge.exposeInMainWorld('darkMode', {
toggle: (value) => ipcRenderer.invoke('dark-mode:toggle', value),
})
@ -429,5 +437,7 @@ if (process.contextIsolated) {
window.sd = sd;
window.img = img;
window.system = system;
window.setting = setting;
window.pmpt = prompt;
}

View File

@ -47,6 +47,9 @@ const mj = {
// 获取所有的MJ生图模型
GetMJImageRobotModel: async (callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.MJ.GET_MJ_IMAGE_ROBOT_MODEL)),
// 自动匹配用户
AutoMatchUser: async (value, callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.MJ.AUTO_MATCH_USER, value)),
}
export {

17
src/preload/prompt.js Normal file
View File

@ -0,0 +1,17 @@
import { ipcRenderer } from "electron"
import { DEFINE_STRING } from "../define/define_string"
const prompt = {
// 获取所有的排序选项
GetPromptSortOptions: async (callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.PROMPT.GET_SORT_OPTIONS)),
// 保存提示词排序数据
SavePromptSort: async (value, callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.PROMPT.SAVE_PROMPT_SORT_DATA, value)),
// 获取提示词排序数据
GetPromptSort: async (callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.PROMPT.GET_PROMPT_SORT_DATA))
}
export {
prompt
}

17
src/preload/setting.js Normal file
View File

@ -0,0 +1,17 @@
import { ipcRenderer } from "electron"
import { DEFINE_STRING } from "../define/define_string"
const setting = {
// 获取动态配置的的指定主分类指定的属性的数据只是获取动态的type定死了dynamic
GetDataByTypeAndProperty: async (value, callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.SETTING.GET_DATA_BY_TYPE_AND_PROPERTY, value)),
// 保存动态配置的的指定主分类,指定的属性的数据
SaveDataByTypeAndProperty: async (value, callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.SETTING.SAVE_DATA_BY_TYPE_AND_PROPERTY, value)),
// 删除动态配置的的指定主分类,指定的属性的数据
DeleteDataByTypeAndProperty: async (value, callback) => callback(await ipcRenderer.invoke(DEFINE_STRING.SETTING.DELETE_DATA_BY_TYPE_AND_PROPERTY, value)),
}
export {
setting
}

View File

@ -43,7 +43,7 @@ export default defineComponent({
javascript,
hljs,
darkTheme,
themeData,
themeData
}
}
})

View File

@ -167,7 +167,7 @@ export default defineComponent({
* 另存图片的方法
*/
async function SaveImage() {
debugger
if (isEmpty(save_setting.value.save_folder)) {
message.error("请选择手动保存的文件夹")
return

View File

@ -265,7 +265,7 @@ export default defineComponent({
//
// 稿
await window.api.GetProjectWord((value) => {
debugger
data.value = value.data
})
@ -358,7 +358,7 @@ export default defineComponent({
let itemIndex = row.subValue.findIndex((item) => item.id == itemId)
let thisIndex = data.value.findIndex((item) => item.id == row.id)
if (itemIndex < 0 && isM) {
debugger
message.error('数据错误')
return
} else {

View File

@ -175,7 +175,7 @@ export default defineComponent({
*/
async function GetVideoFile() {
await window.api.SelectFile(['mp4'], (value) => {
debugger
if (value.code == 0) {
message.error(value.message)
return
@ -193,7 +193,7 @@ export default defineComponent({
message.error('选择分镜的视频地址')
return
}
debugger
if (
toRaw(frameValue.value)
.video_path.split('.')

View File

@ -244,14 +244,14 @@ export default defineComponent({
// -
await window.api.GetGenerateTaskList((value) => {
debugger
console.log(value)
data.value = value.data.task_list
})
//
window.api.setEventListen([DEFINE_STRING.VIDEO_GENERATE_STATUS_REFRESH], (value) => {
debugger
console.log(value)
let index = data.value.findIndex((item) => item.id == value.id)
if (index < 0) {
@ -272,7 +272,7 @@ export default defineComponent({
async function AutoConditionCheck(e) {
e.preventDefault()
configRef.value?.validate(async (errors) => {
debugger
if (errors) {
message.error('请检查必填字段')
return
@ -301,7 +301,7 @@ export default defineComponent({
async function ActionTask(e) {
e.preventDefault()
configRef.value?.validate(async (errors) => {
debugger
console.log(selectRowKeysRef.value)
if (selectRowKeysRef.value.length <= 0) {
message.error('请选择要操作的任务')

View File

@ -84,7 +84,7 @@ export default defineComponent({
*/
async function DeleteBadPrompt() {
await window.api.DeleteBadPrompt((value) => {
debugger
console.log(value)
if (value.code == 0) {
message.error(value.message)

View File

@ -128,7 +128,7 @@ export default defineComponent({
{
trigger: 'hover',
disabled: (() => {
debugger
if (row.status == 'error') {
return false
} else {
@ -246,7 +246,7 @@ export default defineComponent({
)
}
await window.api.GetConfigJson(JSON.stringify(['image_style', []]), async (value) => {
debugger
if (value.code == 0) {
message.error(value.message)
return
@ -266,7 +266,7 @@ export default defineComponent({
//
window.api.setEventListen([DEFINE_STRING.IMAGE_TASK_STATUS_REFRESH], (value) => {
debugger
console.log(value)
//
let index = task_list_data.value.findIndex((item) => item.out_folder == value.out_folder)
@ -295,7 +295,7 @@ export default defineComponent({
}
formValue.value.image_style_list = tmp_arr
await window.api.AddImageTask(toRaw(formValue.value), (value) => {
debugger
if (value.code == 0) {
message.error(value.message)
return
@ -364,7 +364,7 @@ export default defineComponent({
* 生成全部
*/
async function GenerateAllImage() {
debugger
// json
await window.api.AddWebuiJson(async (value) => {
console.log(value)
@ -407,7 +407,7 @@ export default defineComponent({
maskClosable: false,
onClose: async () => {
//
debugger
console.log(selectStyle.value)
let tmp_arr = []
for (let i = 0; i < selectStyle.value.length; i++) {
@ -446,7 +446,7 @@ export default defineComponent({
async function RemoveImageTask(row) {
//`${task_list.out_folder}_${images[0]}`, batch, task_list.out_folder
//
debugger
console.log(row)
await getInitData()
//

View File

@ -578,7 +578,7 @@ export default defineComponent({
//
window.api.setEventListen([DEFINE_STRING.VIDEO_GENERATE_STATUS_REFRESH], (value) => {
debugger;
console.log(value)
//
let index = data.value.findIndex(item => item.folder == value.out_folder);

View File

@ -26,7 +26,7 @@ export default defineComponent({
onMounted(() => {
window.api.setEventListen([DEFINE_STRING.GET_FRAME_RETUN], (value) => {
debugger;
code.value = code.value + "\n" + value.data;
})
})

View File

@ -77,7 +77,7 @@ export default defineComponent({
message.error("请输入分镜内容");
return;
}
debugger;
//
let text_value = inputValue.value.split("\n")
// 稿

View File

@ -0,0 +1,158 @@
<template>
<div style="margin-top: 20px">
<n-dynamic-tags
:type="tagType"
:color="tagColor"
v-model:value="showTags"
:max="max"
@update:value="TagUpdate"
>
<template #input="{ submit, deactivate }">
<n-select
size="small"
style="width: 100px"
v-model:value="selectedValue"
:options="show_options"
:placeholder="placeholder"
>
</n-select>
<n-button size="small" type="info" @click="AddDynamicTag(deactivate)"> 添加 </n-button>
</template>
<template #trigger="{ activate, disabled }">
<n-button
v-if="showTags.length != max"
size="small"
type="primary"
dashed
:disabled="disabled"
@click="activate()"
>
<template #icon>
<n-icon>
<Add />
</n-icon>
</template>
添加
</n-button>
<n-button v-if="showTags.length == max" type="info" size="small" @click="SaveMerge"
>保存</n-button
>
</template>
</n-dynamic-tags>
</div>
</template>
<script>
import { ref, onMounted, defineComponent, onUnmounted, toRaw, watch, toRefs } from 'vue'
import { useMessage, NDynamicTags, NButton, NIcon, NSelect, useDialog } from 'naive-ui'
import Add from '@vicons/ionicons5/Add'
export default defineComponent({
components: {
NDynamicTags,
NButton,
NIcon,
NSelect,
Add,
NButton
},
props: ['options', 'tagType', 'tagColor', 'initData', 'placeholder', 'SaveFunction', 'max'],
setup(props) {
let { options, tagType, tagColor, initData, placeholder, max } = toRefs(props)
let dialog = useDialog()
let message = useMessage()
let selectedValue = ref(null)
let tags = ref(initData.value ? initData.value : [])
let showTags = ref([])
let show_options = ref([])
onMounted(async () => {
tags.value.forEach((element) => {
showTags.value.push(element.label)
})
options.value.forEach((element) => {
show_options.value.push(element)
})
})
/**
* 添加选中的数据
*/
function AddDynamicTag(deactivate) {
//
if (selectedValue.value == null || selectedValue.value == '') {
message.error('请选择需要添加的标签')
deactivate()
return
}
//
console.log(selectedValue.value)
// options
let index = options.value.findIndex((item) => item.value == selectedValue.value)
if (index == -1) {
message.error('传入的数据中没有找到对应的数据')
return
}
tags.value.push(options.value[index])
showTags.value.push(options.value[index].label)
//
let show_index = show_options.value.findIndex((item) => item.value == selectedValue.value)
if (show_index == -1) {
message.error('传入的数据中没有找到对应的数据')
return
}
show_options.value.splice(show_index, 1)
//
selectedValue.value = null
if (tags.value.length == max.value) {
deactivate()
}
}
/**
* 在删除的时候更新数据
* @param value
*/
function TagUpdate(value) {
console.log(value)
show_options.value = []
tags.value = []
// show_options
options.value.forEach((item) => {
if (!showTags.value.includes(item.label)) {
show_options.value.push(item)
} else {
tags.value.push(item)
}
})
}
/**
* 保存合并提示词的排序顺序
*/
async function SaveMerge() {
//
await props.SaveFunction(toRaw(tags.value), toRaw(options.value))
}
return {
options,
tagType,
tagColor,
initData,
selectedValue,
AddDynamicTag,
tags,
showTags,
placeholder,
show_options,
TagUpdate,
SaveMerge,
max
}
}
})
</script>

View File

@ -158,7 +158,7 @@ export default defineComponent({
},
setup(props) {
let message = useMessage();
debugger;
let images = ref(
window.ImageInitData.filter((item) => item.id == window.currentImageId)[0]
.output_list
@ -232,7 +232,7 @@ export default defineComponent({
window.api.setEventListen(
[DEFINE_STRING.REGENERATE_IMAGE_RETUN, window.id],
(value) => {
debugger
if (value.type != 1) {
return;
}
@ -267,7 +267,7 @@ export default defineComponent({
* 重绘图片
*/
async function ReGenerateImage(data) {
debugger;
console.log(data);
let obj = {
id: data.id,
@ -305,7 +305,7 @@ export default defineComponent({
* 获取上一组
*/
function GetLast() {
debugger;
let index = window.ImageInitData.findIndex(
(item) => item.id == window.currentImageId
);
@ -322,7 +322,7 @@ export default defineComponent({
* 获取下一组
*/
function GetNext() {
debugger;
let index = window.ImageInitData.findIndex(
(item) => item.id === window.currentImageId
);

View File

@ -63,7 +63,7 @@ export default defineComponent({
* 删除
*/
async function handleClose(tag) {
debugger;
//
tags.value = tags.value.filter(item => item != tag);
show_tags.value = show_tags.value.filter(item => item != tag);
@ -94,7 +94,7 @@ export default defineComponent({
* 删除所选的tag全部
*/
async function DeleteTags() {
debugger
let d_l = toRaw(show_tags.value);
for (let i = 0; i < d_l.length; i++) {
const element = d_l[i];

View File

@ -79,7 +79,7 @@ export default defineComponent({
if (translateMode.value) {
//
await window.api.TranslateReturnNow([tags, 'zh', 'en', true], (value) => {
debugger
console.log(value)
if (value.code == 0) {
message.error(value.message);
@ -115,7 +115,7 @@ export default defineComponent({
* @param {要删除的tag} tag
*/
async function handleClose(tag) {
debugger
//
data.value.chinese_prompt = data.value.chinese_prompt.filter(item => item.src != tag.src);
ModifyPrompt();

View File

@ -176,7 +176,7 @@ export default defineComponent({
)
setLayoutHeight('layout_height')
await window.api.GetImageStyleMenu((value) => {
debugger
if (value.code == 0) {
message.error(value.message)
return
@ -197,7 +197,7 @@ export default defineComponent({
* 菜单选中事件
*/
async function SelectMenu(key, item) {
debugger
current_menu = key
await getStyleImageSubList()
}
@ -214,7 +214,7 @@ export default defineComponent({
style_image_list.value = tags.value.style_tags
} else {
await window.api.getStyleImageSubList(current_menu, (value) => {
debugger
console.log(value)
if (value.code == 0) {
message.error(value.message)
@ -232,7 +232,7 @@ export default defineComponent({
}
async function closeTag(image) {
debugger
let index = selectStyle.value.findIndex((item) => item.id == image.id)
if (index != -1) {
selectStyle.value.splice(index, 1)
@ -268,7 +268,7 @@ export default defineComponent({
handleSelect(key) {
showDropdownRef.value = false
if (key == 'selectStyle') {
debugger
//
if (current_img.value) {
selectStyle.value.push(current_img.value)

View File

@ -56,7 +56,7 @@ export default defineComponent({
onMounted(async () => {})
async function closeTag(image) {
debugger
let index = selectStyle.value.findIndex((item) => item.id == image.id)
if (index != -1) {
selectStyle.value.splice(index, 1)

View File

@ -108,13 +108,10 @@ export default defineComponent({
style: `width : ${dialogWidth}px; min-height : ${dialogHeight}px`,
maskClosable: false,
onClose: async () => {
debugger
//
let password = toRaw(key_down_ref.value.data)
console.log(password)
// md5
let md5_password = MD5(password + DEFINE_STRING.OPEN_DEV_TOOLS).toString()
console.log(md5_password)
window.api.OpenDevToolsPassword(md5_password, (value) => {
if (value.code == 0) {
message.error(value.message)
@ -168,6 +165,19 @@ export default defineComponent({
})
})
window.api.setEventListen([DEFINE_STRING.SHOW_GLOABAL_MESSAGE], (value) => {
let mess = value.message
let type = 'success'
let title = '成功'
if (value.code == 0) {
type = 'error'
title = '成功但失败'
} else if (value.code == 2) {
;(type = 'warning'), (title = '警告')
}
message[type](mess, title)
})
//
dialog.create({
showIcon: false,
@ -186,7 +196,6 @@ export default defineComponent({
return false
},
onPositiveClick: async () => {
debugger
await new Promise(async (resolve, reject) => {
await window.api.CheckMachineId(toRaw(machineRef.value.machineId), (value) => {
if (value.code == 0) {

View File

@ -165,7 +165,7 @@ export default defineComponent({
item.loading = false
item.timedata = new Date().getTime()
})
debugger
data.value = value.value
})
}
@ -436,7 +436,7 @@ export default defineComponent({
await window.api.TranslatePrompt(
[JSON.stringify([row]), 'en', 'zh', window.id, false],
(value) => {
debugger
console.log(value)
}
)
@ -559,12 +559,12 @@ export default defineComponent({
})
window.api.setEventListen([DEFINE_STRING.TRANSLATE_RETURN_REFRESH, window.id], (value) => {
debugger
if (value.code == 0) {
message.error('返回数据错误')
return
}
debugger
//
let index = data.value.findIndex((item) => item.id == value.rowId)
@ -620,7 +620,7 @@ export default defineComponent({
async function TranslatePrompt(translateData, from, to) {
console.log(translateData)
await window.api.TranslatePrompt([translateData, from, to, window.id, true], (value) => {
debugger
console.log(value)
})
}
@ -629,7 +629,7 @@ export default defineComponent({
* 翻译中文到提示词
*/
async function TranslateChineseToPrompt() {
debugger
// promptChinese_promptsrc
let fileterData = []
for (let i = 0; i < data.value.length; i++) {
@ -650,7 +650,7 @@ export default defineComponent({
let tmp_str = JSON.stringify(fileterData)
//
await window.api.TranslatePrompt([tmp_str, 'zh', 'en', window.id, true], (value) => {
debugger
console.log(value)
})
}
@ -780,7 +780,7 @@ export default defineComponent({
//
//
await window.api.TranslateReturnNow([tmp_s, 'en', 'zh', true], (value) => {
debugger
console.log(value)
if (value.code == 0) {
message.error(value.message)

View File

@ -3,7 +3,10 @@
<div style="width: 500px; position: relative">
<n-form ref="formRef" label-placement="top" :model="characterData" :rules="rules">
<n-form-item label="人物名称" path="label">
<n-input v-model:value="characterData.label" placeholder="请输入人物名称" />
<n-input style="width: 400px;" v-model:value="characterData.label" placeholder="请输入人物名称" />
<n-checkbox style="margin-left: 20px" v-model:checked="characterData.isShow"
>显示</n-checkbox
>
<n-image
style="position: absolute; left: 520px; top: 0"
width="120"
@ -106,7 +109,8 @@ import {
NFormItem,
NDynamicTags,
NInputNumber,
NSelect
NSelect,
NCheckbox
} from 'naive-ui'
import { v4 as uuidv4 } from 'uuid'
import { isEmpty } from 'lodash'
@ -120,7 +124,8 @@ export default defineComponent({
NFormItem,
NDynamicTags,
NInputNumber,
NSelect
NSelect,
NCheckbox
},
props: ['currentCharacter', 'initFunc', 'currentTags', 'lora_options'],
setup(props) {
@ -183,7 +188,7 @@ export default defineComponent({
await window.mj.SaveTagPropertyData(
[JSON.stringify(characterData.value), 'character_tags'],
(value) => {
debugger
console.log(value)
if (value.code == 0) {
message.error(value.message)
@ -275,7 +280,7 @@ export default defineComponent({
}
imageLoading.value = true
await window.sd.txt2img(JSON.stringify([d]), async (value) => {
debugger
if (value.code == 0) {
message.error(value.message)
imageLoading.value = false

View File

@ -55,7 +55,7 @@ export default defineComponent({
//
prefixData.value['type'] = "prefix_main";
await window.mj.SaveTagPropertyData([JSON.stringify(prefixData.value), "prefix_tags"], (value) => {
debugger;
console.log(value);
if (value.code == 0) {
message.error(value.message);

View File

@ -1,18 +1,41 @@
<template>
<div style="width: 500px;">
<n-form label-placement="top" ref="formRef" :rules="rules" :model="sceneData">
<n-form-item label="场景名称" path="label">
<n-input v-model:value="sceneData.label" placeholder="请输入场景名称" />
</n-form-item>
<n-form-item label="场景提示词描述(中文)">
<n-input type="textarea" :rows="3" v-model:value="sceneData.chinese_prompt" placeholder="请输入场景提示词描述" />
<n-button type="info" size="small" style="margin-left: 20px;" @click="TranslatePrompt"
:loading="loading">翻译提示词</n-button>
</n-form-item>
<n-form-item label="场景提示词描述(英文)" path="prompt">
<n-input type="textarea" :rows="3" v-model:value="sceneData.prompt" placeholder="请输入场景提示词描述" />
</n-form-item>
<!-- <n-form-item label="MJ风格垫图链接sref">
<div style="width: 500px">
<n-form label-placement="top" ref="formRef" :rules="rules" :model="sceneData">
<n-form-item label="场景名称" path="label">
<n-input
style="width: 400px"
v-model:value="sceneData.label"
placeholder="请输入场景名称"
/>
<n-checkbox style="margin-left: 20px" v-model:checked="sceneData.isShow"
>显示</n-checkbox
>
</n-form-item>
<n-form-item label="场景提示词描述(中文)">
<n-input
type="textarea"
:rows="3"
v-model:value="sceneData.chinese_prompt"
placeholder="请输入场景提示词描述"
/>
<n-button
type="info"
size="small"
style="margin-left: 20px"
@click="TranslatePrompt"
:loading="loading"
>翻译提示词</n-button
>
</n-form-item>
<n-form-item label="场景提示词描述(英文)" path="prompt">
<n-input
type="textarea"
:rows="3"
v-model:value="sceneData.prompt"
placeholder="请输入场景提示词描述"
/>
</n-form-item>
<!-- <n-form-item label="MJ风格垫图链接sref">
<n-input v-model:value="sceneData.image_url" placeholder="请输入风格垫图链接" style="margin-right: 20px;" />
<n-image v-if="sceneData.image_url" :src="sceneData.image_url" style="width: 80px; height: 80px" />
</n-form-item>
@ -24,118 +47,145 @@
<n-input v-model:value="sceneData.lora" placeholder="请输入风格Lora" />
<n-button color="#e18a3b" style="margin-left: 20px;">选择</n-button>
</n-form-item> -->
</n-form>
</n-form>
<div style="text-align: right;">
<n-button type="success" @click="SaveSceneTag">保存</n-button>
</div>
<div style="text-align: right">
<n-button type="success" @click="SaveSceneTag">保存</n-button>
</div>
</div>
</template>
<script>
import { ref, h, onMounted, defineComponent, toRaw, watch } from "vue"
import { NImage, useMessage, NButton, useDialog, NInput, NForm, NFormItem, NDynamicTags, NInputNumber } from "naive-ui";
import { v4 as uuidv4 } from "uuid";
import { ref, h, onMounted, defineComponent, toRaw, watch } from 'vue'
import {
NImage,
useMessage,
NButton,
useDialog,
NInput,
NForm,
NFormItem,
NDynamicTags,
NInputNumber,
NCheckbox
} from 'naive-ui'
import { v4 as uuidv4 } from 'uuid'
export default defineComponent({
components: {
NImage, NButton, NInput, NForm, NFormItem, NDynamicTags, NInputNumber
},
props: ["currentScene", "initFunc"],
setup(props) {
let message = useMessage();
let sceneData = ref(props.currentScene);
let loading = ref(false);
let formRef = ref(null)
components: {
NImage,
NButton,
NInput,
NForm,
NFormItem,
NDynamicTags,
NInputNumber,
NCheckbox
},
props: ['currentScene', 'initFunc'],
setup(props) {
let message = useMessage()
let sceneData = ref(props.currentScene)
let loading = ref(false)
let formRef = ref(null)
//
watch(() => props.currentScene, (value) => {
sceneData.value = value;
}, { deep: true })
//
watch(
() => props.currentScene,
(value) => {
sceneData.value = value
},
{ deep: true }
)
onMounted(async () => {
onMounted(async () => {})
})
//
async function SaveSceneTag(e) {
e.preventDefault();
formRef.value?.validate(async (errors) => {
if (errors) {
message.error("请检查必填字段");
return
}
//
//
sceneData.value['type'] = "scene_main";
await window.mj.SaveTagPropertyData([JSON.stringify(sceneData.value), "scene_tags"], (value) => {
debugger;
console.log(value);
if (value.code == 0) {
message.error(value.message);
return;
}
message.success(value.message);
//initFunc
props.initFunc();
//
sceneData.value = {
label: null,
key: null,
type: "scene_main",
prompt: null,
// image_url: null,
// cref_cw: 20,
// lora: null,
};
})
});
//
async function SaveSceneTag(e) {
e.preventDefault()
formRef.value?.validate(async (errors) => {
if (errors) {
message.error('请检查必填字段')
return
}
//
//
sceneData.value['type'] = 'scene_main'
await window.mj.SaveTagPropertyData(
[JSON.stringify(sceneData.value), 'scene_tags'],
(value) => {
//
async function TranslatePrompt() {
loading.value = true;
if (sceneData.value.chinese_prompt == "" || sceneData.value.chinese_prompt == null) {
message.error("请输入中文提示词");
loading.value = false;
return;
console.log(value)
if (value.code == 0) {
message.error(value.message)
return
}
await window.api.TranslateReturnNow([sceneData.value.chinese_prompt, 'zh', 'en', false], (value) => {
if (value.code == 0) {
message.error(value.message);
return;
}
//
console.log(value.data);
sceneData.value.prompt = value.data[0].src;
})
loading.value = false;
}
let ruleObj = (errorMessage) => {
return [{
required: true,
validator(rule, value) {
if (value == null || value == "")
return new Error(errorMessage);
return true;
},
trigger: ["input", "blur", "change"]
}]
}
let rules = {
label: ruleObj("必填人物名称"),
prompt: ruleObj("必填英文提示词")
};
return {
sceneData,
SaveSceneTag,
loading,
TranslatePrompt,
rules,
formRef
}
message.success(value.message)
//initFunc
props.initFunc()
//
sceneData.value = {
label: null,
key: null,
type: 'scene_main',
prompt: null
// image_url: null,
// cref_cw: 20,
// lora: null,
}
}
)
})
}
//
async function TranslatePrompt() {
loading.value = true
if (sceneData.value.chinese_prompt == '' || sceneData.value.chinese_prompt == null) {
message.error('请输入中文提示词')
loading.value = false
return
}
await window.api.TranslateReturnNow(
[sceneData.value.chinese_prompt, 'zh', 'en', false],
(value) => {
if (value.code == 0) {
message.error(value.message)
return
}
//
console.log(value.data)
sceneData.value.prompt = value.data[0].src
}
)
loading.value = false
}
let ruleObj = (errorMessage) => {
return [
{
required: true,
validator(rule, value) {
if (value == null || value == '') return new Error(errorMessage)
return true
},
trigger: ['input', 'blur', 'change']
}
]
}
let rules = {
label: ruleObj('必填人物名称'),
prompt: ruleObj('必填英文提示词')
}
return {
sceneData,
SaveSceneTag,
loading,
TranslatePrompt,
rules,
formRef
}
}
})
</script>

View File

@ -154,7 +154,7 @@ export default defineComponent({
await window.mj.SaveTagPropertyData(
[JSON.stringify(styleData.value), 'style_tags'],
(value) => {
debugger
console.log(value)
if (value.code == 0) {
message.error(value.message)
@ -246,7 +246,7 @@ export default defineComponent({
}
imageLoading.value = true
await window.sd.txt2img(JSON.stringify([d]), async (value) => {
debugger
if (value.code == 0) {
message.error(value.message)
imageLoading.value = false

View File

@ -55,7 +55,7 @@ export default defineComponent({
//
suffixData.value['type'] = "suffix_main";
await window.mj.SaveTagPropertyData([JSON.stringify(suffixData.value), "suffix_tags"], (value) => {
debugger;
console.log(value);
if (value.code == 0) {
message.error(value.message);

View File

@ -90,7 +90,7 @@ export default defineComponent({
loading.value = true;
await window.api.AutoAnalyzeCharacter(toRaw(word.value), (value) => {
debugger
loading.value = false;
if (value.code == 0) {
message.error(value.message);

View File

@ -275,7 +275,7 @@ export default defineComponent({
//
function SetAutoHeight() {
debugger
let div = document.getElementById('tree_define_content')
div.style.height = props.height - 180 + 'px'
}
@ -318,7 +318,8 @@ export default defineComponent({
show_image: window.config.space_image,
cref_cw: 50,
lora: '无',
lora_weight: 1
lora_weight: 1,
isShow: false
}
currentTags.value = []
currentType.value = 'character_main'
@ -335,7 +336,8 @@ export default defineComponent({
label: null,
key: uuidv4(),
type: 'scene_main',
prompt: null
prompt: null,
isShow: false
}
currentType.value = 'scene_main'
}
@ -395,7 +397,7 @@ export default defineComponent({
function nodeProps({ option }) {
return {
onClick() {
debugger
//
if (option.type == 'style') {
currentType.value = 'style'
@ -421,13 +423,16 @@ export default defineComponent({
} else if (option.type == 'min') {
message.error('别名节点不允许操作')
} else {
debugger
console.log(option)
currentType.value = option.type
//
if (currentType.value.startsWith('character')) {
// tags
currentCharacter.value = option
if(!currentCharacter.value.hasOwnProperty("isShow")){
currentCharacter.value.isShow = false
}
currentTags.value = option.children.map((item) => {
return item.label
})

View File

@ -9,15 +9,42 @@
v-model:value="title_character_select_model"
placeholder="选择模式"
></n-select>
<n-button size="tiny" color="#e18a3b" style="margin-left: 5px" @click="RefreshTagData">
<n-icon>
<reload />
</n-icon>
</n-button>
<n-popover trigger="hover">
<template #trigger>
<n-button
text
color="#e18a3b"
style="margin-left: 5px; font-size: 24px"
@click="RefreshTagData"
>
<n-icon>
<ReloadCircle />
</n-icon>
</n-button>
</template>
<span>刷新任务标签数据</span>
</n-popover>
<n-popover trigger="hover">
<template #trigger>
<n-button
size="tiny"
color="#c0d695"
style="margin-left: 5px; font-size: 24px"
text
@click="MatchUser"
>
<n-icon>
<ExtensionPuzzle />
</n-icon>
</n-button>
</template>
<span>自动匹配人物</span>
</n-popover>
</div>
<div v-else-if="type == 'data'">
<div v-if="title_character_select_model == 'tag'">
<div style="min-height: 65px; overflow-y: auto; width: 190px">
<div style="min-height: 65px; overflow-y: auto; width: 200px">
<span>人物</span>
<n-tag
v-for="(character, index) in character_tags"
@ -79,10 +106,21 @@
<script>
import { ref, h, onMounted, defineComponent, toRaw, watch } from 'vue'
import { NImage, useMessage, NButton, useDialog, NInput, NTag, NSelect, NIcon } from 'naive-ui'
import {
NImage,
useMessage,
NButton,
useDialog,
NInput,
NTag,
NSelect,
NIcon,
NPopover
} from 'naive-ui'
import { DEFINE_STRING } from '../../../../../define/define_string'
import { cloneDeep, debounce, get, once } from 'lodash'
import { Refresh, Reload } from '@vicons/ionicons5'
import { Refresh, ReloadCircle, ExtensionPuzzle } from '@vicons/ionicons5'
import ProgressDialog from '../../Components/ProgressDialog.vue'
export default defineComponent({
components: {
@ -92,7 +130,9 @@ export default defineComponent({
NTag,
NSelect,
NIcon,
Reload
ReloadCircle,
ExtensionPuzzle,
NPopover
},
props: ['type', 'row', 'characterSelectModel', 'tags', 'func'],
setup(props) {
@ -103,6 +143,7 @@ export default defineComponent({
let character_tags = ref([])
let scene_tags = ref([])
let tags = ref(props.tags)
let dialog = useDialog()
let characterData = ref([])
@ -114,7 +155,6 @@ export default defineComponent({
watch(
() => props.characterSelectModel,
(value) => {
debugger
// InitData(value);
if (value.value == 'drop') {
select_character_tags.value = []
@ -149,7 +189,7 @@ export default defineComponent({
)
onMounted(async () => {
// debugger
//
// await InitCharacterAndSceneData()
await window.mj.GetTagSelectModel((value) => {
characterSelectMoedlOptions.value = value.data
@ -220,14 +260,24 @@ export default defineComponent({
* @param {*} tags
*/
async function InitCharacterAndSceneData() {
debugger
// if (!tags) return
character_tags.value = cloneDeep(tags.value.character_tags)
character_tags.value.forEach((item) => {
item.children = null
})
for (let i = 0; i < character_tags.value.length; i++) {
let item = character_tags.value[i]
character_tags.value[i].children = null
if (!item.hasOwnProperty('isShow') || item.isShow == false) {
character_tags.value.splice(i, 1)
i--
}
}
scene_tags.value = cloneDeep(tags.value.scene_tags)
for (let i = 0; i < scene_tags.value.length; i++) {
let item = scene_tags.value[i]
if (!item.hasOwnProperty('isShow') || item.isShow == false) {
scene_tags.value.splice(i, 1)
i--
}
}
select_character_tags.value = []
select_scene_tags.value = []
// true
@ -304,6 +354,47 @@ export default defineComponent({
}
}
let dp = null
/**
* 开始人物匹配
*/
async function MatchUser() {
//
window.api.setEventListen([DEFINE_STRING.MJ.MACTH_USER_RETURN], (value) => {
//
//
let temp_data = props.func.getData(null)
//
props.func.modifyData(() => {
console.log(temp_data)
// IDdata
let index = temp_data.findIndex((x) => x.id == value.id)
if (index >= 0) {
temp_data[index].character_tags = value.match_character
}
return temp_data
})
})
//
let da = props.func.getData(null)
//
await window.mj.AutoMatchUser(JSON.stringify(da), async (value) => {
setTimeout(() => {
if (dp) {
dp.destroy()
}
}, 1000)
await RefreshTagData()
if (value.code == 0) {
message.error(value.message)
window.api.showGlobalMessageDialog(value)
return
}
window.api.showGlobalMessageDialog(value)
})
}
return {
characterData,
row,
@ -321,7 +412,8 @@ export default defineComponent({
title_character_select_model,
RefreshTagData,
UpdateCharacterSelect,
UpdateSceneSelect
UpdateSceneSelect,
MatchUser
}
}
})

View File

@ -142,7 +142,7 @@ export default defineComponent({
message.error('当前翻译的数据里面没有中文')
}
} else if (key == 'chinese') {
debugger
let t = [[toRaw(row.value)], 'en', 'zh', false, false]
await window.mj.TranslateReturnNowTask(JSON.stringify(t), (value) => {
if (value.code == 0) {

View File

@ -66,7 +66,7 @@ export default defineComponent({
});
async function onUpdateChecked(v) {
debugger;
row.adetailer = v;
}

View File

@ -1,10 +1,23 @@
<template>
<div v-if="type == 'title'">
<div v-if="type == 'title'" style="display: flex">
<span style="margin-right: 5px">提示词命令</span>
<n-popover trigger="hover">
<template #trigger>
<n-button color="#7c461e" @click="SetMergeModel" text style="font-size: 24px">
<n-icon>
<Construct />
</n-icon>
</n-button>
</template>
<span>设置合并排序模式</span>
</n-popover>
<n-dropdown trigger="hover" :options="MergePromptOptions" @select="MergePromptSelect">
<n-button size="tiny" @click="MergePrompt" color="#7c461e">合并命令</n-button>
<n-button size="tiny" style="margin-left: 5px" @click="MergePrompt(null)" color="#e18a3b"
>合并命令</n-button
>
</n-dropdown>
<n-button color="#e18a3b" size="tiny" style="margin-left: 5px" @click="MJBadPromptCheck"
<n-button color="#c0d695" size="tiny" style="margin-left: 5px" @click="MJBadPromptCheck"
>敏感词检查</n-button
>
</div>
@ -24,6 +37,10 @@
<span>粘贴MJ里面的图片链接自动下载到对应的行并分割</span>
</n-popover>
<n-button size="tiny" color="#ee7959" style="margin-right: 5px" @click="SingleMergePrompt"
>单句合并</n-button
>
<n-input
:status="input_status"
size="tiny"
@ -37,16 +54,22 @@
<script>
import { ref, h, onMounted, defineComponent, toRaw, watch } from 'vue'
import { NButton, NInput, NPopover, useMessage, useDialog, NDropdown } from 'naive-ui'
import { NButton, NInput, NPopover, useMessage, useDialog, NDropdown, NIcon } from 'naive-ui'
import { DEFINE_STRING } from '../../../../../define/define_string'
import InputDialogContent from './InputDialogContent.vue'
import { Construct } from '@vicons/ionicons5'
import DynamicTagsSelect from '../../Components/DynamicTagsSelect.vue'
import { usePromptStore } from '../../../../../stores/prompt'
export default defineComponent({
components: {
NButton,
NInput,
NPopover,
NDropdown
NDropdown,
NIcon,
Construct,
NPopover
},
props: ['type', 'row', 'index', 'func'],
setup(props) {
@ -56,10 +79,7 @@ export default defineComponent({
let row = ref(props.row)
let input_status = ref('default')
let image_url_ref = ref(null)
// let input_image_
//
let promptStore = usePromptStore()
//
watch(
@ -140,10 +160,15 @@ export default defineComponent({
}
/**
* 合并提示词
* 合并命令
* @param {*} key
*/
async function MergePrompt() {
props.func.mergePrompt(null)
async function MergePrompt(key) {
if (row.value.id) {
props.func.mergePrompt(row.value.id, key)
} else {
props.func.mergePrompt(null, key)
}
}
/**
@ -167,7 +192,6 @@ export default defineComponent({
style: `width : ${dialogWidth}px; min-height : ${dialogHeight}px`,
maskClosable: false,
onClose: async () => {
debugger
let row_image_url = image_url_ref.value.data
//
@ -196,7 +220,62 @@ export default defineComponent({
* @param key
*/
async function MergePromptSelect(key) {
props.func.mergePrompt(key)
MergePrompt(key)
}
async function SaveFunction(value, options) {
//
// options
if (value.length != options.length) {
message.error('要保存的数据量和下拉选择的的数据量不一致')
return
}
promptStore.InitPromptSort(value)
//
await window.pmpt.SavePromptSort(value, (value) => {
if (value.code == 0) {
message.error(value.message)
reutrn
}
message.success(value.message)
// store
})
}
/**
* 设置合并的模式
*/
async function SetMergeModel() {
//
await window.pmpt.GetPromptSortOptions((value) => {
let options = value.data
dialog.create({
name: 'setMergeModel',
title: '设置合并排序模式',
content: () =>
h(DynamicTagsSelect, {
options: options,
tagType: 'success',
placeholder: '选择当前的prompt排序方式',
SaveFunction: SaveFunction,
initData: promptStore.GetPromptSort,
max: 4
}),
style: `width : 500px; `,
maskClosable: false,
onPositiveClick: async () => {}
})
})
}
/**
* 单句合并
*/
async function SingleMergePrompt() {
MergePrompt(null)
}
return {
@ -213,7 +292,9 @@ export default defineComponent({
MergePromptOptions: [
{ label: 'SD模式合并', key: 'sd_merge' },
{ label: 'MJ模式合并', key: 'mj_merge' }
]
],
SetMergeModel,
SingleMergePrompt
}
}
})

View File

@ -104,6 +104,8 @@ import {
NPopover,
NTag
} from 'naive-ui'
import { usePromptStore } from '../../../../../stores/prompt'
import { useImageStore } from '../../../../../stores/image'
export default defineComponent({
components: {
@ -117,6 +119,8 @@ export default defineComponent({
},
props: ['initData', 'type', 'image_generate_category', 'func'],
setup(props) {
let imageStore = useImageStore()
let promptStore = usePromptStore()
let message = useMessage()
let data = ref(props.initData)
let type = ref(props.type)
@ -167,7 +171,7 @@ export default defineComponent({
onMounted(async () => {
await window.api.InitSDConfig((value) => {
debugger
if (value.code == 0) {
message.error(value.message)
return
@ -210,23 +214,24 @@ export default defineComponent({
e.dataTransfer.effectAllowed = 'move'
console.log('move', e.target)
dragTarget = e.target
imageStore.SetDragTarget(e.target)
}
//
async function imageDragDrop(e) {
debugger
console.log('end', e.target, dragTarget)
//
if (dragTarget == null) {
message.error('只能拖拽到当前行的图片上')
return
}
// if (dragTarget == null) {
// message.error('')
// return
// }
//
if (e.target.getAttribute('mainImage') != '1') {
message.error('图片只能拖拽到主图片上')
return
}
let source_img = dragTarget.src
let source_img = imageStore.GetDragTarget.src
.split('?')[0]
.replace(/^file:\/\/\//, '')
.replace(/^\//, '')
@ -253,6 +258,7 @@ export default defineComponent({
async function UpdateImageGenerateCategory(value, option) {
//
window.config.image_generate_category = value
promptStore.UpdateImageGenerateCategory(value)
//
await window.api.ModifySampleSetting(
JSON.stringify({

View File

@ -16,7 +16,7 @@
<n-popover trigger="hover">
<template #trigger>
<n-input-number
style="margin-left: 10px; width: 130px"
style="margin-left: 10px; width: 100px"
size="small"
placeholder="输入合并的行数"
:max="10000"
@ -58,6 +58,9 @@
<n-button color="#80a492" size="small" style="margin-left: 10px" @click="mergeWord"
>合并</n-button
>
<n-button color="#f3a694" size="small" style="margin-left: 10px" @click="CopyWord"
>一键复制内容</n-button
>
</div>
<n-input
style="margin-top: 5px"
@ -86,7 +89,7 @@ import {
NInputNumber
} from 'naive-ui'
import { DEFINE_STRING } from '../../../../../define/define_string'
import { AddCircleOutline } from '@vicons/ionicons5'
import { AddCircleOutline, Copy } from '@vicons/ionicons5'
import InputDialogContent from './InputDialogContent.vue'
import { max } from 'lodash'
@ -176,13 +179,11 @@ export default defineComponent({
style: `width : ${dialogWidth}px; min-height : ${dialogHeight}px`,
maskClosable: false,
onClose: async () => {
debugger
write_setting.value.split_char = split_ref.value.data
//
await window.api.SaveDefineConfigJsonByProperty(
JSON.stringify(['clip_setting', 'write_setting', toRaw(write_setting.value), false]),
(value) => {
debugger
console.log(value)
if (value.code == 0) {
message.error(value.message)
@ -208,7 +209,6 @@ export default defineComponent({
await window.api.SaveDefineConfigJsonByProperty(
JSON.stringify(['clip_setting', 'write_setting', toRaw(write_setting.value), false]),
(value) => {
debugger
console.log(value)
if (value.code == 0) {
message.error(value.message)
@ -224,7 +224,6 @@ export default defineComponent({
* 一键格式化
*/
async function formateWrite() {
debugger
let split_arr = Array.from(write_setting.value.split_char)
split_arr.forEach((item) => {
let specialCharacters = [
@ -274,6 +273,19 @@ export default defineComponent({
ChangeWordInput()
}
/**
* 复制数据到剪贴板
*/
async function CopyWord() {
// word
try {
await navigator.clipboard.writeText(word.value)
message.success('复制成功')
} catch (error) {
message.error('复制失败')
}
}
return {
data,
rowCount,
@ -285,7 +297,8 @@ export default defineComponent({
write_setting,
mergeCountChange,
formateWrite,
mergeWord
mergeWord,
CopyWord
}
}
})

View File

@ -158,7 +158,7 @@ export default defineComponent({
//
function setHeight() {
debugger
let div = document.getElementById('import_word_and_srt')
div.style.height = hh + 'px'
}
@ -423,7 +423,7 @@ export default defineComponent({
})
return
} else {
debugger
// config
await window.api.OriginalAddWebuiJson(JSON.stringify(data.value), async (value) => {
if (value.code == 0) {
@ -466,7 +466,7 @@ export default defineComponent({
})
await window.api.ImportSrtAndGetTime([toRaw(data.value), srt_path], (value) => {
debugger
if (value.code == 0) {
message.error(value.message)
return

View File

@ -252,7 +252,6 @@ export default defineComponent({
await window.api.GetDefineConfigJsonByProperty(
JSON.stringify(['img_base', 'mj_config', false, null]),
(value) => {
debugger
console.log(value)
if (value.code == 0) {
message.error(value.message)
@ -363,7 +362,6 @@ export default defineComponent({
message.success('保存成功')
} catch (error) {
debugger
message.error('保存失败 ' + error.message)
}
}
@ -386,7 +384,6 @@ export default defineComponent({
style: `width : ${dialogWidth}px; min-height : ${dialogHeight}px`,
maskClosable: false,
onClose: async () => {
debugger
let mj_bad_prompt = bad_prompt_ref.value.data
if (mj_bad_prompt == null || mj_bad_prompt == '') {

View File

@ -24,7 +24,9 @@ import {
watch,
toRaw,
render,
onBeforeUnmount
onBeforeUnmount,
provide,
nextTick
} from 'vue'
import {
NDataTable,
@ -36,7 +38,6 @@ import {
NPopover,
useDialog,
NCheckbox,
NSelect,
NIcon
} from 'naive-ui'
import { DEFINE_STRING } from '../../../../define/define_string'
@ -51,11 +52,14 @@ import DataTableGptPromptRow from './Components/DataTableGptPromptRow.vue'
import DataTableParameterRow from './Components/DataTableParameterRow.vue'
import { Reload } from '@vicons/ionicons5'
import {
checkStringValueDeletePrefix,
checkStringValueAddPrefix,
checkStringValueAddSuffix,
checkStringValueDeletePrefix
checkStringValueDeleteSuffix
} from '../../../../main/generalTools'
import { usePromptStore } from '../../../../stores/prompt'
export default defineComponent({
components: {
NImage,
@ -70,9 +74,9 @@ export default defineComponent({
Reload,
NIcon
},
props: ['initData', 'prefix_prompt', 'suffix_prompt', 'tags', 'InitTags'],
props: ['initData', 'tags', 'InitTags'],
setup(props) {
console.log('输出文件夹位置', props.initData)
let promptStore = usePromptStore()
let data = ref(props.initData)
let tags = ref(props.tags)
let message = useMessage()
@ -80,8 +84,6 @@ export default defineComponent({
let selectKey = ref([])
let promptChineseRef = ref(null)
let maxHeight = ref(null)
let prefix_prompt = ref(props.prefix_prompt)
let suffix_prompt = ref(props.suffix_prompt)
let titleCharacterAndSceneRef = ref(null)
let dataCharacterAndSceneRef = ref(null)
@ -96,6 +98,9 @@ export default defineComponent({
let AutoSaveDataJsonDebounced = debounce(AutoSaveDataJson, 3000)
let SaveDataJsonDebounced = debounce(AutoSaveDataJson, 1000)
promptStore.UpdateImageGenerateCategory(
window.config.image_generate_category ? window.config.image_generate_category : 'sd'
)
let image_generate_category = ref(
window.config.image_generate_category ? window.config.image_generate_category : 'sd'
)
@ -125,22 +130,9 @@ export default defineComponent({
selectStyle.value[i] = tags.value.style_tags[index]
}
}
},
{ deep: true }
)
watch(
() => props.prefix_prompt,
(newVal) => {
prefix_prompt.value = newVal
},
{ deep: true }
)
watch(
() => props.suffix_prompt,
(newVal) => {
suffix_prompt.value = newVal
// store
promptStore.UpdateSelectStyleSort(toRaw(selectStyle.value))
},
{ deep: true }
)
@ -210,20 +202,25 @@ export default defineComponent({
} catch (error) {
message.error('人物角色刷新失败,请重试' + error.toString())
}
}
},
getData: GetData,
modifyData: ModifyData
}
})
},
className: 'prompt_row',
key: 'character',
width: '200',
width: '210',
render(row, index) {
return h(DataTableCharacterAndScene, {
ref: dataCharacterAndSceneRef,
type: 'data',
row: row,
tags: tags,
characterSelectModel: characterSelectModel
characterSelectModel: characterSelectModel,
func: {
getData: GetData
}
})
}
},
@ -268,6 +265,8 @@ export default defineComponent({
index: index,
func: {
mJBadPromptCheck: MJBadPromptCheck,
modifyData: ModifyData,
getData: GetData,
mergePrompt: MergePrompt
}
})
@ -281,7 +280,10 @@ export default defineComponent({
row: row,
index: index,
func: {
nextGenerateImage: NextGenerateImage
nextGenerateImage: NextGenerateImage,
modifyData: ModifyData,
getData: GetData,
mergePrompt: MergePrompt
}
})
}
@ -292,15 +294,14 @@ export default defineComponent({
return h(DataTableParameterRow, {
type: 'title',
row: row,
index: index,
image_generate_category: image_generate_category
index: index
})
},
key: 'parameter',
width: '130',
render(row, index) {
return h(DataTableParameterRow, {
type: `data_${image_generate_category.value}`,
type: `data_${promptStore.GetImageGenerateCategory}`,
row: row,
index: index
})
@ -352,7 +353,6 @@ export default defineComponent({
onMounted(async () => {
// cinfig
await window.api.GetConfigJson(JSON.stringify([null, {}]), async (value) => {
debugger
if (value.code == 0) {
message.error(value.message)
return
@ -374,6 +374,7 @@ export default defineComponent({
type: 'style_main'
})
}
promptStore.UpdateSelectStyleSort(toRaw(selectStyle.value))
})
// datachinese text
@ -396,7 +397,6 @@ export default defineComponent({
window.api.setEventListen(
[DEFINE_STRING.SD_ORIGINAL_GENERATE_IMAGE_RETURN, window.id],
(value) => {
debugger
if (value.code == 0) {
message.error('生成图片错误,错误信息如下:' + value.message)
return
@ -437,6 +437,9 @@ export default defineComponent({
onBeforeUnmount(async () => {
await AutoSaveDataJson()
window.api.removeEventListen(DEFINE_STRING.DISCORD.MAIN_DISCORD_MESSAGE_CHANGE)
window.api.removeEventListen(DEFINE_STRING.SD_ORIGINAL_GENERATE_IMAGE_RETURN)
window.api.removeEventListen(DEFINE_STRING.TRANSLATE_RETURN_REFRESH)
})
// Discord
@ -456,7 +459,6 @@ export default defineComponent({
//
if (value.type == 'created') {
debugger
console.log('接收Discord的创建消息', value)
// IDdata
@ -554,7 +556,6 @@ export default defineComponent({
async function TranslatePrompt(translateData, from, to) {
console.log(translateData)
await window.api.TranslatePrompt([translateData, from, to, window.id, true], (value) => {
debugger
console.log(value)
})
}
@ -583,13 +584,14 @@ export default defineComponent({
content: () =>
h(InputDialogContent, {
ref: prefix_prompt_ref,
initData: prefix_prompt.value,
initData: promptStore.GetPrefix,
placeholder: '请输入前缀'
}),
style: `width : ${dialogWidth}px; min-height : ${dialogHeight}px`,
maskClosable: false,
onClose: async () => {
prefix_prompt.value = prefix_prompt_ref.value.data
let prefix = prefix_prompt_ref.value.data
promptStore.UpdatePrefix(prefix)
//
await window.api.SaveCopywritingInformation(
[prefix_prompt_ref.value.data, 'prefix_prompt', false],
@ -608,7 +610,6 @@ export default defineComponent({
* 选择生成图片的风格
*/
async function SelectGenerateImagesStyle() {
debugger
//
//
let dialogWidth = window.innerWidth * 0.8
@ -632,7 +633,6 @@ export default defineComponent({
let cus_arr = []
for (let i = 0; i < selectStyle.value.length; i++) {
debugger
const element = selectStyle.value[i]
//
if (element.type == 'style_main') {
@ -680,13 +680,14 @@ export default defineComponent({
content: () =>
h(InputDialogContent, {
ref: suffix_prompt_ref,
initData: suffix_prompt.value,
initData: promptStore.GetSuffix,
placeholder: '请输入后缀'
}),
style: `width : ${dialogWidth}px; min-height : ${dialogHeight}px`,
maskClosable: false,
onClose: async () => {
suffix_prompt.value = suffix_prompt_ref.value.data
let suffix = suffix_prompt_ref.value.data
promptStore.UpdateSuffix(suffix)
await window.api.SaveCopywritingInformation(
[suffix_prompt_ref.value.data, 'suffix_prompt', false],
(value) => {
@ -709,7 +710,7 @@ export default defineComponent({
message.error(value.message)
return
}
debugger
// false
for (let i = 0; i < data.value.length; i++) {
data.value[i].mj_message = data.value[i].mj_message ? data.value[i].mj_message : {}
@ -838,7 +839,6 @@ export default defineComponent({
* @param {*} key 翻译的类型
*/
async function TranslateAll(key) {
debugger
//
if (key == 'english') {
let tmp_d = []
@ -859,7 +859,6 @@ export default defineComponent({
message.success('添加翻译任务成功')
})
} else if (key == 'chinese') {
debugger
let t = [[...toRaw(data.value)], 'en', 'zh', false, false]
await window.mj.TranslateReturnNowTask(JSON.stringify(t), (value) => {
if (value.code == 0) {
@ -871,175 +870,6 @@ export default defineComponent({
}
}
/**
* SD 模式合并名并
* @param character_string
* @param scene_string
* @param gpt_prompt
*/
function SDMergePrompt(element) {
let character_string = ''
element.character_tags?.forEach((item) => {
character_string += ', ' + item.prompt
if (item.lora && item.lora != '无' && item.lora_weight) {
character_string += `, <lora:${item.lora}:${item.lora_weight}>`
}
})
// character_string
character_string = checkStringValueDeletePrefix(character_string, ',')
//
let scene_string = ''
element.scene_tags?.forEach((item) => {
scene_string += ', ' + item.prompt
})
let style_string = ''
selectStyle.value.forEach((item) => {
if (item.type && item.type == 'style_main') {
style_string += ', ' + item.prompt
}
})
// scene_string
scene_string = checkStringValueDeletePrefix(scene_string, ',')
style_string = checkStringValueDeletePrefix(style_string, ',')
style_string = checkStringValueAddSuffix(style_string, ',')
return `${style_string} ${checkStringValueAddSuffix(
character_string,
', '
)}${checkStringValueAddSuffix(scene_string, ', ')}${checkStringValueAddSuffix(
element.gpt_prompt,
', '
)}`
}
/**
* 将所有的数据进行拼接
* @param prefix 前缀
* @param character_string 人物提示词
* @param scene_string 场景提示词
* @param gpt_prompt GPT提示词
* @param suffix 后缀
*/
function MJMergePrompt(prefix, element, suffix) {
debugger
let character_string = ''
let cref_url = ''
element.character_tags?.forEach((item) => {
character_string += ', ' + item.prompt
if (item.image_url && item.image_url != '' && item.cref_cw) {
cref_url += ` ${item.image_url} `
}
})
// cref_url --cref
cref_url = checkStringValueAddPrefix(cref_url, ' --cref ')
if (element.character_tags && element.character_tags.length > 0) {
cref_url = checkStringValueAddSuffix(
cref_url,
` --cw ${element.character_tags[0].cref_cw} `
)
}
// character_string
character_string = checkStringValueDeletePrefix(character_string, ',')
//
let scene_string = ''
element.scene_tags?.forEach((item) => {
scene_string += ', ' + item.prompt
})
// scene_string
scene_string = checkStringValueDeletePrefix(scene_string, ',')
//
let style_string = ''
let style_url = ''
let sw = 0
selectStyle.value.forEach((item) => {
if (item.type && item.type == 'style_main') {
style_string += ', ' + item.prompt
if (sw == 0) {
sw = item.sref_sw
}
if (!isEmpty(item.image_url)) {
let url = item.image_url ? item.image_url : ''
style_url += ' ' + url
}
}
})
style_url = checkStringValueAddPrefix(style_url, '--sref ')
style_url = checkStringValueAddSuffix(style_url, ` --sw ${sw}`)
style_string = checkStringValueDeletePrefix(style_string, ',')
style_string = checkStringValueAddSuffix(style_string, ', ')
return ` ${style_string} ${checkStringValueAddSuffix(
prefix,
', '
)}${checkStringValueAddSuffix(character_string, ', ')}${checkStringValueAddSuffix(
scene_string,
', '
)}${checkStringValueAddSuffix(element.gpt_prompt, ', ')} ${checkStringValueAddSuffix(
suffix,
' '
)} ${cref_url} ${style_url}`
}
/**
* 生成提示词
*/
async function MergePrompt(key) {
try {
debugger
//
// ID
let style_str = ''
for (let i = 0; i < selectStyle.value.length; i++) {
const element = selectStyle.value[i]
style_str += element.english_style + ','
}
//
let prefix = prefix_prompt.value ? prefix_prompt.value : ''
let suffix = suffix_prompt.value ? suffix_prompt.value : ''
for (let i = 0; i < data.value.length; i++) {
const element = data.value[i]
let end_prompt = ''
if (key == null) {
//
if (image_generate_category.value == 'sd') {
end_prompt = SDMergePrompt(element)
} else if (image_generate_category.value == 'mj') {
end_prompt = MJMergePrompt(prefix, element, suffix)
} else if (image_generate_category.value == 'd3') {
message.error('该分类暂时不可用')
return
} else {
message.error('合并提示词错误:未知的合并提示词类型')
return
}
} else if (key == 'mj_merge') {
end_prompt = MJMergePrompt(prefix, element, suffix)
} else if (key == 'sd_merge') {
end_prompt = SDMergePrompt(element)
} else {
message.error('合并提示词错误:未知的合并提示词类型')
return
}
// + + + + +
data.value[i].prompt = end_prompt
}
} catch (error) {
message.error('生成提示词错误,错误信息如下:' + error.message)
}
}
/**
* 采集图片
*/
@ -1102,7 +932,6 @@ export default defineComponent({
* 一拆四
*/
async function OneSplitFour() {
debugger
// data
let min
let pra = []
@ -1138,7 +967,6 @@ export default defineComponent({
//
await window.img.OneSplitFour(JSON.stringify([pra, min]), (value) => {
debugger
if (value.code == 0) {
message.error('一拆四失败,错误信息如下:' + value.message)
return
@ -1146,6 +974,257 @@ export default defineComponent({
})
}
/**
* SD 模式合并名并
* @param character_string
* @param scene_string
* @param gpt_prompt
*/
function SDMergePrompt(element) {
//
let character_string = ''
element.character_tags?.forEach((item) => {
character_string += ', ' + item.prompt
if (item.lora && item.lora != '无' && item.lora_weight) {
character_string += `, <lora:${item.lora}:${item.lora_weight}>`
}
})
// character_string
character_string = checkStringValueDeletePrefix(character_string, ',')
character_string = checkStringValueAddSuffix(character_string, ', ')
//
let scene_string = ''
element.scene_tags?.forEach((item) => {
scene_string += ', ' + item.prompt
})
// scene_string
scene_string = checkStringValueDeletePrefix(scene_string, ',')
scene_string = checkStringValueAddSuffix(scene_string, ', ')
let style_string = ''
for (let i = 0; i < promptStore.GetSelectStyle.length; i++) {
const element = promptStore.GetSelectStyle[i]
if (element.type == 'style_main') {
style_string += element.prompt + ', '
if (element.lora && element.lora != '无' && element.lora_weight) {
style_string += `<lora:${element.lora}:${element.lora_weight}>, `
}
} else {
style_string += element.english_style
}
}
let prompt_str = `${checkStringValueAddSuffix(promptStore.GetPrefix, ',')}`
for (let i = 0; i < promptStore.GetPromptSort.length; i++) {
const element = promptStore.GetPromptSort[i]
prompt_str += `${'${' + element.value + '}'} `
}
console.log(prompt_str)
prompt_str = prompt_str.replace('${style}', style_string)
prompt_str = prompt_str.replace('${character}', character_string)
prompt_str = prompt_str.replace('${scene}', scene_string)
prompt_str = prompt_str.replace(
'${prompt}',
checkStringValueAddSuffix(element.gpt_prompt, ',')
)
prompt_str += ` ${promptStore.GetSuffix ? promptStore.GetSuffix : ''}`
return prompt_str
}
/**
* 将所有的数据进行拼接
* @param prefix 前缀
* @param character_string 人物提示词
* @param scene_string 场景提示词
* @param gpt_prompt GPT提示词
* @param suffix 后缀
*/
function MJMergePrompt(prefix, element, suffix, style_str) {
let character_string = ''
let cref_url = ''
element.character_tags?.forEach((item) => {
character_string += ', ' + item.prompt
if (item.image_url && item.image_url != '' && item.cref_cw) {
cref_url += ` ${item.image_url} `
}
})
// cref_url --cref
cref_url = checkStringValueAddPrefix(cref_url, ' --cref ')
if (element.character_tags && element.character_tags.length > 0) {
cref_url = checkStringValueAddSuffix(
cref_url,
` --cw ${element.character_tags[0].cref_cw} `
)
}
// character_string
character_string = checkStringValueDeletePrefix(character_string, ',')
character_string = checkStringValueAddSuffix(character_string, ', ')
//
let scene_string = ''
element.scene_tags?.forEach((item) => {
scene_string += ', ' + item.prompt
})
// scene_string
scene_string = checkStringValueDeletePrefix(scene_string, ',')
scene_string = checkStringValueAddSuffix(scene_string, ', ')
//
let style_url = ''
let sw = 0
promptStore.GetSelectStyle.forEach((item) => {
if (item.type && item.type == 'style_main') {
if (sw == 0) {
sw = item.sref_sw
}
if (!isEmpty(item.image_url)) {
let url = item.image_url ? item.image_url : ''
style_url += ' ' + url
}
}
})
style_url = checkStringValueAddPrefix(style_url, '--sref ')
style_url = checkStringValueAddSuffix(style_url, ` --sw ${sw}`)
//
if (promptStore.GetPromptSort.length != 4) {
message.error('获取设置的提示词排序错误')
return
}
prefix = checkStringValueAddSuffix(prefix, ', ')
suffix = checkStringValueAddPrefix(suffix, ' ')
let prompt_str = ` ${prefix}`
for (let i = 0; i < promptStore.GetPromptSort.length; i++) {
const element = promptStore.GetPromptSort[i]
prompt_str += `${'${' + element.value + '}'}`
}
console.log(prompt_str)
prompt_str = prompt_str.replace('${style}', style_str)
prompt_str = prompt_str.replace('${character}', character_string)
prompt_str = prompt_str.replace('${scene}', scene_string)
prompt_str = prompt_str.replace(
'${prompt}',
checkStringValueAddSuffix(element.gpt_prompt, ',')
)
prompt_str += ` ${suffix}${cref_url} ${style_url}`
return prompt_str
}
/**
* 合并提示词
*/
function MergePrompt(id, key) {
try {
// idIDID
//
console.log(promptStore.GetSelectStyle)
let style_str = ''
for (let i = 0; i < promptStore.GetSelectStyle.length; i++) {
const element = promptStore.GetSelectStyle[i]
if (element.type == 'style_main') {
style_str += element.prompt + ', '
} else {
style_str += element.english_style + ', '
}
}
style_str = checkStringValueDeleteSuffix(style_str, ', ')
style_str = checkStringValueAddSuffix(style_str, ', ')
//
let temp_data = []
if (id) {
//
temp_data = [toRaw(data.value.find((item) => item.id == id))]
} else {
//
temp_data = toRaw(data.value)
}
//
if (key == null) {
//
if (image_generate_category.value == 'sd') {
key = 'sd_merge'
} else if (image_generate_category.value == 'mj') {
key = 'mj_merge'
} else if (image_generate_category.value == 'd3') {
message.error('该分类暂时不可用')
return
} else {
message.error('合并提示词错误:未知的合并提示词类型')
return
}
}
// TODO
for (let i = 0; i < temp_data.length; i++) {
const element = temp_data[i]
let end_prompt = ''
if (key == 'mj_merge') {
end_prompt = MJMergePrompt(
promptStore.GetPrefix,
element,
promptStore.GetSuffix,
style_str
)
} else if (key == 'sd_merge') {
end_prompt = SDMergePrompt(element)
} else if ((key = 'd3_merge')) {
// D3
message.error('该分类暂时不可用')
return
} else {
message.error('合并提示词错误:未知的合并提示词类型')
return
}
// temp_data[i].prompt = end_prompt
// Iddata
let index = data.value.findIndex((it) => it.id == element.id)
if (index == -1) {
message.error('拼接完成没有找到对应的ID')
return
}
data.value[index].prompt = end_prompt
}
} catch (error) {
message.error('生成提示词错误,错误信息如下:' + error.message)
}
}
/**
* 获取当前的data
*/
function GetData(id) {
if (id) {
//
let index = data.value.findIndex((item) => item.id == id)
if (index == -1) {
message.error('指定ID的行没有找到')
return
}
return data.value[index]
}
return toRaw(data.value)
}
/**
* 修改data数据
* @param callback
*/
function ModifyData(callback) {
if (callback) {
data.value = callback()
}
}
return {
data,
columns: createColumns({}),
@ -1161,9 +1240,9 @@ export default defineComponent({
prefix_prompt_ref,
suffix_prompt_ref,
characterSelectModel,
image_generate_category,
titleCharacterAndSceneRef,
dataCharacterAndSceneRef
dataCharacterAndSceneRef,
image_generate_category
}
}
})

View File

@ -9,13 +9,7 @@
</MenuButton>
</div>
<div id="data-table" style="margin-top: 10px">
<DataTable
:tags="tags"
:initData="data"
:suffix_prompt="suffix_prompt"
:prefix_prompt="prefix_prompt"
:InitTags="InitTags"
></DataTable>
<DataTable :tags="tags" :initData="data" :InitTags="InitTags"></DataTable>
</div>
</template>
@ -25,6 +19,7 @@ import { NImage, useMessage } from 'naive-ui'
import { DEFINE_STRING } from '../../../../define/define_string'
import MenuButton from './MenuButton.vue'
import DataTable from './DataTable.vue'
import { usePromptStore } from '../../../../stores/prompt'
export default defineComponent({
components: {
@ -33,16 +28,16 @@ export default defineComponent({
MenuButton
},
setup() {
let promptStore = usePromptStore()
let message = useMessage()
let data = ref([])
let tags = ref({})
let AnalyzeCharacter = ref('')
let TagTreeData = ref([])
let suffix_prompt = ref(null)
let prefix_prompt = ref(null)
let promptError = true
async function InitData() {
//
//
// 稿
@ -65,20 +60,18 @@ export default defineComponent({
//
await window.api.GetConfigJson(JSON.stringify([null, {}]), async (value) => {
debugger
if (value.code == 0) {
message.error(value.message)
return
}
suffix_prompt.value = value.data.suffix_prompt
prefix_prompt.value = value.data.prefix_prompt
promptStore.UpdateSuffix(value.data.suffix_prompt)
promptStore.UpdatePrefix(value.data.prefix_prompt)
})
// dataprompt
for (let i = 0; i < data.value.length; i++) {
const item = data.value[i]
await window.api.GetPromptJson(item.name, (value) => {
debugger
console.log(value)
if (value.code == 0 && promptError) {
message.error(value.message)
@ -98,7 +91,7 @@ export default defineComponent({
message.error(value.message)
return
}
debugger
tags.value = value.data
// datatag
console.log(data, tags)
@ -112,7 +105,9 @@ export default defineComponent({
// character_tagskeytags.character_tags,
for (let j = element.character_tags.length - 1; j >= 0; j--) {
const item = element.character_tags[j]
let index = tags.value.character_tags.findIndex((tag) => tag.key == item.key)
let index = tags.value.character_tags.findIndex(
(tag) => tag.key == item.key && tag.isShow == true
)
if (index != -1) {
element.character_tags[j] = tags.value.character_tags[index]
} else {
@ -126,17 +121,30 @@ export default defineComponent({
})
}
/**
* 初始化数据
*/
async function InItPromptSort() {
await window.pmpt.GetPromptSort((value) => {
if (value.code == 0) {
message.error(value.message)
return
}
promptStore.InitPromptSort(value.data)
})
}
onMounted(async () => {
await InitData()
await InitTags()
await InItPromptSort()
})
return {
data,
AnalyzeCharacter,
TagTreeData,
prefix_prompt,
suffix_prompt,
InitData,
InitTags,
tags

View File

@ -324,7 +324,7 @@ export default defineComponent({
)
} else if (value == 'resetPrompt') {
//
debugger
console.log(data)
await ResetPrompt()
} else if (value == 'resetImage') {
@ -349,7 +349,7 @@ export default defineComponent({
auto_save,
railStyle,
AutoSaveUpdate: (value) => {
debugger
auto_save.value = value
window.config.auto_save = value
},

View File

@ -191,7 +191,7 @@ export default defineComponent({
* 获取温馨提示列表右上角
*/
async function getFriendlyReminderList() {
debugger;
friendlyReminderData.value = [];
await window.api.getFriendlyReminderList((value) => {
friendlyReminderData.value = value.value.filter(item => item.id != "0" && item.id != "1")
@ -203,7 +203,7 @@ export default defineComponent({
*/
async function GetFriendlyReminder() {
let friendlyReminderSelectDraft_name = friendlyReminderSelectDraft.value.draf_name;
debugger;
console.log(friendlyReminderSelectDraft_name);
if (friendlyReminderTextName.value == "" || friendlyReminderTextName.value == null || friendlyReminderSelectDraft_name == "" || friendlyReminderSelectDraft_name == null) {
message.error("请选择草稿地址和名称");

View File

@ -120,7 +120,7 @@ export default defineComponent({
return;
}
await window.api.GenerateGptExampleOut(JSON.stringify(toRaw(prompt_data.value)), (value) => {
debugger;
console.log(value);
if (value.code == 0) {
message.error(value.message);
@ -134,7 +134,7 @@ export default defineComponent({
* 添加提示词案例输出数据
*/
async function AddExamplePrompt() {
debugger;
let last_data = prompt_data.value.prompt_example[prompt_data.value.prompt_example.length - 1];
if (last_data != null) {
if (isEmpty(last_data.user_content)) {
@ -156,7 +156,7 @@ export default defineComponent({
//
async function DeleteExampleOut(example, index) {
debugger;
if (index > prompt_data.value.prompt_example.length - 1) {
message.error("删除的案例不存在");
return;

View File

@ -241,7 +241,7 @@ export default defineComponent({
let mj_api_options = ref([])
let image_suffix = computed(() => {
debugger
let text = image_model_options.value.findIndex((item) => {
return item.value == mjSetting.value.image_model
})
@ -262,7 +262,7 @@ export default defineComponent({
await window.api.GetDefineConfigJsonByProperty(
JSON.stringify(['img_base', 'mj_config', false, null]),
(value) => {
debugger
console.log(value)
if (value.code == 0) {
message.error(value.message)
@ -393,7 +393,7 @@ export default defineComponent({
)
.then((response) => response.json())
.then((data) => {
debugger
// (nijimj)
// mjniji
if (data.applications && data.application_commands) {
@ -447,7 +447,7 @@ export default defineComponent({
await window.api.SaveDefineConfigJsonByProperty(
JSON.stringify(['img_base', 'mj_config', toRaw(mjSetting.value), false]),
(value) => {
debugger
console.log(value)
if (value.code == 0) {
message.error(value.message)
@ -520,7 +520,7 @@ export default defineComponent({
* 打开购买GPT的地址
*/
async function openGptBuyUrl() {
debugger
let tmp_gb = mj_api_options.value.filter((item) => item.value == mjSetting.value.mj_api_url)
if (tmp_gb.length == 0) {
message.error('当前选择的服务商没有购买地址!')

View File

@ -167,7 +167,7 @@ export default defineComponent({
onMounted(async () => {
await window.api.InitSDConfig((value) => {
debugger
if (value.code == 0) {
message.error(value.message)
return
@ -231,7 +231,7 @@ export default defineComponent({
*/
async function LoadSDServiceData() {
await window.sd.LoadSDServiceData(toRaw(formValue.value).webui_api_url, (value) => {
debugger
if (value.code == 0) {
message.error(value.message)
return

View File

@ -245,7 +245,7 @@ export default defineComponent({
* 加载GPT的配置信息
*/
async function InitGptOptions() {
debugger
await window.api.getGptBusinessOption('all', (value) => {
if (value.code == 0) {
message.error(value.message)
@ -368,7 +368,7 @@ export default defineComponent({
* 打开购买GPT的地址
*/
async function openGptBuyUrl() {
debugger
let tmp_gb = gpt_options.value.filter((item) => item.value == formValue.value.gpt_business)
if (tmp_gb.length == 0) {
message.error('当前选择的服务商没有购买地址!')
@ -387,7 +387,7 @@ export default defineComponent({
* @param {*} value 主题名称
*/
async function ChangeMode(value) {
debugger
console.log(value)
const isDarkMode = await window.darkMode.toggle(value)
}

File diff suppressed because it is too large Load Diff

View File

@ -174,7 +174,7 @@ export default defineComponent({
* @param image
*/
function getCurrentWidthHeight(image) {
debugger
let image_width = 512
let image_height = 512
//
@ -212,7 +212,7 @@ export default defineComponent({
* 停止画
*/
function stopDrawing() {
debugger
isDrawing = false
canvasHistory.push(imageCanvas.value.toDataURL('image/png'))
console.log(canvasHistory)
@ -294,7 +294,7 @@ export default defineComponent({
* 回撤
*/
async function undo() {
debugger
if (step <= 0) {
//
imageContext.value.clearRect(
@ -388,7 +388,7 @@ export default defineComponent({
message.error(value.message)
return
}
debugger
const arrayBuffer = value.data
const blob = new Blob([arrayBuffer], { type: 'image/png' })
const reader = new FileReader()
@ -406,7 +406,7 @@ export default defineComponent({
}
async function SaveMask() {
debugger
//
if (canvasHistory.length <= 1) {
message.error('请先绘制蒙板')
@ -418,7 +418,7 @@ export default defineComponent({
await window.img.Base64ToFile(
JSON.stringify([base64, `data/mask/mask_${new Date().getTime()}.png`]),
async (value) => {
debugger
if (value.code == 0) {
message.error(value.message)
return
@ -486,7 +486,7 @@ export default defineComponent({
})
// PNG
await window.img.BatchProcessImage('tmp/input_crop', (value) => {
debugger
//
setTimeout(() => {
if (dp) {
@ -496,6 +496,7 @@ export default defineComponent({
if (value.code == 0) {
message.error(value.message)
window.api.showGlobalMessageDialog(value)
return
}
window.api.showGlobalMessageDialog(value)

View File

@ -3,6 +3,8 @@ import { createRouter, createWebHashHistory } from 'vue-router';
import App from './App.vue'
import { Home } from '@vicons/ionicons5';
const app = createApp(App);
import { createPinia } from 'pinia'
const pinia = createPinia()
const routes = [
{
@ -33,5 +35,6 @@ const router = createRouter({
routes
})
app.use(router);
app.use(pinia)
app.mount('#app')

18
src/stores/image.js Normal file
View File

@ -0,0 +1,18 @@
import { defineStore } from "pinia";
export const useImageStore = defineStore('image', {
state: () => ({
dragTarget: null
}),
getters: {
GetDragTarget() {
return this.dragTarget;
}
},
actions: {
SetDragTarget(target) {
this.dragTarget = target;
}
}
});

68
src/stores/prompt.js Normal file
View File

@ -0,0 +1,68 @@
import { defineStore } from "pinia";
export const usePromptStore = defineStore('prompt', {
state: () => ({
// 提示词排序
prompt_sort: [],
selectStyle: [],
suffix: null, // 后缀
prefix: null, // 前缀
image_generate_category: null, // 选择生图的分类sd,mj,d3)
isInit: false
}),
getters: {
// 获取提示词排序
GetPromptSort() {
return this.prompt_sort;
},
// 获取选中的风格
GetSelectStyle() {
return this.selectStyle
},
// 获取前缀
GetPrefix() {
return this.prefix;
},
// 获取后缀
GetSuffix() {
return this.suffix;
},
// 获取生图分类
GetImageGenerateCategory() {
return this.image_generate_category;
}
},
actions: {
// 更新提示词排序
InitPromptSort(value) {
this.prompt_sort = value;
},
// 更新
UpdateSelectStyleSort(value) {
this.selectStyle = value;
},
// 更新前缀
UpdatePrefix(value) {
this.prefix = value;
},
// 更新后缀
UpdateSuffix(value) {
this.suffix = value;
},
// 更新生图分类
UpdateImageGenerateCategory(value) {
this.image_generate_category = value;
}
}
});