chore: 初始化项目基础结构和资源文件
- 添加项目图标文件(app-icon.png、各平台图标) - 配置开发环境文件(.env、.nvmrc、.npmrc) - 添加静态资源文件(背景图片、字体、音频) - 初始化Tauri后端结构(build.rs、main.rs、模块文件) - 配置前端项目结构(TypeScript、Vue组件、样式) - 添加Node.js API服务基础结构 - 配置构建和开发工具(vite、prettier、gitignore)
This commit is contained in:
1
src-tauri/src/task/mod.rs
Normal file
1
src-tauri/src/task/mod.rs
Normal file
@ -0,0 +1 @@
|
||||
pub mod scheduled_restart;
|
||||
51
src-tauri/src/task/scheduled_restart.rs
Normal file
51
src-tauri/src/task/scheduled_restart.rs
Normal file
@ -0,0 +1,51 @@
|
||||
use once_cell::sync::OnceCell;
|
||||
use tauri::AppHandle;
|
||||
use tokio_cron_scheduler::{Job, JobScheduler};
|
||||
use tracing::info;
|
||||
|
||||
/// 全局调度器实例
|
||||
/// 使用 OnceCell 确保只创建一次,并在应用生命周期内保持活动
|
||||
static SCHEDULER: OnceCell<JobScheduler> = OnceCell::new();
|
||||
|
||||
/// 启动每日凌晨1点定时重启任务
|
||||
///
|
||||
/// 注意:此函数会启动一个后台任务,调度器会在后台持续运行
|
||||
/// 调度器的生命周期与应用程序相同
|
||||
pub async fn start_scheduled_restart_task(app_handle: AppHandle) -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
|
||||
// 如果调度器已经存在,直接返回
|
||||
if SCHEDULER.get().is_some() {
|
||||
info!("定时重启任务已经启动,跳过重复初始化");
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
// 创建调度器
|
||||
let scheduler = JobScheduler::new().await?;
|
||||
|
||||
// 创建每天凌晨1点执行的定时任务
|
||||
// cron表达式: "0 0 1 * * *" 表示每天1点0分0秒执行
|
||||
// 格式: sec min hour day_of_month month day_of_week
|
||||
let job = Job::new_async("0 0 1 * * *", move |_uuid, _l| {
|
||||
let app_handle_clone = app_handle.clone();
|
||||
Box::pin(async move {
|
||||
info!("定时重启任务已触发,正在重启应用程序...");
|
||||
|
||||
// 重启应用
|
||||
app_handle_clone.restart();
|
||||
|
||||
// 注意:由于重启操作会终止程序,下面的代码不会执行
|
||||
})
|
||||
})?;
|
||||
|
||||
// 添加任务到调度器
|
||||
scheduler.add(job).await?;
|
||||
|
||||
// 启动调度器
|
||||
scheduler.start().await?;
|
||||
|
||||
// 将调度器保存到全局静态变量中,确保其不会被清理
|
||||
SCHEDULER.set(scheduler).map_err(|_| "定时任务调度器已初始化")?;
|
||||
|
||||
info!("定时重启任务已启动 - 应用程序将在每天凌晨1点重启");
|
||||
|
||||
Ok(())
|
||||
}
|
||||
Reference in New Issue
Block a user