From 41f1f71479923801306c0de84907d2c6e5efb395 Mon Sep 17 00:00:00 2001 From: qianmoQ Date: Mon, 11 Aug 2025 15:25:43 +0800 Subject: [PATCH 1/8] =?UTF-8?q?feat=20(core):=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=E6=97=A5=E5=BF=97=E8=A7=84=E5=88=99=E5=8F=8A?= =?UTF-8?q?=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src-tauri/src/utils/logger.rs | 39 +++++++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/src-tauri/src/utils/logger.rs b/src-tauri/src/utils/logger.rs index 8888d704..230ab157 100644 --- a/src-tauri/src/utils/logger.rs +++ b/src-tauri/src/utils/logger.rs @@ -95,7 +95,7 @@ pub async fn reset_log_directory(_app: AppHandle) -> Result<(), String> { } // 获取日志文件列表 -#[command] +#[tauri::command] pub async fn get_log_files(app: AppHandle) -> Result, String> { let log_dir = { let guard = LOG_DIRECTORY.lock().unwrap(); @@ -106,22 +106,49 @@ pub async fn get_log_files(app: AppHandle) -> Result, String> { }; info!("获取日志 -> 日志目录为: {}", log_dir.display()); + // 获取今天的日期字符串 + let today = chrono::Local::now().format("%Y-%m-%d").to_string(); + info!("获取日志 -> 查找今天({})的日志文件", today); + let mut log_files = Vec::new(); if let Ok(entries) = std::fs::read_dir(&log_dir) { for entry in entries.flatten() { if let Some(filename) = entry.file_name().to_str() { - if filename.ends_with(".log") && filename.starts_with("codeforge-") { + if filename.ends_with(".log") + && filename.starts_with("codeforge-") + && filename.contains(&today) + { log_files.push(filename.to_string()); - info!("获取日志 -> 发现日志文件: {}", filename); + info!("获取日志 -> 发现今天的日志文件: {}", filename); } } } } - info!("获取日志 -> 找到 {} 个日志文件", log_files.len()); - log_files.sort(); - log_files.reverse(); // 最新的在前面 + info!("获取日志 -> 找到 {} 个今天的日志文件", log_files.len()); + + // 按日志级别排序:error -> warn -> info -> debug -> 普通日志 + log_files.sort_by(|a, b| { + let get_priority = |filename: &str| -> u8 { + if filename.contains("-info-") { + 1 + } else if filename.contains("-warn-") { + 2 + } else if filename.contains("-error-") { + 3 + } else if filename.contains("-debug-") { + 4 + } else { + 0 + } + }; + + let priority_a = get_priority(a); + let priority_b = get_priority(b); + + priority_a.cmp(&priority_b).then_with(|| a.cmp(b)) + }); Ok(log_files) } From 933ea54dfce39918a8c7d796066f6b77e8f43ab6 Mon Sep 17 00:00:00 2001 From: qianmoQ Date: Mon, 11 Aug 2025 16:02:19 +0800 Subject: [PATCH 2/8] =?UTF-8?q?feat=20(core):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=8A=A0=E8=BD=BD=E5=8A=A8=E7=94=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- index.html | 147 ++++++++++++++++++++++++++++++++++++++ src-tauri/tauri.conf.json | 1 + src/App.vue | 3 + 3 files changed, 151 insertions(+) diff --git a/index.html b/index.html index 71404bfc..259f98af 100644 --- a/index.html +++ b/index.html @@ -5,10 +5,157 @@ CodeForge + + +
+ +

CodeForge

+

轻量级代码执行器

