diff --git a/.gitignore b/.gitignore
index feb5082..c113bdf 100644
--- a/.gitignore
+++ b/.gitignore
@@ -10,3 +10,4 @@ resources/project
Database
build
src/renderer/src/components/Original/MainHome/OriginalTaskCard.vue
+resources/image/预设
diff --git a/package.json b/package.json
index d72c595..a1c779e 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
"name": "laitool-pro",
"productName": "LaiToolPro",
- "version": "v3.4.7",
+ "version": "v3.4.8",
"description": "来推 Pro - 一款集音频处理、文案生成、图片生成、视频生成等功能于一体的多合一AI工具软件。",
"main": "./out/main/index.js",
"author": "xiangbei",
diff --git a/src/define/data/softwareData.ts b/src/define/data/softwareData.ts
index 1687be3..a3e191a 100644
--- a/src/define/data/softwareData.ts
+++ b/src/define/data/softwareData.ts
@@ -12,7 +12,9 @@ interface ISoftwareData {
/** 软件文档 */
softwareUrl: string
/** WIKI */
- wikiUrl: string
+ wikiUrl: string,
+ /** 授权文档 */
+ authUrl: string
}
/** MJ相关文档链接 */
mjDoc: {
@@ -35,7 +37,8 @@ export const SoftwareData: ISoftwareData = {
updateUrl: 'https://pvwu1oahp5m.feishu.cn/docx/CAjGdTDlboJ3nVx0cQccOuNHnvd',
softwareUrl: 'https://pvwu1oahp5m.feishu.cn/docx/FONZdfnrOoLlMrxXHV0czJ3jnkd',
wikiUrl:
- 'https://rvgyir5wk1c.feishu.cn/wiki/space/7481893355360190492?ccm_open_type=lark_wiki_spaceLink&open_tab_from=wiki_home'
+ 'https://rvgyir5wk1c.feishu.cn/wiki/space/7481893355360190492?ccm_open_type=lark_wiki_spaceLink&open_tab_from=wiki_home',
+ authUrl: "https://rvgyir5wk1c.feishu.cn/wiki/UUbrwAalJiq9BUkHymscD0E8nCc"
},
mjDoc: {
mjAPIDoc: 'https://rvgyir5wk1c.feishu.cn/wiki/OEj7wIdD6ivvCAkez4OcUPLcnIf',
diff --git a/src/i18n/locales/en.ts b/src/i18n/locales/en.ts
index 30764a8..e3bb9e0 100644
--- a/src/i18n/locales/en.ts
+++ b/src/i18n/locales/en.ts
@@ -988,6 +988,7 @@ export default {
'正在初始化预设库模块': "Initializing preset library module",
'释放添加图片': 'Release to add image',
'点击或拖拽添加图片': 'Click or drag to add image',
+ '仅支持图片格式': 'Only image formats supported',
'预设名称': 'Preset Name',
'请输入预设名称': 'Please enter preset name',
'预设分类': 'Preset Category',
@@ -1054,6 +1055,8 @@ export default {
'选择文件失败,{error}': 'Failed to select file, {error}',
"选择文件夹失败,{error}": "Failed to select folder, {error}",
"在相同类型下已存在当前的预设名字,请修改后再试!": "Preset name already exists under the same type, please modify and try again!",
+ "选择文件失败,无效的文件对象": "Failed to select file, invalid file object",
+ "选择文件失败,只能上传图片文件": "Failed to select file, only image files can be uploaded",
//#endregion
//#region 原创
diff --git a/src/i18n/locales/zh-cn.ts b/src/i18n/locales/zh-cn.ts
index 0637241..c4939d0 100644
--- a/src/i18n/locales/zh-cn.ts
+++ b/src/i18n/locales/zh-cn.ts
@@ -988,6 +988,7 @@ export default {
'正在初始化预设库模块': "正在初始化预设库模块",
'释放添加图片': '释放添加图片',
'点击或拖拽添加图片': '点击或拖拽添加图片',
+ '仅支持图片格式': '仅支持图片格式',
'预设名称': '预设名称',
'请输入预设名称': '请输入预设名称',
'预设分类': '预设分类',
@@ -1054,6 +1055,8 @@ export default {
'选择文件失败,{error}': '选择文件失败,{error}',
"选择文件夹失败,{error}": "选择文件夹失败,{error}",
"在相同类型下已存在当前的预设名字,请修改后再试!": "在相同类型下已存在当前的预设名字,请修改后再试!",
+ "选择文件失败,无效的文件对象": "选择文件失败,无效的文件对象",
+ "选择文件失败,只能上传图片文件": "选择文件失败,只能上传图片文件",
//#endregion
//#region 原创
diff --git a/src/renderer/src/components/Preset/AddOrModifyPreset.vue b/src/renderer/src/components/Preset/AddOrModifyPreset.vue
index 4cf22a0..ee93683 100644
--- a/src/renderer/src/components/Preset/AddOrModifyPreset.vue
+++ b/src/renderer/src/components/Preset/AddOrModifyPreset.vue
@@ -7,28 +7,32 @@
-
-
-
-
-
-
-
- {{ isDragging ? t('释放添加图片') : t('点击或拖拽添加图片') }}
-
-
+
+
+
+
+
+
+
+
+
+ {{ t('点击或拖拽添加图片') }}
+
{{ t('仅支持图片格式') }}
+
+
+
+
@@ -124,10 +128,12 @@ import {
NFormItem,
NButton,
NEmpty,
- NImageGroup
+ NImageGroup,
+ NUpload,
+ NUploadDragger
} from 'naive-ui'
import { getPresetCategoryOptions, PresetCategory } from '@/define/data/presetData'
-import { usePresetStore } from '@/renderer/src/stores'
+import { usePresetStore, useThemeStore } from '@/renderer/src/stores'
import StylePreset from './StylePreset.vue'
import ScenePreset from './ScenePreset.vue'
import CharacterPreset from './CharacterPreset.vue'
@@ -138,6 +144,7 @@ import { Trash } from '@vicons/ionicons5'
import { t } from '@/i18n'
const presetStore = usePresetStore()
+const themeStore = useThemeStore()
const presetCategoryRef = ref(PresetCategory)
@@ -146,80 +153,58 @@ const message = useMessage()
let categoryOptions = getPresetCategoryOptions()
-// 添加拖拽状态标志
-const isDragging = ref(false)
-
-// 打开文件选择器
-const openFileSelector = async () => {
- try {
- const res = await window.system.SelectMultipleFile(['jpg', 'png', 'jpeg', 'webp'])
- console.log('选择的文件:', res)
-
- if (res.code != 1) {
- message.error(res.message)
- return
- }
- if (res.data.length == 0) {
- message.error(t('没有选择任何文件'))
- return
- }
-
- // 处理选中的文件
- const newFiles = res.data.map((filePath) => {
- return `file://${filePath}` + `?${Date.now()}`
- })
-
- // 更新文件列表
- presetStore.selectPreset.showImage.push(...newFiles)
- } catch (error) {
- console.error('选择文件时出错:', error)
- message.error(t('选择文件失败,{error}', { error: error.message }))
+// 处理文件上传
+const handleUpload = ({ file, onFinish, onError }) => {
+ debugger
+ // 获取实际的文件对象
+ let actualFile = file
+ // 如果 file 有 file 属性,则使用该属性(Naive UI 的包装对象)
+ if (file.file && file.file instanceof File) {
+ actualFile = file.file
}
-}
-
-// 处理拖动开始悬停在上传区域
-const handleDragOver = (event) => {
- isDragging.value = true
- // 确保只接受文件
- if (event.dataTransfer) {
- event.dataTransfer.dropEffect = 'copy'
+ // 如果有 originFileObj 属性(某些上传组件的格式)
+ else if (file.originFileObj && file.originFileObj instanceof File) {
+ actualFile = file.originFileObj
+ }
+ // 如果直接就是 File 对象
+ else if (file instanceof File) {
+ actualFile = file
+ } else {
+ console.log('❌ 无法获取有效的 File 对象:', file)
+ message.error(t('选择文件失败,无效的文件对象'))
+ onError()
+ return
}
-}
-// 处理拖动离开上传区域
-const handleDragLeave = () => {
- isDragging.value = false
-}
+ // 检查是否是图片文件
+ if (!actualFile.type.startsWith('image/')) {
+ console.log('❌ 文件类型不符合要求:', actualFile.type)
+ message.error(t('选择文件失败,只能上传图片文件'))
+ onError()
+ return
+ }
-// 处理拖放文件 - 修改后的版本,不依赖主进程
-const handleDrop = (event) => {
- isDragging.value = false
+ // 读取文件的 base64 数据
+ const reader = new FileReader()
- // 获取拖放的文件
- const files = event.dataTransfer.files
-
- if (files.length > 0) {
- // 处理所有拖放的文件
- for (let i = 0; i < files.length; i++) {
- const file = files[i]
-
- // 检查是否是图片文件
- if (file.type.startsWith('image/')) {
- // 创建文件读取器,读取为Data URL
- const reader = new FileReader()
- reader.onload = (e) => {
- // 直接使用base64数据作为图片源
- const base64Data = e.target.result
-
- if (!presetStore.selectPreset.showImage) {
- presetStore.selectPreset.showImage = []
- }
- presetStore.selectPreset.showImage.push(base64Data)
- }
- reader.readAsDataURL(file)
- }
+ reader.onload = (e) => {
+ const base64Data = e.target.result
+ if (presetStore.selectPreset.showImage == null) {
+ presetStore.selectPreset.showImage = []
}
+ presetStore.selectPreset.showImage.push(base64Data)
+ message.success(t('已选择文件:{fileName}', { fileName: actualFile.name }))
+ onFinish()
}
+
+ reader.onerror = (e) => {
+ console.log('❌ 文件读取失败:', e)
+ message.error(t('文件读取失败'))
+ onError()
+ }
+
+ // 开始读取文件为 Data URL (base64)
+ reader.readAsDataURL(actualFile)
}
// 移除文件
@@ -291,6 +276,15 @@ const handleSave = async () => {
)
}
}
+
+// 这边做一个动态的主题色
+const borderColor = computed(() => {
+ return themeStore.menuPrimaryColor
+})
+// 背景色
+const backgroundColor = computed(() => {
+ return themeStore.menuPrimaryShadow
+})