fix: fix same name error

This commit is contained in:
sangge 2025-06-08 18:37:03 +08:00
parent 9872a9a5b0
commit 9f3b3bc63f
3 changed files with 65 additions and 11 deletions

View File

@ -37,6 +37,7 @@ struct Anniversary {
title: String, title: String,
start_date: String, start_date: String,
days: i64, days: i64,
days_display: String,
} }
#[tauri::command] #[tauri::command]
async fn get_anniversaries(app_handle: tauri::AppHandle) -> Result<Vec<Anniversary>, String> { async fn get_anniversaries(app_handle: tauri::AppHandle) -> Result<Vec<Anniversary>, String> {
@ -60,16 +61,28 @@ async fn get_anniversaries(app_handle: tauri::AppHandle) -> Result<Vec<Anniversa
let title: String = row.get(1)?; let title: String = row.get(1)?;
let start_date: String = row.get(2)?; let start_date: String = row.get(2)?;
// 计算天数 // 计算天数,跳过无效日期
let start = NaiveDate::parse_from_str(&start_date, "%Y-%m-%d") let (days, days_display) = match NaiveDate::parse_from_str(&start_date, "%Y-%m-%d") {
.map_err(|e| rusqlite::Error::InvalidParameterName(e.to_string()))?; Ok(start) => {
let days = (today - start).num_days(); let diff = (today - start).num_days();
let display = if diff < 0 {
format!("还有{}", -diff)
} else if diff == 0 {
"今天".to_string()
} else {
format!("{}天前", diff)
};
(diff, display)
},
Err(_) => (0, "无效日期".to_string()), // 如果日期格式无效
};
Ok(Anniversary { Ok(Anniversary {
id, id,
title, title,
start_date, start_date,
days, days,
days_display,
}) })
}) })
.map_err(|e| e.to_string())?; .map_err(|e| e.to_string())?;
@ -101,16 +114,28 @@ async fn get_anniversary_by_id(
let title: String = row.get(0)?; let title: String = row.get(0)?;
let start_date: String = row.get(1)?; let start_date: String = row.get(1)?;
// 计算天数 // 计算天数,跳过无效日期
let start = NaiveDate::parse_from_str(&start_date, "%Y-%m-%d") let (days, days_display) = match NaiveDate::parse_from_str(&start_date, "%Y-%m-%d") {
.map_err(|e| rusqlite::Error::InvalidParameterName(e.to_string()))?; Ok(start) => {
let days = (today - start).num_days(); let diff = (today - start).num_days();
let display = if diff < 0 {
format!("还有{}", -diff)
} else if diff == 0 {
"今天".to_string()
} else {
format!("{}天前", diff)
};
(diff, display)
},
Err(_) => (0, "无效日期".to_string()), // 如果日期格式无效
};
Ok(Anniversary { Ok(Anniversary {
id, id,
title, title,
start_date, start_date,
days, days,
days_display,
}) })
}) })
.map_err(|e| e.to_string())?; .map_err(|e| e.to_string())?;
@ -139,13 +164,39 @@ async fn add_anniversary(
title: String, title: String,
start_date: String, start_date: String,
) -> Result<(), String> { ) -> Result<(), String> {
// 主页添加 // 输入验证
if title.trim().is_empty() {
return Err("标题不能为空".to_string());
}
if start_date.trim().is_empty() {
return Err("日期不能为空".to_string());
}
// 验证日期格式
NaiveDate::parse_from_str(&start_date, "%Y-%m-%d")
.map_err(|_| "日期格式无效,请使用 YYYY-MM-DD 格式".to_string())?;
let app_dir = app_handle let app_dir = app_handle
.path() .path()
.app_data_dir() .app_data_dir()
.map_err(|e| e.to_string())?; .map_err(|e| e.to_string())?;
let db_path = app_dir.join("anniversaries.db"); let db_path = app_dir.join("anniversaries.db");
let conn = Connection::open(db_path).map_err(|e| e.to_string())?; let conn = Connection::open(db_path).map_err(|e| e.to_string())?;
// 检查重复
let mut stmt = conn
.prepare("SELECT COUNT(*) FROM anniversaries WHERE title = ? AND start_date = ?")
.map_err(|e| e.to_string())?;
let count: i64 = stmt
.query_row([&title, &start_date], |row| row.get(0))
.map_err(|e| e.to_string())?;
if count > 0 {
return Err("相同的纪念日已存在".to_string());
}
conn.execute( conn.execute(
"INSERT INTO anniversaries (title, start_date) VALUES (?1, ?2)", "INSERT INTO anniversaries (title, start_date) VALUES (?1, ?2)",
[&title, &start_date], [&title, &start_date],

View File

@ -8,6 +8,7 @@ interface Anniversary {
title: string; title: string;
start_date: string; start_date: string;
days: number; days: number;
days_display: string;
} }
function DetailPage() { function DetailPage() {
@ -18,6 +19,7 @@ function DetailPage() {
title: "", title: "",
start_date: "", start_date: "",
days: 0, days: 0,
days_display: "",
}); });
useEffect(() => { useEffect(() => {
@ -56,7 +58,7 @@ function DetailPage() {
</div> </div>
<div className="card"> <div className="card">
<h1 className="title">{anniversary.title}</h1> <h1 className="title">{anniversary.title}</h1>
<div className="days">{anniversary.days}</div> <div className="days">{anniversary.days_display}</div>
<div className="start-date">Start Date: {anniversary.start_date}</div> <div className="start-date">Start Date: {anniversary.start_date}</div>
</div> </div>
</div> </div>

View File

@ -8,6 +8,7 @@ interface Anniversary {
title: string; title: string;
start_date: string; start_date: string;
days: number; days: number;
days_display: string;
} }
function HomePage() { function HomePage() {
@ -48,7 +49,7 @@ function HomePage() {
> >
<div className="anniversary-title">{item.title}</div> <div className="anniversary-title">{item.title}</div>
<div className="anniversary-info"> <div className="anniversary-info">
<span className="days-count">{item.days}</span> <span className="days-count">{item.days_display}</span>
<span className="start-date">{item.start_date}</span> <span className="start-date">{item.start_date}</span>
</div> </div>
</div> </div>