+
+
+
+
+
+
+ +
+ + diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 29de561c..b1e6a010 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -17,6 +17,7 @@ "minHeight": 600, "width": 1800, "height": 1200, + "center": true, "additionalBrowserArgs": "--disable-context-menu" } ], diff --git a/src/App.vue b/src/App.vue index 9cae3880..19ec9d28 100644 --- a/src/App.vue +++ b/src/App.vue @@ -448,6 +448,9 @@ onMounted(async () => { unlistenExecutionStoppedFn = await listen('code-execution-stopped', handleExecutionStopped) unlistenExecutionTimeoutFn = await listen('code-execution-timeout', handleExecutionTimeout) unlistenExecutionErrorFn = await listen('code-execution-error', handleExecutionError) + + // 触发 app-ready 事件,通知主进程 + window.dispatchEvent(new CustomEvent('app-ready')) }) onUnmounted(() => { From 5c777ccc1e22a2d239aed46bd9cf4d67b96fab80 Mon Sep 17 00:00:00 2001 From: qianmoQ Date: Mon, 11 Aug 2025 16:34:06 +0800 Subject: [PATCH 3/8] =?UTF-8?q?fix=20(core):=20=E4=BF=AE=E5=A4=8D=E6=97=A0?= =?UTF-8?q?=E8=BE=93=E5=87=BA=E4=BB=A3=E7=A0=81=E6=9C=AA=E5=8F=8D=E9=A6=88?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src-tauri/src/execution.rs | 14 ++++++++++++++ src-tauri/src/plugins/mod.rs | 12 +++++++++++- src/App.vue | 3 ++- 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src-tauri/src/execution.rs b/src-tauri/src/execution.rs index 831445aa..b0329e68 100644 --- a/src-tauri/src/execution.rs +++ b/src-tauri/src/execution.rs @@ -343,6 +343,20 @@ pub async fn execute_code( let _ = plugin.post_execute_hook(&mut result); + if result.success + && result.stdout == String::from("END-NO-OUTPUT") + && result.stderr == String::from("END-NO-OUTPUT") + { + let _ = app.emit( + "code-output", + serde_json::json!({ + "type": "stdout", + "content": "代码执行成功 (无输出)", + "language": request.language + }), + ); + } + let _ = app.emit( "code-execution-complete", serde_json::json!({ diff --git a/src-tauri/src/plugins/mod.rs b/src-tauri/src/plugins/mod.rs index f0035042..a1ff9deb 100644 --- a/src-tauri/src/plugins/mod.rs +++ b/src-tauri/src/plugins/mod.rs @@ -295,10 +295,20 @@ pub trait LanguagePlugin: Send + Sync { // 后执行钩子 fn post_execute_hook(&self, result: &mut ExecutionResult) -> Result<(), String> { + info!( + "执行代码 -> 插件 [ {} ] 处理 post_execute_hook 开始", + self.get_language_key() + ); + if result.success && result.stdout.is_empty() && result.stderr.is_empty() { - result.stdout = "代码执行成功 (无输出)".to_string(); + result.stdout = String::from("END-NO-OUTPUT"); + result.stderr = String::from("END-NO-OUTPUT"); } + info!( + "执行代码 -> 插件 [ {} ] 处理 post_execute_hook 结束", + self.get_language_key() + ); Ok(()) } } diff --git a/src/App.vue b/src/App.vue index 19ec9d28..e7eb2265 100644 --- a/src/App.vue +++ b/src/App.vue @@ -338,6 +338,7 @@ const clearOutput = () => { // 处理实时输出 const handleRealtimeOutput = (event: any) => { const data: CodeOutputEvent = event.payload + console.log('实时输出:', data) // 只处理当前语言的输出 if (data.language !== currentLanguage.value) { @@ -415,7 +416,7 @@ const handleExecutionError = (event: any) => { } // 禁用右键菜单 -window.addEventListener('contextmenu', (e) => e.preventDefault(), false) +// window.addEventListener('contextmenu', (e) => e.preventDefault(), false) onMounted(async () => { await getSupportedLanguages() From 6c50df2c30bbd0277e043d5895aae6780afb19a3 Mon Sep 17 00:00:00 2001 From: qianmoQ Date: Mon, 11 Aug 2025 17:01:39 +0800 Subject: [PATCH 4/8] =?UTF-8?q?feat=20(core):=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E6=89=93=E5=BC=80=E8=B0=83=E8=AF=95=E5=99=A8=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src-tauri/src/setup/menu.rs | 6 +++++- src-tauri/src/setup/menus/developer.rs | 29 ++++++++++++++++++++++++++ src-tauri/src/setup/menus/mod.rs | 1 + src/App.vue | 2 +- 4 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 src-tauri/src/setup/menus/developer.rs diff --git a/src-tauri/src/setup/menu.rs b/src-tauri/src/setup/menu.rs index 85ad74a0..0327d6d9 100644 --- a/src-tauri/src/setup/menu.rs +++ b/src-tauri/src/setup/menu.rs @@ -12,8 +12,11 @@ pub fn create_menu(app: &AppHandle) -> tauri::Result> { // 编辑菜单 let edit_submenu = menus::edit::create_edit_submenu(app)?; + // 开发者菜单 + let developer_submenu = menus::developer::create_developer_submenu(app)?; + let menu = MenuBuilder::new(app) - .items(&[&app_submenu, &edit_submenu]) + .items(&[&app_submenu, &edit_submenu, &developer_submenu]) .build()?; Ok(menu) @@ -23,5 +26,6 @@ pub fn setup_menu_handler(app: &AppHandle) { app.on_menu_event(move |app, event| { menus::app::handle_app_menu_event(app, event.id().as_ref()); menus::edit::handle_edit_menu_event(app, event.id().as_ref()); + menus::developer::handle_developer_menu_event(app, event.id().as_ref()); }); } diff --git a/src-tauri/src/setup/menus/developer.rs b/src-tauri/src/setup/menus/developer.rs new file mode 100644 index 00000000..25f38f37 --- /dev/null +++ b/src-tauri/src/setup/menus/developer.rs @@ -0,0 +1,29 @@ +use log::info; +use tauri::{ + AppHandle, Manager, + menu::{MenuItemBuilder, Submenu, SubmenuBuilder}, +}; + +pub fn create_developer_submenu(app: &AppHandle) -> tauri::Result> { + let devtools_item = MenuItemBuilder::new("打开调试器") + .id("open-devtools") + .build(app)?; + + let developer_submenu = SubmenuBuilder::new(app, "开发者模式") + .item(&devtools_item) + .build()?; + + Ok(developer_submenu) +} + +pub fn handle_developer_menu_event(app: &AppHandle, event_id: &str) { + match event_id { + "open-devtools" => { + info!("开发者 -> 打开调试器"); + if let Some(window) = app.get_webview_window("main") { + let _ = window.open_devtools(); + } + } + _ => {} + } +} diff --git a/src-tauri/src/setup/menus/mod.rs b/src-tauri/src/setup/menus/mod.rs index fe00cba3..74214b49 100644 --- a/src-tauri/src/setup/menus/mod.rs +++ b/src-tauri/src/setup/menus/mod.rs @@ -1,2 +1,3 @@ pub mod app; pub mod edit; +pub mod developer; diff --git a/src/App.vue b/src/App.vue index e7eb2265..927f7726 100644 --- a/src/App.vue +++ b/src/App.vue @@ -416,7 +416,7 @@ const handleExecutionError = (event: any) => { } // 禁用右键菜单 -// window.addEventListener('contextmenu', (e) => e.preventDefault(), false) +window.addEventListener('contextmenu', (e) => e.preventDefault(), false) onMounted(async () => { await getSupportedLanguages() From 32cf5d667fc5e6ebaf1ef9f0329ce42307669bd8 Mon Sep 17 00:00:00 2001 From: qianmoQ Date: Mon, 11 Aug 2025 17:10:10 +0800 Subject: [PATCH 5/8] =?UTF-8?q?feat=20(core):=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E9=87=8D=E6=96=B0=E5=8A=A0=E8=BD=BD=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src-tauri/src/setup/menus/developer.rs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src-tauri/src/setup/menus/developer.rs b/src-tauri/src/setup/menus/developer.rs index 25f38f37..5d693a6e 100644 --- a/src-tauri/src/setup/menus/developer.rs +++ b/src-tauri/src/setup/menus/developer.rs @@ -5,11 +5,18 @@ use tauri::{ }; pub fn create_developer_submenu(app: &AppHandle) -> tauri::Result> { + let reload_item = MenuItemBuilder::new("重新加载") + .id("reload-window") + .accelerator("CmdOrCtrl+R") + .build(app)?; + let devtools_item = MenuItemBuilder::new("打开调试器") .id("open-devtools") + .accelerator("CmdOrCtrl+Shift+I") .build(app)?; let developer_submenu = SubmenuBuilder::new(app, "开发者模式") + .item(&reload_item) .item(&devtools_item) .build()?; @@ -18,6 +25,12 @@ pub fn create_developer_submenu(app: &AppHandle) -> tauri::Result { + info!("开发者 -> 重新加载"); + if let Some(window) = app.get_webview_window("main") { + let _ = window.reload(); + } + } "open-devtools" => { info!("开发者 -> 打开调试器"); if let Some(window) = app.get_webview_window("main") { From db583329c2d88bde93bf081e49b7f98a5eaf5c6b Mon Sep 17 00:00:00 2001 From: qianmoQ Date: Mon, 11 Aug 2025 17:46:38 +0800 Subject: [PATCH 6/8] =?UTF-8?q?fix=20(core):=20=E4=BF=AE=E5=A4=8D=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E5=BC=95=E5=85=A5=E9=A1=BA=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src-tauri/src/setup/menus/app.rs | 20 +++++++++++++++----- src-tauri/src/setup/menus/developer.rs | 2 +- src-tauri/src/setup/menus/mod.rs | 2 +- src-tauri/tauri.conf.json | 1 + 4 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src-tauri/src/setup/menus/app.rs b/src-tauri/src/setup/menus/app.rs index 55b39230..92efcd57 100644 --- a/src-tauri/src/setup/menus/app.rs +++ b/src-tauri/src/setup/menus/app.rs @@ -9,21 +9,27 @@ pub fn create_app_submenu(app: &AppHandle) -> tauri::Result> .id("about") .build(app)?; - let quit_item = MenuItemBuilder::new("退出 CodeForge") - .id("quit") - .accelerator("CmdOrCtrl+Q") - .build(app)?; - let settings_item = MenuItemBuilder::new("设置") .id("settings") .accelerator("CmdOrCtrl+,") .build(app)?; + let restart_item = MenuItemBuilder::new("重启 CodeForge") + .id("restart") + .accelerator("CmdOrCtrl+R") + .build(app)?; + + let quit_item = MenuItemBuilder::new("退出 CodeForge") + .id("quit") + .accelerator("CmdOrCtrl+Q") + .build(app)?; + let app_submenu = SubmenuBuilder::new(app, "CodeForge") .item(&about_item) .separator() .item(&settings_item) .separator() + .item(&restart_item) .item(&quit_item) .build()?; @@ -38,6 +44,10 @@ pub fn handle_app_menu_event(app: &AppHandle, event_id: &str) { "settings" => { let _event = app.emit("show-settings", ()); } + "restart" => { + info!("CodeForge 应用重启"); + app.restart(); + } "quit" => { info!("CodeForge 应用关闭"); app.exit(0); diff --git a/src-tauri/src/setup/menus/developer.rs b/src-tauri/src/setup/menus/developer.rs index 5d693a6e..83abe895 100644 --- a/src-tauri/src/setup/menus/developer.rs +++ b/src-tauri/src/setup/menus/developer.rs @@ -7,7 +7,7 @@ use tauri::{ pub fn create_developer_submenu(app: &AppHandle) -> tauri::Result> { let reload_item = MenuItemBuilder::new("重新加载") .id("reload-window") - .accelerator("CmdOrCtrl+R") + .accelerator("CmdOrCtrl+Shift+R") .build(app)?; let devtools_item = MenuItemBuilder::new("打开调试器") diff --git a/src-tauri/src/setup/menus/mod.rs b/src-tauri/src/setup/menus/mod.rs index 74214b49..816ce03f 100644 --- a/src-tauri/src/setup/menus/mod.rs +++ b/src-tauri/src/setup/menus/mod.rs @@ -1,3 +1,3 @@ pub mod app; -pub mod edit; pub mod developer; +pub mod edit; diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index b1e6a010..ee9eaaca 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -18,6 +18,7 @@ "width": 1800, "height": 1200, "center": true, + "devtools": true, "additionalBrowserArgs": "--disable-context-menu" } ], From 43242f6f2c3d0f43139bd417b309e319b059e1c4 Mon Sep 17 00:00:00 2001 From: qianmoQ Date: Mon, 11 Aug 2025 17:53:25 +0800 Subject: [PATCH 7/8] =?UTF-8?q?fix=20(core):=20=E4=BF=AE=E5=A4=8D=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E4=BD=BF=E7=94=A8=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src-tauri/src/execution.rs | 4 ++-- src-tauri/src/setup/menus/developer.rs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src-tauri/src/execution.rs b/src-tauri/src/execution.rs index b0329e68..3e6178f9 100644 --- a/src-tauri/src/execution.rs +++ b/src-tauri/src/execution.rs @@ -344,8 +344,8 @@ pub async fn execute_code( let _ = plugin.post_execute_hook(&mut result); if result.success - && result.stdout == String::from("END-NO-OUTPUT") - && result.stderr == String::from("END-NO-OUTPUT") + && result.stdout == *"END-NO-OUTPUT" + && result.stderr == *"END-NO-OUTPUT" { let _ = app.emit( "code-output", diff --git a/src-tauri/src/setup/menus/developer.rs b/src-tauri/src/setup/menus/developer.rs index 83abe895..a9301620 100644 --- a/src-tauri/src/setup/menus/developer.rs +++ b/src-tauri/src/setup/menus/developer.rs @@ -34,7 +34,7 @@ pub fn handle_developer_menu_event(app: &AppHandle, event_id: &str) { "open-devtools" => { info!("开发者 -> 打开调试器"); if let Some(window) = app.get_webview_window("main") { - let _ = window.open_devtools(); + window.open_devtools(); } } _ => {} From 4fcc0f923eb1876fc4e878d8463817f36b6155d2 Mon Sep 17 00:00:00 2001 From: qianmoQ Date: Mon, 11 Aug 2025 18:11:57 +0800 Subject: [PATCH 8/8] =?UTF-8?q?fix=20(core):=20=E4=BF=AE=E5=A4=8D=E5=BC=80?= =?UTF-8?q?=E5=8F=91=E8=80=85=E6=A8=A1=E5=BC=8F=E5=BC=82=E5=B8=B8=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src-tauri/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 27a3ff4a..a85cfa1b 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -14,7 +14,7 @@ tauri-build = { version = "2", features = [] } chrono = { version = "0.4.41", features = ["serde"] } [dependencies] -tauri = { version = "2", features = [] } +tauri = { version = "2", features = ["devtools"] } tauri-plugin-opener = "2" tauri-plugin-shell = "2.0" tauri-plugin-dialog = "2.0"