Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions src-tauri/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions src-tauri/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -23,3 +23,5 @@ tokio = "1.47.1"
uuid = { version = "1.17.0", features = ["v4"] }
tempfile = "3.0"
chrono = { version = "0.4", features = ["serde"] }
log = "0.4"
fern = "0.7.1"
6 changes: 3 additions & 3 deletions src-tauri/build.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
fn main() {
// 设置构建时间
let build_time = chrono::Utc::now()
.format("%Y-%m-%d %H:%M:%S UTC")
.to_string();
let utc_time = chrono::Utc::now();
let beijing_time = utc_time + chrono::Duration::hours(8);
let build_time = beijing_time.format("%Y年%m月%d日 %H:%M:%S").to_string();
println!("cargo:rustc-env=BUILD_TIME={}", build_time);

// 重新构建触发条件
Expand Down
Binary file modified src-tauri/icons/128x128.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified src-tauri/icons/32x32.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified src-tauri/icons/icon.icns
Binary file not shown.
Binary file modified src-tauri/icons/icon.ico
Binary file not shown.
Binary file modified src-tauri/icons/icon.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
44 changes: 44 additions & 0 deletions src-tauri/src/logger.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
use chrono::Local;
use log::LevelFilter;
use std::fs;
use tauri::{AppHandle, Manager};

pub fn setup_logger(app: &AppHandle) -> Result<(), fern::InitError> {
// 获取应用数据目录
let app_data_dir = app
.path()
.app_data_dir()
.expect("Failed to get app data dir");

// 创建日志目录
let log_dir = app_data_dir.join("logs");
fs::create_dir_all(&log_dir).expect("Failed to create log directory");

// 生成当天的日志文件名
let today = Local::now().format("%Y-%m-%d").to_string();
let log_file = log_dir.join(format!("codeforge-{}.log", today));

// 配置日志
fern::Dispatch::new()
.format(|out, message, record| {
out.finish(format_args!(
"[{}] [{}] [{}:{}] {}",
Local::now().format("%Y-%m-%d %H:%M:%S%.3f"),
record.level(),
record.file().unwrap_or("unknown"),
record.line().unwrap_or(0),
message
))
})
.level(LevelFilter::Debug) // 设置日志级别
.level_for("hyper", LevelFilter::Warn) // 减少第三方库的日志
.level_for("reqwest", LevelFilter::Warn)
.chain(std::io::stdout()) // 同时输出到控制台
.chain(fern::log_file(&log_file)?) // 输出到文件
.apply()?;

log::info!("日志系统初始化完成");
log::info!("日志文件: {:?}", log_file);

Ok(())
}
22 changes: 14 additions & 8 deletions src-tauri/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,12 @@
windows_subsystem = "windows"
)]

mod logger;
mod plugins;
mod setup;

