const { ipcRenderer } = require('electron'); const { dialog } = require('@electron/remote'); // 辅助函数:获取文件名 (保留扩展名) function get_filename(filePath) { if (!filePath) return ""; return filePath.split(/[/\\]/).pop(); } let s_lan = "zh"; function language_str(str) { let t = { "noFile": { zh: "当前文件不存在!", ozh: "This file does not exist!", en: "File not found!" }, "saveTime": { zh: "保存时间:", ozh: "保存時間:", en: "Saved on:" }, "selectFile": { zh: "请选择文件", ozh: "請選擇文件", en: "Please select a file" }, "comfirm": { zh: "确认", ozh: "確認", en: "Confirm" }, "cancel": { zh: "取消", ozh: "取消", en: "Cancel" }, "SDFile": { zh: "SoonDesign模板文件", ozh: "SoonDesign模闆文件", en: "SoonDesign Template File" }, "vers": { zh: "版本:", ozh: "版本:", en: "Version:" }, "copyright": { zh: "版权所有 © 2023", ozh: "版權所有 © 2023", en: "Copyright © 2023" }, "about": { zh: "关于 SoonDesign", ozh: "關於 SoonDesign", en: "About SoonDesign" }, "lost": { zh: "(文件已丢失)", ozh: "(文件已丟失)", en: "(File Lost)" }, "clickToDelete": { zh: "文件已丢失,点击删除此记录", ozh: "文件已丟失,點擊刪除此記錄", en: "File lost, click to remove" }, "deleted": { zh: "已删除", ozh: "已刪除", en: "Deleted" }, "whetherSave": { zh: "是否保存当前文件?", ozh: "是否保存當前文件?", en: "Save current file?" }, // 补全可能用到的翻译 "delTitle": { zh: "警告", ozh: "警告", en: "Warning" }, "delContent": { zh: "文件已丢失,确认是否删除?", ozh: "文件已丟失,確認是否刪除?", en: "File lost, confirm delete?" } } return t[str][s_lan] || t[str]['zh']; } layui.use(['layer', 'form', 'jquery'], function () { var $ = layui.$; var layer = layui.layer , form = layui.form; if (window.sysAPI && window.sysAPI.getAppVersion) { window.sysAPI.getAppVersion().then(ver => { $("#app-version").text("v" + ver); }).catch(e => console.log(e)); } ipcRenderer.send('get-sys-language'); ipcRenderer.on('close', (event, message) => { ipcRenderer.send('run-close'); }) function langua_ge(lan = 'zh') { $("[language='m']").each(function (i) { $(this).html($(this).attr(lan)); }) $("[language='t']").each(function (i) { $(this).attr("title", $(this).attr(lan)); }) } $('#language_select').on('change', function () { langua_ge($(this).find('option:selected').val()); s_lan = $(this).find('option:selected').val(); localStorage.setItem("lang", s_lan); loadHistory(); }); ipcRenderer.on('sys-lan', (event, data) => { let lang = localStorage.getItem("lang"); if (lang) { s_lan = lang; } else { if (data.startsWith('zh')) { s_lan = data === 'zh-TW' ? 'ozh' : 'zh'; } else { s_lan = 'en'; } } langua_ge(s_lan); $("#language_select").val(s_lan); localStorage.setItem("lang", s_lan); loadHistory(); }); // ========================================== // 加载列表 // ========================================== async function loadHistory() { try { const j = await window.sysAPI.readHistory(); let h = ""; let needUpdate = false; for (let item of j.history) { let src = ""; let fileExists = true; let imgStyle = ""; let realType = item.type; const soonData = await window.sysAPI.readJsonFile(item.path); if (soonData) { src = soonData.frontDisplayPic; let fileType = soonData.soonType ? soonData.soonType : (soonData.backBlackPic ? 2 : 1); if (item.type != fileType) { item.type = fileType; realType = fileType; needUpdate = true; } } else { fileExists = false; if (realType && (realType == 2 || realType == "2")) { src = "./public/images/bg_2.png"; } else { src = "./public/images/bg_1.png"; } imgStyle = "opacity: 0.6; filter: grayscale(100%);"; } let displayName = get_filename(item.path); let cardTitle = item.path; let cardStyle = ""; if (!fileExists) { displayName += ` ${language_str("lost")}`; cardTitle = language_str("clickToDelete"); cardStyle = "border: 1px dashed #ff5722;"; } h += `
${displayName}
` } $(".card-list").html(h); if (needUpdate) { await window.sysAPI.writeHistory({ history: j.history }); } } catch (e) { console.error("加载历史记录出错", e); } } // 按钮事件 $("#openfile").click(function () { OpenDialog(); }); $("#new1").click(function () { // 这里如果你也想改成和保存一样的弹窗逻辑,可以在这里加 ipcRenderer.send('open-design-page', "", 1); }); $("#new2").click(function () { ipcRenderer.send('open-design-page', "", 2); }); $("#about").click(async function () { let version = "3.0.0"; try { if (window.sysAPI && window.sysAPI.getAppVersion) { const v = await window.sysAPI.getAppVersion(); version = "v" + v; } } catch (e) {} layer.open({ type: 1 , title: language_str("about") , area: '450px;' , id: 'LAY_layuipro' , moveType: 1 , content: '
' + '
' + '
Soon Design
' + '
' + language_str("vers") + ' ' + version + '
' + '
' + language_str("copyright") + '
' + '
' }); }); // ========================================== // 点击事件 (修改后:完全匹配“保存”弹窗样式) // ========================================== $(".card-list").on("click", '.card', async function () { let filePath = $(this).attr("data"); // 再次检查文件是否存在 const soonData = await window.sysAPI.readJsonFile(filePath); if (soonData) { // 1. 文件存在 -> 正常打开 let type = soonData.soonType ? soonData.soonType : (soonData.backBlackPic ? 2 : 1); const currentData = await window.sysAPI.readHistory(); let newHistory = currentData.history.filter(item => item.path !== filePath); newHistory.unshift({ path: filePath, time: Date.now(), type: type }); await window.sysAPI.writeHistory({ history: newHistory }); ipcRenderer.send('open-design-page', filePath, type); } else { // 2. 文件不存在 -> 警告确认 // 【关键修改】 // - 纯文字,左对齐 (text-align: left) // - 适当的 padding // - 去除所有图标 let contentHtml = `
${language_str("delContent")}
`; // 使用 layer.open layer.open({ type: 1, title: language_str("delTitle"), // 标题:警告 content: contentHtml, btn: [language_str("comfirm"), language_str("cancel")], btnAlign: 'r', // 【关键修改】按钮右对齐 area: ['300px', 'auto'], // 【关键修改】宽度设为 300px,标准小窗口 resize: false, shadeClose: true, yes: async function(index){ const currentData = await window.sysAPI.readHistory(); const newHistory = currentData.history.filter(item => item.path !== filePath); if (newHistory.length !== currentData.history.length) { await window.sysAPI.writeHistory({ history: newHistory }); layer.msg(language_str("deleted"), { icon: 1, time: 1000 }); loadHistory(); } layer.close(index); } }); } }); function OpenDialog() { dialog.showOpenDialog({ title: language_str("selectFile"), buttonLabel: language_str("comfirm"), filters: [ { name: language_str("SDFile"), extensions: ['soon'] }, ] }).then(async (result) => { if (result.canceled || !result.filePaths[0]) return; let filePath = result.filePaths[0]; const soonData = await window.sysAPI.readJsonFile(filePath); if (!soonData) { layer.msg(language_str("noFile")); return; } let type = soonData.soonType ? soonData.soonType : (soonData.backBlackPic ? 2 : 1); const currentData = await window.sysAPI.readHistory(); let newHistory = currentData.history.filter(item => item.path !== filePath); newHistory.unshift({ path: filePath, time: Date.now(), type: type }); await window.sysAPI.writeHistory({ history: newHistory }); ipcRenderer.send('open-design-page', filePath, type); loadHistory(); }).catch(err => { console.log(err) }) } });