V 2.2.9 自动匹配,手动排序
This commit is contained in:
parent
3774e9fe55
commit
79a1929e79
@ -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
55
package-lock.json
generated
@ -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",
|
||||
|
||||
@ -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"
|
||||
|
||||
298
resources/scripts/requirements.txt
Normal file
298
resources/scripts/requirements.txt
Normal 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
|
||||
@ -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;
|
||||
|
||||
@ -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"
|
||||
}
|
||||
}
|
||||
@ -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: "参数错误",
|
||||
}
|
||||
}
|
||||
@ -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());
|
||||
}
|
||||
}
|
||||
@ -214,8 +214,8 @@ export const ImageSetting = {
|
||||
* @param {*} value
|
||||
* 0 define中的指定属性(指定的配置文件)
|
||||
* 1 要获取的什么属性信息 property,property 为null,赶回当前配置文件的所有数据
|
||||
* 2 是不是要校验属性不存在
|
||||
* 3 属性没有找到的默认值
|
||||
* 2 要写入的值
|
||||
* 3 是不是要校验属性不存在
|
||||
*/
|
||||
async SaveDefineConfigJsonByProperty(value) {
|
||||
try {
|
||||
|
||||
32
src/main/IPCEvent/index.js
Normal file
32
src/main/IPCEvent/index.js
Normal 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();
|
||||
}
|
||||
|
||||
@ -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界面创建消息,并修改数据
|
||||
*/
|
||||
|
||||
18
src/main/IPCEvent/promptIpc.js
Normal file
18
src/main/IPCEvent/promptIpc.js
Normal 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
|
||||
}
|
||||
@ -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 {
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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
82
src/main/Public/Prompt.js
Normal 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)
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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");
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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";
|
||||
|
||||
@ -382,7 +382,7 @@ function startObserving() {
|
||||
if (window.observer) {
|
||||
return;
|
||||
}
|
||||
debugger
|
||||
|
||||
// 没有开始监听
|
||||
MutationObserverElement();
|
||||
console.log("开始监听")
|
||||
|
||||
@ -507,7 +507,7 @@ export class DiscordSimple {
|
||||
if (window.observer) {
|
||||
return;
|
||||
}
|
||||
debugger
|
||||
|
||||
// 没有开始监听
|
||||
MutationObserverElement();
|
||||
console.log("开始监听")
|
||||
|
||||
@ -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());
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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) => {
|
||||
|
||||
@ -317,7 +317,11 @@ export class Setting {
|
||||
|
||||
/**
|
||||
* 获取指定的配置文件里面指定的属性的数据
|
||||
* @param {*} value
|
||||
* @param {*} value 执行方法必要的信息
|
||||
* 0 define中的指定属性(指定的配置文件)
|
||||
* 1 要获取的什么属性信息 property,property 为null,赶回当前配置文件的所有数据
|
||||
* 2 是不是要校验属性不存在
|
||||
* 3 属性没有找到的默认值
|
||||
*/
|
||||
async GetDefineConfigJsonByProperty(value) {
|
||||
return ImageSetting.GetDefineConfigJsonByProperty(value);
|
||||
@ -326,6 +330,11 @@ export class Setting {
|
||||
|
||||
/**
|
||||
* 保存指定的配置文件里面指定的属性的数据
|
||||
* @param {*} value
|
||||
* 0 define中的指定属性(指定的配置文件)
|
||||
* 1 要获取的什么属性信息 property,property 为null,赶回当前配置文件的所有数据
|
||||
* 2 要写入的值
|
||||
* 3 是不是要校验属性不存在
|
||||
*/
|
||||
async SaveDefineConfigJsonByProperty(value) {
|
||||
return ImageSetting.SaveDefineConfigJsonByProperty(value);
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
||||
@ -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
17
src/preload/prompt.js
Normal 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
17
src/preload/setting.js
Normal 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
|
||||
}
|
||||
@ -43,7 +43,7 @@ export default defineComponent({
|
||||
javascript,
|
||||
hljs,
|
||||
darkTheme,
|
||||
themeData,
|
||||
themeData
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
@ -167,7 +167,7 @@ export default defineComponent({
|
||||
* 另存图片的方法
|
||||
*/
|
||||
async function SaveImage() {
|
||||
debugger
|
||||
|
||||
if (isEmpty(save_setting.value.save_folder)) {
|
||||
message.error("请选择手动保存的文件夹")
|
||||
return
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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('.')
|
||||
|
||||
@ -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('请选择要操作的任务')
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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()
|
||||
// 判断该当前状态
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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;
|
||||
})
|
||||
})
|
||||
|
||||
@ -77,7 +77,7 @@ export default defineComponent({
|
||||
message.error("请输入分镜内容");
|
||||
return;
|
||||
}
|
||||
debugger;
|
||||
|
||||
// 文案内容
|
||||
let text_value = inputValue.value.split("\n")
|
||||
// 获取当前项目下面地所有草稿
|
||||
|
||||
158
src/renderer/src/components/Components/DynamicTagsSelect.vue
Normal file
158
src/renderer/src/components/Components/DynamicTagsSelect.vue
Normal 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>
|
||||
@ -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
|
||||
);
|
||||
|
||||
@ -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];
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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) {
|
||||
|
||||
@ -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
|
||||
|
||||
// 将当前的prompt和Chinese_prompt中的src全部删除(全部重新翻译)
|
||||
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)
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -1,16 +1,39 @@
|
||||
<template>
|
||||
<div style="width: 500px;">
|
||||
<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-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-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-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;" />
|
||||
@ -26,107 +49,134 @@
|
||||
</n-form-item> -->
|
||||
</n-form>
|
||||
|
||||
<div style="text-align: right;">
|
||||
<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
|
||||
NImage,
|
||||
NButton,
|
||||
NInput,
|
||||
NForm,
|
||||
NFormItem,
|
||||
NDynamicTags,
|
||||
NInputNumber,
|
||||
NCheckbox
|
||||
},
|
||||
props: ["currentScene", "initFunc"],
|
||||
props: ['currentScene', 'initFunc'],
|
||||
setup(props) {
|
||||
let message = useMessage();
|
||||
let sceneData = ref(props.currentScene);
|
||||
let loading = ref(false);
|
||||
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();
|
||||
e.preventDefault()
|
||||
formRef.value?.validate(async (errors) => {
|
||||
if (errors) {
|
||||
message.error("请检查必填字段");
|
||||
message.error('请检查必填字段')
|
||||
return
|
||||
}
|
||||
// 直接保存
|
||||
// 开始保存
|
||||
sceneData.value['type'] = "scene_main";
|
||||
await window.mj.SaveTagPropertyData([JSON.stringify(sceneData.value), "scene_tags"], (value) => {
|
||||
debugger;
|
||||
console.log(value);
|
||||
sceneData.value['type'] = 'scene_main'
|
||||
await window.mj.SaveTagPropertyData(
|
||||
[JSON.stringify(sceneData.value), 'scene_tags'],
|
||||
(value) => {
|
||||
|
||||
console.log(value)
|
||||
if (value.code == 0) {
|
||||
message.error(value.message);
|
||||
return;
|
||||
message.error(value.message)
|
||||
return
|
||||
}
|
||||
message.success(value.message);
|
||||
message.success(value.message)
|
||||
//保存成功在initFunc
|
||||
props.initFunc();
|
||||
props.initFunc()
|
||||
// 清楚数据
|
||||
sceneData.value = {
|
||||
label: null,
|
||||
key: null,
|
||||
type: "scene_main",
|
||||
prompt: 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;
|
||||
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) => {
|
||||
await window.api.TranslateReturnNow(
|
||||
[sceneData.value.chinese_prompt, 'zh', 'en', false],
|
||||
(value) => {
|
||||
if (value.code == 0) {
|
||||
message.error(value.message);
|
||||
return;
|
||||
message.error(value.message)
|
||||
return
|
||||
}
|
||||
//
|
||||
console.log(value.data);
|
||||
sceneData.value.prompt = value.data[0].src;
|
||||
})
|
||||
loading.value = false;
|
||||
console.log(value.data)
|
||||
sceneData.value.prompt = value.data[0].src
|
||||
}
|
||||
)
|
||||
loading.value = false
|
||||
}
|
||||
|
||||
let ruleObj = (errorMessage) => {
|
||||
return [{
|
||||
return [
|
||||
{
|
||||
required: true,
|
||||
validator(rule, value) {
|
||||
if (value == null || value == "")
|
||||
return new Error(errorMessage);
|
||||
return true;
|
||||
if (value == null || value == '') return new Error(errorMessage)
|
||||
return true
|
||||
},
|
||||
trigger: ["input", "blur", "change"]
|
||||
}]
|
||||
trigger: ['input', 'blur', 'change']
|
||||
}
|
||||
]
|
||||
}
|
||||
let rules = {
|
||||
label: ruleObj("必填人物名称"),
|
||||
prompt: ruleObj("必填英文提示词")
|
||||
};
|
||||
label: ruleObj('必填人物名称'),
|
||||
prompt: ruleObj('必填英文提示词')
|
||||
}
|
||||
|
||||
return {
|
||||
sceneData,
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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
|
||||
})
|
||||
|
||||
@ -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-popover trigger="hover">
|
||||
<template #trigger>
|
||||
<n-button
|
||||
text
|
||||
color="#e18a3b"
|
||||
style="margin-left: 5px; font-size: 24px"
|
||||
@click="RefreshTagData"
|
||||
>
|
||||
<n-icon>
|
||||
<reload />
|
||||
<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)
|
||||
// 修改当前指定ID的data行
|
||||
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
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
@ -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) {
|
||||
|
||||
@ -66,7 +66,7 @@ export default defineComponent({
|
||||
});
|
||||
|
||||
async function onUpdateChecked(v) {
|
||||
debugger;
|
||||
|
||||
row.adetailer = v;
|
||||
}
|
||||
|
||||
|
||||
@ -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
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
@ -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({
|
||||
|
||||
@ -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
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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 == '') {
|
||||
|
||||
@ -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))
|
||||
})
|
||||
|
||||
// 判断data中的数据是不是有chinese 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)
|
||||
// 找到对应ID的data数据
|
||||
|
||||
@ -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 {
|
||||
// 判断当前是不是又id,有ID的话就是单个数据,没有ID的话就要全部处理
|
||||
// 获取当前选中的样式
|
||||
|
||||
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
|
||||
// 找到对应的Id的data
|
||||
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
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
@ -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)
|
||||
})
|
||||
|
||||
// 读取data数据对应的prompt文件
|
||||
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
|
||||
// 加载完毕之后,需要刷新当前的data中的tag数据
|
||||
console.log(data, tags)
|
||||
@ -112,7 +105,9 @@ export default defineComponent({
|
||||
// 循环判断当前的character_tags对应的key在tags.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
|
||||
|
||||
@ -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
|
||||
},
|
||||
|
||||
@ -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("请选择草稿地址和名称");
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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
|
||||
|
||||
// 修改配置信息(判断是不是niji或者是mj)
|
||||
// 填充mj,niji数据
|
||||
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('当前选择的服务商没有购买地址!')
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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)
|
||||
}
|
||||
|
||||
@ -1,28 +1,57 @@
|
||||
<template>
|
||||
<div style="color: red;">注意:<br>所有的配置都是基于1440 * 1080。会根据分辨率自动计算匹配</div>
|
||||
<div style="color: red">注意:<br />所有的配置都是基于1440 * 1080。会根据分辨率自动计算匹配</div>
|
||||
<n-tabs type="line" animated default-value="GeneralSettings">
|
||||
<n-tab-pane name="GeneralSettings" tab="通用设置">
|
||||
<n-form ref="formRef" :model="generalSetting" :rules="rules" label-placement="left" label-width="auto"
|
||||
require-mark-placement="right-hanging" :size="size">
|
||||
<n-form
|
||||
ref="formRef"
|
||||
:model="generalSetting"
|
||||
:rules="rules"
|
||||
label-placement="left"
|
||||
label-width="auto"
|
||||
require-mark-placement="right-hanging"
|
||||
:size="size"
|
||||
>
|
||||
<n-form-item label="视频分辨率" path="video_resolution">
|
||||
<n-input-number :show-button="false" v-model:value="generalSetting.video_resolution_x"
|
||||
placeholder="视频X" />
|
||||
<div style="font-size: 30px; margin: 0 20px;">*</div>
|
||||
<n-input-number :show-button="false" v-model:value="generalSetting.video_resolution_y"
|
||||
placeholder="视频Y" />
|
||||
<n-input-number
|
||||
:show-button="false"
|
||||
v-model:value="generalSetting.video_resolution_x"
|
||||
placeholder="视频X"
|
||||
/>
|
||||
<div style="font-size: 30px; margin: 0 20px">*</div>
|
||||
<n-input-number
|
||||
:show-button="false"
|
||||
v-model:value="generalSetting.video_resolution_y"
|
||||
placeholder="视频Y"
|
||||
/>
|
||||
</n-form-item>
|
||||
|
||||
<n-tooltip trigger="hover" placement="top-start" style="background-color: aliceblue;" :show-arrow="false">
|
||||
<n-tooltip
|
||||
trigger="hover"
|
||||
placement="top-start"
|
||||
style="background-color: aliceblue"
|
||||
:show-arrow="false"
|
||||
>
|
||||
<template #trigger>
|
||||
<n-form-item label="图片关键帧" path="keyframe">
|
||||
<n-select style="width: 150px; margin-right: 10px;"
|
||||
v-model:value="generalSetting.keyframe.name" :options="keyframeOptions"></n-select>
|
||||
<div style="margin-left: 10px;">上下:</div>
|
||||
<n-input-number :show-button="false" style="width: 100px;"
|
||||
v-model:value="generalSetting.keyframe.up_down" placeholder="上下偏移量" />
|
||||
<div style="margin-left: 10px;">左右:</div>
|
||||
<n-input-number :show-button="false" style="width: 100px;"
|
||||
v-model:value="generalSetting.keyframe.left_right" placeholder="上下偏移量" />
|
||||
<n-select
|
||||
style="width: 150px; margin-right: 10px"
|
||||
v-model:value="generalSetting.keyframe.name"
|
||||
:options="keyframeOptions"
|
||||
></n-select>
|
||||
<div style="margin-left: 10px">上下:</div>
|
||||
<n-input-number
|
||||
:show-button="false"
|
||||
style="width: 100px"
|
||||
v-model:value="generalSetting.keyframe.up_down"
|
||||
placeholder="上下偏移量"
|
||||
/>
|
||||
<div style="margin-left: 10px">左右:</div>
|
||||
<n-input-number
|
||||
:show-button="false"
|
||||
style="width: 100px"
|
||||
v-model:value="generalSetting.keyframe.left_right"
|
||||
placeholder="上下偏移量"
|
||||
/>
|
||||
<!-- <n-tooltip trigger="hover">
|
||||
<template #trigger>
|
||||
<div style="display: flex; margin-left: 10px;">
|
||||
@ -34,10 +63,11 @@
|
||||
</template>
|
||||
注意:放大倍率会先将图片全部铺满然后在进行放大。防止出现黑边
|
||||
</n-tooltip> -->
|
||||
|
||||
</n-form-item>
|
||||
</template>
|
||||
<div style="color: red;">设置的值越大,图片移动的速度越快(若是图片的尺寸不够,也会被放的越大)</div>
|
||||
<div style="color: red">
|
||||
设置的值越大,图片移动的速度越快(若是图片的尺寸不够,也会被放的越大)
|
||||
</div>
|
||||
</n-tooltip>
|
||||
<n-form-item label="帧率" path="frameRate">
|
||||
<n-input-number v-model:value="generalSetting.frameRate" placeholder="输入帧率" />
|
||||
@ -46,146 +76,216 @@
|
||||
<n-input-number v-model:value="generalSetting.bitRate" placeholder="输入视频码率" />
|
||||
</n-form-item>
|
||||
<n-form-item label="配音声量大小" path="audioSoundSize">
|
||||
<n-input-number v-model:value="generalSetting.audioSoundSize" placeholder="配音声量大小" />
|
||||
<n-input-number
|
||||
v-model:value="generalSetting.audioSoundSize"
|
||||
placeholder="配音声量大小"
|
||||
/>
|
||||
</n-form-item>
|
||||
<n-form-item label="背景音乐声量大小" path="backgroundMusicSoundSize">
|
||||
<n-input-number v-model:value="generalSetting.backgroundMusicSoundSize" placeholder="背景音乐声量大小" />
|
||||
<n-input-number
|
||||
v-model:value="generalSetting.backgroundMusicSoundSize"
|
||||
placeholder="背景音乐声量大小"
|
||||
/>
|
||||
</n-form-item>
|
||||
<div style="display: flex;">
|
||||
<n-button round type="primary" @click="SaveGeneralSetting">
|
||||
保存
|
||||
</n-button>
|
||||
|
||||
<n-form-item label="纯软件编码" path="libx264">
|
||||
<n-checkbox v-model:checked="generalSetting.libx264" />
|
||||
</n-form-item>
|
||||
<div style="display: flex">
|
||||
<n-button round type="primary" @click="SaveGeneralSetting"> 保存 </n-button>
|
||||
</div>
|
||||
</n-form>
|
||||
</n-tab-pane>
|
||||
<n-tab-pane name="AssSetting" tab="字幕设置">
|
||||
<div style="color: red;"> 注意: 当前有些字体读取不能准确获取。可以在后面的下面的编辑列表中进行简单的修改</div>
|
||||
<div style="color: red">
|
||||
注意: 当前有些字体读取不能准确获取。可以在后面的下面的编辑列表中进行简单的修改
|
||||
</div>
|
||||
<!-- 字体 字号 颜色 透明度 位置 -->
|
||||
<n-form :model="assSetting" style="display: flex; flex-wrap: wrap;">
|
||||
<n-form-item style=" margin-right: 20px;" label="字体" path="fontName">
|
||||
<n-select style="width: 300px;" v-model:value="assSetting.fontName" :options="fontNameOptions"
|
||||
filterable />
|
||||
<n-button secondary color="#8a2be2" @click="GetSystemInstallFontName"> 更新字体列表 </n-button>
|
||||
<n-form :model="assSetting" style="display: flex; flex-wrap: wrap">
|
||||
<n-form-item style="margin-right: 20px" label="字体" path="fontName">
|
||||
<n-select
|
||||
style="width: 300px"
|
||||
v-model:value="assSetting.fontName"
|
||||
:options="fontNameOptions"
|
||||
filterable
|
||||
/>
|
||||
<n-button secondary color="#8a2be2" @click="GetSystemInstallFontName">
|
||||
更新字体列表
|
||||
</n-button>
|
||||
</n-form-item>
|
||||
|
||||
<n-form-item style=" margin-right: 20px;" label="字号(80差不多)">
|
||||
<n-input-number style="width: 200px;" v-model:value="assSetting.fontSize" />
|
||||
<n-form-item style="margin-right: 20px" label="字号(80差不多)">
|
||||
<n-input-number style="width: 200px" v-model:value="assSetting.fontSize" />
|
||||
</n-form-item>
|
||||
|
||||
<n-form-item style=" margin-right: 20px;" label="颜色">
|
||||
<n-color-picker style="width: 200px;" v-model:value="assSetting.fontColor" :show-alpha="false" />
|
||||
<n-form-item style="margin-right: 20px" label="颜色">
|
||||
<n-color-picker
|
||||
style="width: 200px"
|
||||
v-model:value="assSetting.fontColor"
|
||||
:show-alpha="false"
|
||||
/>
|
||||
</n-form-item>
|
||||
|
||||
<n-form-item style=" margin-right: 20px;" label="透明度(100不透明)">
|
||||
<n-input-number style="width: 200px;" v-model:value="assSetting.transparent" />
|
||||
<n-form-item style="margin-right: 20px" label="透明度(100不透明)">
|
||||
<n-input-number style="width: 200px" v-model:value="assSetting.transparent" />
|
||||
</n-form-item>
|
||||
|
||||
<n-form-item style="margin-right: 20px;" label="位置">
|
||||
<n-input-number style="width: 60px; margin-right: 10px;" v-model:value="assSetting.positionX"
|
||||
placeholder="X" :show-button="false" />
|
||||
<n-input-number style="width: 60px;" v-model:value="assSetting.positionY" placeholder="Y"
|
||||
:show-button="false" />
|
||||
<n-form-item style="margin-right: 20px" label="位置">
|
||||
<n-input-number
|
||||
style="width: 60px; margin-right: 10px"
|
||||
v-model:value="assSetting.positionX"
|
||||
placeholder="X"
|
||||
:show-button="false"
|
||||
/>
|
||||
<n-input-number
|
||||
style="width: 60px"
|
||||
v-model:value="assSetting.positionY"
|
||||
placeholder="Y"
|
||||
:show-button="false"
|
||||
/>
|
||||
</n-form-item>
|
||||
</n-form>
|
||||
<div>
|
||||
<n-button type="info" @click="SaveAssConfig"> 保存信息 </n-button>
|
||||
</div>
|
||||
|
||||
<n-data-table :columns="assSettingColumns" :data="generalSetting.assConfig" :pagination="false"
|
||||
:bordered="false" />
|
||||
<n-data-table
|
||||
:columns="assSettingColumns"
|
||||
:data="generalSetting.assConfig"
|
||||
:pagination="false"
|
||||
:bordered="false"
|
||||
/>
|
||||
</n-tab-pane>
|
||||
|
||||
<n-tab-pane name="WaterMarkSetting" tab="水印设置">
|
||||
<div style="color: red;"> 注意: 当前有些字体读取不能准确获取。可以在后面的下面的编辑列表中进行简单的修改</div>
|
||||
<div style="color: red">
|
||||
注意: 当前有些字体读取不能准确获取。可以在后面的下面的编辑列表中进行简单的修改
|
||||
</div>
|
||||
<!-- 字体 字号 颜色 透明度 位置 -->
|
||||
<n-form :model="wmSetting" style="display: flex; flex-wrap: wrap;">
|
||||
<n-form-item style=" margin-right: 20px;" label="水印字体(要换行输入\N)" path="fontName">
|
||||
<n-input style="width: 400px;" v-model:value="wmSetting.showText" />
|
||||
<n-form :model="wmSetting" style="display: flex; flex-wrap: wrap">
|
||||
<n-form-item style="margin-right: 20px" label="水印字体(要换行输入\N)" path="fontName">
|
||||
<n-input style="width: 400px" v-model:value="wmSetting.showText" />
|
||||
</n-form-item>
|
||||
<n-form-item style=" margin-right: 20px;" label="字体" path="fontName">
|
||||
<n-select style="width: 300px;" v-model:value="wmSetting.fontName" :options="fontNameOptions"
|
||||
filterable />
|
||||
<n-button secondary color="#8a2be2" @click="GetSystemInstallFontName"> 更新字体列表 </n-button>
|
||||
<n-form-item style="margin-right: 20px" label="字体" path="fontName">
|
||||
<n-select
|
||||
style="width: 300px"
|
||||
v-model:value="wmSetting.fontName"
|
||||
:options="fontNameOptions"
|
||||
filterable
|
||||
/>
|
||||
<n-button secondary color="#8a2be2" @click="GetSystemInstallFontName">
|
||||
更新字体列表
|
||||
</n-button>
|
||||
</n-form-item>
|
||||
|
||||
<n-form-item style=" margin-right: 20px;" label="字号(30差不多)">
|
||||
<n-input-number style="width: 200px;" v-model:value="wmSetting.fontSize" />
|
||||
<n-form-item style="margin-right: 20px" label="字号(30差不多)">
|
||||
<n-input-number style="width: 200px" v-model:value="wmSetting.fontSize" />
|
||||
</n-form-item>
|
||||
|
||||
<n-form-item style=" margin-right: 20px;" label="颜色">
|
||||
<n-color-picker style="width: 200px;" v-model:value="wmSetting.fontColor" :show-alpha="false" />
|
||||
<n-form-item style="margin-right: 20px" label="颜色">
|
||||
<n-color-picker
|
||||
style="width: 200px"
|
||||
v-model:value="wmSetting.fontColor"
|
||||
:show-alpha="false"
|
||||
/>
|
||||
</n-form-item>
|
||||
|
||||
<n-form-item style=" margin-right: 20px;" label="透明度(100不透明)">
|
||||
<n-input-number style="width: 200px;" v-model:value="wmSetting.transparent" />
|
||||
<n-form-item style="margin-right: 20px" label="透明度(100不透明)">
|
||||
<n-input-number style="width: 200px" v-model:value="wmSetting.transparent" />
|
||||
</n-form-item>
|
||||
|
||||
<n-form-item style="margin-right: 20px;" label="位置(X,Y)">
|
||||
<n-input-number style="width: 60px; margin-right: 10px;" v-model:value="wmSetting.positionX"
|
||||
placeholder="X" :show-button="false" />
|
||||
<n-input-number style="width: 60px;" v-model:value="wmSetting.positionY" placeholder="Y"
|
||||
:show-button="false" />
|
||||
<n-form-item style="margin-right: 20px" label="位置(X,Y)">
|
||||
<n-input-number
|
||||
style="width: 60px; margin-right: 10px"
|
||||
v-model:value="wmSetting.positionX"
|
||||
placeholder="X"
|
||||
:show-button="false"
|
||||
/>
|
||||
<n-input-number
|
||||
style="width: 60px"
|
||||
v-model:value="wmSetting.positionY"
|
||||
placeholder="Y"
|
||||
:show-button="false"
|
||||
/>
|
||||
</n-form-item>
|
||||
</n-form>
|
||||
<div>
|
||||
<n-button type="info" @click="SaveWaterMarkConfig"> 保存信息 </n-button>
|
||||
</div>
|
||||
|
||||
<n-data-table :columns="wmColumns" :data="generalSetting.watermarkConfig" :pagination="false"
|
||||
:bordered="false" />
|
||||
<n-data-table
|
||||
:columns="wmColumns"
|
||||
:data="generalSetting.watermarkConfig"
|
||||
:pagination="false"
|
||||
:bordered="false"
|
||||
/>
|
||||
</n-tab-pane>
|
||||
|
||||
<n-tab-pane name="backgroundSetting" tab="背景音乐设置">
|
||||
<div style="margin:10px 0;">
|
||||
<div style="margin: 10px 0">
|
||||
注意:
|
||||
<div style="color: red;">设置背景乐对应的文件夹,选择对应的分类,可以随机匹配音乐</div>
|
||||
<div style="color: red">设置背景乐对应的文件夹,选择对应的分类,可以随机匹配音乐</div>
|
||||
</div>
|
||||
<BackgroundMusic></BackgroundMusic>
|
||||
</n-tab-pane>
|
||||
</n-tabs>
|
||||
</template>
|
||||
<script>
|
||||
import { defineComponent, ref, h, onMounted, toRaw } from "vue";
|
||||
import { NForm, NFormItem, NInput, NButton, useMessage, NCard, NTabs, NTabPane, NInputNumber, NSelect, NColorPicker, NDataTable, useDialog, NTooltip } from "naive-ui"
|
||||
import { defineComponent, ref, h, onMounted, toRaw } from 'vue'
|
||||
import {
|
||||
NForm,
|
||||
NFormItem,
|
||||
NInput,
|
||||
NButton,
|
||||
useMessage,
|
||||
NCard,
|
||||
NTabs,
|
||||
NTabPane,
|
||||
NInputNumber,
|
||||
NSelect,
|
||||
NColorPicker,
|
||||
NDataTable,
|
||||
useDialog,
|
||||
NTooltip,
|
||||
NCheckbox
|
||||
} from 'naive-ui'
|
||||
import ModifyVideoAssSetting from '../Components/ModifyVideoAssSetting.vue'
|
||||
import BackgroundMusic from './Components/BackgroundMusic.vue'
|
||||
|
||||
/**
|
||||
* 创建字幕设置表格的列表
|
||||
*/
|
||||
const createAssSettingColumns = ({
|
||||
DeleteAssSetting,
|
||||
EditAssSetting,
|
||||
DeleteWaterMarkSetting
|
||||
}, isWater = false) => {
|
||||
let columnData = [];
|
||||
const createAssSettingColumns = (
|
||||
{ DeleteAssSetting, EditAssSetting, DeleteWaterMarkSetting },
|
||||
isWater = false
|
||||
) => {
|
||||
let columnData = []
|
||||
if (isWater) {
|
||||
columnData.push(
|
||||
{
|
||||
title: "显示值",
|
||||
key: "showText"
|
||||
columnData.push({
|
||||
title: '显示值',
|
||||
key: 'showText'
|
||||
})
|
||||
}
|
||||
let return_data = columnData.concat([
|
||||
{
|
||||
title: "字体名称",
|
||||
key: "fontName"
|
||||
title: '字体名称',
|
||||
key: 'fontName'
|
||||
},
|
||||
{
|
||||
title: "字号",
|
||||
key: "fontSize"
|
||||
title: '字号',
|
||||
key: 'fontSize'
|
||||
},
|
||||
{
|
||||
title: "字体颜色",
|
||||
key: "fontColor"
|
||||
title: '字体颜色',
|
||||
key: 'fontColor'
|
||||
},
|
||||
{
|
||||
title: "透明度",
|
||||
key: "transparent"
|
||||
title: '透明度',
|
||||
key: 'transparent'
|
||||
},
|
||||
{
|
||||
title: "字体颜色",
|
||||
key: "fontColor",
|
||||
title: '字体颜色',
|
||||
key: 'fontColor',
|
||||
render(row) {
|
||||
return h(NColorPicker, {
|
||||
disabled: true,
|
||||
@ -194,89 +294,107 @@ const createAssSettingColumns = ({
|
||||
}
|
||||
},
|
||||
{
|
||||
title: "位置X",
|
||||
key: "positionX",
|
||||
title: '位置X',
|
||||
key: 'positionX'
|
||||
},
|
||||
{
|
||||
title: "位置Y",
|
||||
key: "positionY",
|
||||
},
|
||||
]);
|
||||
title: '位置Y',
|
||||
key: 'positionY'
|
||||
}
|
||||
])
|
||||
if (isWater) {
|
||||
return_data.push({
|
||||
title: "Action",
|
||||
key: "actions",
|
||||
title: 'Action',
|
||||
key: 'actions',
|
||||
render(row) {
|
||||
return [h(
|
||||
return [
|
||||
h(
|
||||
NButton,
|
||||
{
|
||||
strong: true,
|
||||
style: "margin-right:5px",
|
||||
style: 'margin-right:5px',
|
||||
tertiary: true,
|
||||
type: 'info',
|
||||
size: "small",
|
||||
onClick: () => EditAssSetting(row, "watermarkConfig")
|
||||
size: 'small',
|
||||
onClick: () => EditAssSetting(row, 'watermarkConfig')
|
||||
},
|
||||
{ default: () => "编辑" }
|
||||
), h(
|
||||
{ default: () => '编辑' }
|
||||
),
|
||||
h(
|
||||
NButton,
|
||||
{
|
||||
strong: true,
|
||||
tertiary: true,
|
||||
type: 'error',
|
||||
size: "small",
|
||||
size: 'small',
|
||||
onClick: () => DeleteWaterMarkSetting(row)
|
||||
},
|
||||
{ default: () => "删除" }
|
||||
)]
|
||||
{ default: () => '删除' }
|
||||
)
|
||||
]
|
||||
}
|
||||
})
|
||||
} else {
|
||||
return_data.push({
|
||||
title: "Action",
|
||||
key: "actions",
|
||||
title: 'Action',
|
||||
key: 'actions',
|
||||
render(row) {
|
||||
return [h(
|
||||
return [
|
||||
h(
|
||||
NButton,
|
||||
{
|
||||
strong: true,
|
||||
style: "margin-right:5px",
|
||||
style: 'margin-right:5px',
|
||||
tertiary: true,
|
||||
type: 'info',
|
||||
size: "small",
|
||||
onClick: () => EditAssSetting(row, "assConfig")
|
||||
size: 'small',
|
||||
onClick: () => EditAssSetting(row, 'assConfig')
|
||||
},
|
||||
{ default: () => "编辑" }
|
||||
), h(
|
||||
{ default: () => '编辑' }
|
||||
),
|
||||
h(
|
||||
NButton,
|
||||
{
|
||||
strong: true,
|
||||
tertiary: true,
|
||||
type: 'error',
|
||||
size: "small",
|
||||
size: 'small',
|
||||
onClick: () => DeleteAssSetting(row)
|
||||
},
|
||||
{ default: () => "删除" }
|
||||
)];
|
||||
{ default: () => '删除' }
|
||||
)
|
||||
]
|
||||
}
|
||||
})
|
||||
}
|
||||
return return_data;
|
||||
return return_data
|
||||
}
|
||||
|
||||
export default defineComponent({
|
||||
components: {
|
||||
NForm, NFormItem, NInput, useDialog,
|
||||
NInputNumber, NButton, NCard, NTabPane, NTabs,
|
||||
NSelect, NColorPicker, NDataTable, BackgroundMusic, NTooltip
|
||||
NForm,
|
||||
NFormItem,
|
||||
NInput,
|
||||
useDialog,
|
||||
NInputNumber,
|
||||
NButton,
|
||||
NCard,
|
||||
NTabPane,
|
||||
NTabs,
|
||||
NSelect,
|
||||
NColorPicker,
|
||||
NDataTable,
|
||||
BackgroundMusic,
|
||||
NTooltip,
|
||||
NCheckbox
|
||||
},
|
||||
setup() {
|
||||
let modifyRef = ref(null)
|
||||
let dialog = useDialog();
|
||||
let dialog = useDialog()
|
||||
let assSetting = ref({
|
||||
fontName: null,
|
||||
fontSize: 0,
|
||||
fontColor: "#3B7114",
|
||||
fontColor: '#3B7114',
|
||||
transparent: 0,
|
||||
positionX: 0,
|
||||
positionY: 0
|
||||
@ -285,7 +403,7 @@ export default defineComponent({
|
||||
showText: null,
|
||||
fontName: null,
|
||||
fontSize: 0,
|
||||
fontColor: "#3B7114",
|
||||
fontColor: '#3B7114',
|
||||
transparent: 0,
|
||||
positionX: 0,
|
||||
positionY: 0
|
||||
@ -304,11 +422,12 @@ export default defineComponent({
|
||||
audioSoundSize: 0,
|
||||
backgroundMusicSoundSize: 0,
|
||||
assConfig: [],
|
||||
watermarkConfig: []
|
||||
watermarkConfig: [],
|
||||
libx264: true
|
||||
})
|
||||
let message = useMessage();
|
||||
let fontNameOptions = ref([]);
|
||||
let keyframeOptions = ref([]);
|
||||
let message = useMessage()
|
||||
let fontNameOptions = ref([])
|
||||
let keyframeOptions = ref([])
|
||||
|
||||
/**
|
||||
* 获取视频设置的基本信息
|
||||
@ -317,47 +436,47 @@ export default defineComponent({
|
||||
// 获取基础数据
|
||||
await window.api.GetVideoConfigMessage((value) => {
|
||||
if (value.code == 0) {
|
||||
message.error(value.message);
|
||||
}
|
||||
else if (value.code == 1) {
|
||||
message.error(value.message)
|
||||
} else if (value.code == 1) {
|
||||
// 基础设置
|
||||
generalSetting.value = value.data;
|
||||
generalSetting.value.keyframe = generalSetting.value.keyframe ? generalSetting.value.keyframe : {}
|
||||
generalSetting.value = Object.assign(generalSetting.value, value.data)
|
||||
generalSetting.value.keyframe = generalSetting.value.keyframe
|
||||
? generalSetting.value.keyframe
|
||||
: {}
|
||||
// 字体下拉列表显示值
|
||||
fontNameOptions.value = value.data.font_name_list
|
||||
//
|
||||
} else {
|
||||
message.error("未知错误");
|
||||
message.error('未知错误')
|
||||
}
|
||||
})
|
||||
|
||||
await window.api.GetKeyFrameOptions(value => {
|
||||
await window.api.GetKeyFrameOptions((value) => {
|
||||
if (value.code == 0) {
|
||||
message.error(value.message);
|
||||
return;
|
||||
message.error(value.message)
|
||||
return
|
||||
}
|
||||
keyframeOptions.value = value.data.filter(item => item.value != "KFTypeScale");
|
||||
keyframeOptions.value = value.data.filter((item) => item.value != 'KFTypeScale')
|
||||
})
|
||||
}
|
||||
|
||||
onMounted(async () => {
|
||||
// 获取基础数据
|
||||
await GetVideoConfigMessage();
|
||||
await GetVideoConfigMessage()
|
||||
})
|
||||
/**
|
||||
* 保存基本配置
|
||||
*/
|
||||
async function SaveGeneralSetting() {
|
||||
debugger
|
||||
|
||||
await window.api.SaveGeneralSetting(toRaw(generalSetting.value), (value) => {
|
||||
console.log(value);
|
||||
console.log(value)
|
||||
if (value.code == 0) {
|
||||
window.api.showGlobalMessageDialog(value);
|
||||
}
|
||||
else if (value.code == 1) {
|
||||
window.api.showGlobalMessageDialog(value);
|
||||
window.api.showGlobalMessageDialog(value)
|
||||
} else if (value.code == 1) {
|
||||
window.api.showGlobalMessageDialog(value)
|
||||
} else {
|
||||
window.api.showGlobalMessageDialog({ code: 0, message: "未知错误" });
|
||||
window.api.showGlobalMessageDialog({ code: 0, message: '未知错误' })
|
||||
}
|
||||
})
|
||||
}
|
||||
@ -367,16 +486,16 @@ export default defineComponent({
|
||||
*/
|
||||
async function GetSystemInstallFontName() {
|
||||
await window.api.GetSystemInstallFontName(async (value) => {
|
||||
debugger;
|
||||
console.log(value);
|
||||
|
||||
console.log(value)
|
||||
if (value.code == 0) {
|
||||
message.error(value.message);
|
||||
message.error(value.message)
|
||||
} else if (value.code == 1) {
|
||||
message.success("保存成功");
|
||||
message.success('保存成功')
|
||||
// 刷新数据
|
||||
await GetVideoConfigMessage();
|
||||
await GetVideoConfigMessage()
|
||||
} else {
|
||||
message.error("未知错误")
|
||||
message.error('未知错误')
|
||||
}
|
||||
})
|
||||
}
|
||||
@ -385,20 +504,20 @@ export default defineComponent({
|
||||
* 保存字幕设置
|
||||
*/
|
||||
async function SaveAssConfig() {
|
||||
window.api.SaveAssConfig(["assConfig", toRaw(assSetting.value)], async (value) => {
|
||||
debugger
|
||||
console.log(value);
|
||||
window.api.SaveAssConfig(['assConfig', toRaw(assSetting.value)], async (value) => {
|
||||
|
||||
console.log(value)
|
||||
if (value.code == 1) {
|
||||
// 刷新数据,将上面的数据清零。
|
||||
await GetVideoConfigMessage();
|
||||
await GetVideoConfigMessage()
|
||||
// message.success("保存成功");
|
||||
window.api.showGlobalMessageDialog(value);
|
||||
window.api.showGlobalMessageDialog(value)
|
||||
} else if (value.code == 0) {
|
||||
// message.error(value.message);
|
||||
window.api.showGlobalMessageDialog(value);
|
||||
window.api.showGlobalMessageDialog(value)
|
||||
} else {
|
||||
// message.error("未知错误");
|
||||
window.api.showGlobalMessageDialog({ code: 0, message: "未知错误" })
|
||||
window.api.showGlobalMessageDialog({ code: 0, message: '未知错误' })
|
||||
}
|
||||
})
|
||||
}
|
||||
@ -409,14 +528,14 @@ export default defineComponent({
|
||||
*/
|
||||
async function DeleteAssSetting(row) {
|
||||
await window.api.DeleteVideoConfig(['assConfig', row.id], async (value) => {
|
||||
debugger;
|
||||
|
||||
console.log(value)
|
||||
if (value.code == 1) {
|
||||
message.success("删除成功");
|
||||
await GetVideoConfigMessage();
|
||||
message.success('删除成功')
|
||||
await GetVideoConfigMessage()
|
||||
return
|
||||
}
|
||||
message.error(value.message);
|
||||
message.error(value.message)
|
||||
})
|
||||
}
|
||||
|
||||
@ -424,16 +543,16 @@ export default defineComponent({
|
||||
* 保存水印设置
|
||||
*/
|
||||
async function SaveWaterMarkConfig() {
|
||||
window.api.SaveAssConfig(["watermarkConfig", toRaw(wmSetting.value)], async (value) => {
|
||||
console.log(value);
|
||||
window.api.SaveAssConfig(['watermarkConfig', toRaw(wmSetting.value)], async (value) => {
|
||||
console.log(value)
|
||||
if (value.code == 1) {
|
||||
// 刷新数据,将上面的数据清零。
|
||||
await GetVideoConfigMessage();
|
||||
window.api.showGlobalMessageDialog(value);
|
||||
await GetVideoConfigMessage()
|
||||
window.api.showGlobalMessageDialog(value)
|
||||
} else if (value.code == 0) {
|
||||
window.api.showGlobalMessageDialog(value);
|
||||
window.api.showGlobalMessageDialog(value)
|
||||
} else {
|
||||
window.api.showGlobalMessageDialog({ value: 0, message: "未知错误" })
|
||||
window.api.showGlobalMessageDialog({ value: 0, message: '未知错误' })
|
||||
}
|
||||
})
|
||||
}
|
||||
@ -442,16 +561,16 @@ export default defineComponent({
|
||||
* 删除指定的行
|
||||
*/
|
||||
async function DeleteWaterMarkSetting(row) {
|
||||
debugger
|
||||
|
||||
await window.api.DeleteVideoConfig(['watermarkConfig', row.id], async (value) => {
|
||||
debugger;
|
||||
|
||||
console.log(value)
|
||||
if (value.code == 1) {
|
||||
message.success("删除成功");
|
||||
await GetVideoConfigMessage();
|
||||
message.success('删除成功')
|
||||
await GetVideoConfigMessage()
|
||||
return
|
||||
}
|
||||
message.error(value.message);
|
||||
message.error(value.message)
|
||||
})
|
||||
}
|
||||
|
||||
@ -465,33 +584,36 @@ export default defineComponent({
|
||||
content: () => h(ModifyVideoAssSetting, { ref: modifyRef, initData: row, type: type }),
|
||||
style: `width : 700px;`,
|
||||
maskClosable: false,
|
||||
positiveText: "确定",
|
||||
negativeText: "取消",
|
||||
positiveText: '确定',
|
||||
negativeText: '取消',
|
||||
onPositiveClick: async () => {
|
||||
debugger;
|
||||
|
||||
let ss = modifyRef.value.wmSetting
|
||||
console.log(ss)
|
||||
|
||||
await window.api.SaveAssConfig([type, toRaw(modifyRef.value.wmSetting)], async (value) => {
|
||||
debugger;
|
||||
console.log(value);
|
||||
await window.api.SaveAssConfig(
|
||||
[type, toRaw(modifyRef.value.wmSetting)],
|
||||
async (value) => {
|
||||
|
||||
console.log(value)
|
||||
if (value.code == 0) {
|
||||
message.error(value.message);
|
||||
return;
|
||||
message.error(value.message)
|
||||
return
|
||||
}
|
||||
message.success("修改成功")
|
||||
message.success('修改成功')
|
||||
// 刷新数据,将上面的数据清零。
|
||||
await GetVideoConfigMessage();
|
||||
})
|
||||
await GetVideoConfigMessage()
|
||||
}
|
||||
)
|
||||
},
|
||||
onNegativeClick: async () => {
|
||||
await GetVideoConfigMessage();
|
||||
await GetVideoConfigMessage()
|
||||
},
|
||||
onClose: async () => {
|
||||
await GetVideoConfigMessage();
|
||||
await GetVideoConfigMessage()
|
||||
},
|
||||
onEsc: async () => {
|
||||
await GetVideoConfigMessage();
|
||||
await GetVideoConfigMessage()
|
||||
}
|
||||
})
|
||||
}
|
||||
@ -512,9 +634,11 @@ export default defineComponent({
|
||||
EditAssSetting,
|
||||
DeleteWaterMarkSetting
|
||||
}),
|
||||
wmColumns: createAssSettingColumns({ DeleteAssSetting, EditAssSetting, DeleteWaterMarkSetting }, true)
|
||||
wmColumns: createAssSettingColumns(
|
||||
{ DeleteAssSetting, EditAssSetting, DeleteWaterMarkSetting },
|
||||
true
|
||||
)
|
||||
}
|
||||
|
||||
}
|
||||
})
|
||||
</script>
|
||||
@ -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)
|
||||
|
||||
@ -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
18
src/stores/image.js
Normal 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
68
src/stores/prompt.js
Normal 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;
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
Loading…
x
Reference in New Issue
Block a user