use crate::setup::app::get_app_info;
use chrono::Utc;
use log::{debug, info};
use plugins::{CodeExecutionRequest, ExecutionResult, LanguageInfo, PluginManager};
use std::fs;
use std::process::{Command, Stdio};
Expand Down Expand Up @@ -55,8 +56,10 @@ async fn execute_code(
// 尝试不同的命令
for cmd in plugin.get_commands() {
let args = plugin.get_execute_args(file_path.to_str().unwrap());

println!("Trying command: {} with args: {:?}", cmd, args);
debug!(
"执行插件代码 -> 执行命令: {} 携带参数: {:?} 语言: {}",
cmd, args, request.language
);

let output = Command::new(cmd)
.args(&args)
Expand Down Expand Up @@ -148,8 +151,7 @@ async fn get_info(

// 尝试不同的命令
for cmd in plugin.get_commands() {
println!("Trying command: {} for language: {}", cmd, language);

debug!("获取插件信息 -> 执行命令: {} 语言: {}", cmd, language);
let version_output = Command::new(cmd).args(plugin.get_version_args()).output();

if let Ok(version_out) = version_output {
Expand Down Expand Up @@ -216,14 +218,18 @@ async fn clear_execution_history(history: State<'_, ExecutionHistory>) -> Result
}

fn main() {
let build_time = Utc::now().format("%Y-%m-%d %H:%M:%S UTC").to_string();
println!("cargo:rustc-env=BUILD_TIME={}", build_time);

tauri::Builder::default()
.plugin(tauri_plugin_shell::init())
.manage(ExecutionHistory::default())
.manage(PluginManagerState::new(PluginManager::new()))
.setup(|app| {
// 初始化日志系统
if let Err(e) = logger::setup_logger(app.handle()) {
eprintln!("Failed to setup logger: {}", e);
}
info!("CodeForge 应用启动");
info!("应用版本: {}", env!("CARGO_PKG_VERSION"));

let menu = setup::menu::create_menu(app.handle())?;
app.set_menu(menu)?;
setup::menu::setup_menu_handler(app.handle());
Expand Down
25 changes: 13 additions & 12 deletions src-tauri/src/setup/menu.rs
Original file line number Diff line number Diff line change
@@ -1,26 +1,27 @@
use super::menus;

use tauri::{
AppHandle, Emitter,
menu::{Menu, MenuBuilder, MenuItemBuilder, SubmenuBuilder},
AppHandle,
menu::{Menu, MenuBuilder},
};

pub fn create_menu(app: &AppHandle) -> tauri::Result<Menu<tauri::Wry>> {
let about_item = MenuItemBuilder::new("关于 CodeForge")
.id("about")
.build(app)?;
// 应用菜单
let app_submenu = menus::app::create_app_submenu(app)?;

let app_submenu = SubmenuBuilder::new(app, "CodeForge")
.item(&about_item)
.build()?;
// 编辑菜单
let edit_submenu = menus::edit::create_edit_submenu(app)?;

let menu = MenuBuilder::new(app).items(&[&app_submenu]).build()?;
let menu = MenuBuilder::new(app)
.items(&[&app_submenu, &edit_submenu])
.build()?;

Ok(menu)
}

pub fn setup_menu_handler(app: &AppHandle) {
app.on_menu_event(move |app, event| {
if event.id().as_ref() == "about" {
let _event = app.emit("show-about", ());
}
menus::app::handle_app_menu_event(app, event.id().as_ref());
menus::edit::handle_edit_menu_event(app, event.id().as_ref());
});
}
35 changes: 35 additions & 0 deletions src-tauri/src/setup/menus/app.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
use tauri::{
AppHandle, Emitter,
menu::{MenuItemBuilder, Submenu, SubmenuBuilder},
};

pub fn create_app_submenu(app: &AppHandle) -> tauri::Result<Submenu<tauri::Wry>> {
let about_item = MenuItemBuilder::new("关于 CodeForge")
.id("about")
.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(&quit_item)
.build()?;

Ok(app_submenu)
}

pub fn handle_app_menu_event(app: &AppHandle, event_id: &str) {
match event_id {
"about" => {
let _event = app.emit("show-about", ());
}
"quit" => {
app.exit(0);
}
_ => {}
}
}
70 changes: 70 additions & 0 deletions src-tauri/src/setup/menus/edit.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
use tauri::menu::PredefinedMenuItem;

use tauri::{
AppHandle, Manager,
menu::{MenuItemBuilder, Submenu, SubmenuBuilder},
};

pub fn create_edit_submenu(app: &AppHandle) -> tauri::Result<Submenu<tauri::Wry>> {
let undo_item = MenuItemBuilder::new("撤销")
.id("undo")
.accelerator("CmdOrCtrl+Z")
.build(app)?;

let redo_item = MenuItemBuilder::new("重做")
.id("redo")
.accelerator("CmdOrCtrl+Shift+Z")
.build(app)?;

let cut_item = MenuItemBuilder::new("剪切")
.id("cut")
.accelerator("CmdOrCtrl+X")
.build(app)?;

let copy_item = MenuItemBuilder::new("复制")
.id("copy")
.accelerator("CmdOrCtrl+C")
.build(app)?;

let select_all_item = MenuItemBuilder::new("全选")
.id("select_all")
.accelerator("CmdOrCtrl+A")
.build(app)?;

let edit_submenu = SubmenuBuilder::new(app, "编辑")
.item(&undo_item)
.item(&redo_item)
.separator()
.item(&cut_item)
.item(&copy_item)
.item(&PredefinedMenuItem::paste(app, Option::from("粘贴"))?)
.separator()
.item(&select_all_item)
.build()?;

Ok(edit_submenu)
}

pub fn handle_edit_menu_event(app: &AppHandle, event_id: &str) {
let binding = app.webview_windows();
let webview = binding.values().next().unwrap();

match event_id {
"undo" => {
webview.eval("document.execCommand('undo')").ok();
}
"redo" => {
webview.eval("document.execCommand('redo')").ok();
}
"cut" => {
webview.eval("document.execCommand('cut')").ok();
}
"copy" => {
webview.eval("document.execCommand('copy')").ok();
}
"select_all" => {
webview.eval("document.execCommand('selectAll')").ok();
}
_ => {}
}
}
2 changes: 2 additions & 0 deletions src-tauri/src/setup/menus/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
pub mod app;
pub mod edit;
1 change: 1 addition & 0 deletions src-tauri/src/setup/mod.rs
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
pub mod app;
pub mod menu;
pub mod menus;
Loading