This commit is contained in:
949036910@qq.com
2026-05-28 15:24:21 +08:00
parent 1a32a59635
commit bf22177e80
6 changed files with 387 additions and 40 deletions

View File

@@ -96,13 +96,23 @@ pub async fn publish_login(
params: PublishLoginParams,
) -> Result<Value, String> {
let _ = app_config;
let platform = params.platform.trim().to_string();
if platform.is_empty() {
return Err("platform 不能为空".to_string());
}
// 对齐 Electron先创建账号槽位再走扫码登录保证每个账号独立 userDataDir。
let (effective_account_id, created_slot) = if let Some(id) = params.account_id {
(id, false)
} else {
(store.create_account_slot(platform.clone()).await?.id, true)
};
let result = run_publish_script(
app,
window,
"publish_login.js",
json!({
"platform": params.platform,
"accountId": params.account_id,
"platform": platform,
"accountId": effective_account_id,
}),
)
.await?;
@@ -118,17 +128,23 @@ pub async fn publish_login(
.and_then(|v| v.as_str())
.unwrap_or("")
.to_string();
let avatar = result
.get("avatar")
.and_then(|v| v.as_str())
.unwrap_or("")
.to_string();
let cookies = result
.get("cookies")
.map(|v| serde_json::to_string(v).unwrap_or_else(|_| "[]".to_string()))
.unwrap_or_else(|| "[]".to_string());
let rec = store
.upsert_login(
params.platform.clone(),
platform,
nickname,
uid,
avatar,
cookies,
params.account_id,
Some(effective_account_id),
)
.await?;
return Ok(json!({
@@ -138,6 +154,9 @@ pub async fn publish_login(
}));
}
if created_slot {
let _ = store.delete(effective_account_id).await;
}
Ok(result)
}

View File

@@ -138,6 +138,7 @@ impl PublishDb {
platform: &str,
nickname: &str,
uid: &str,
avatar: &str,
cookies_json: &str,
account_id: Option<i64>,
) -> Result<PlatformAccountRecord, PublishDbError> {
@@ -149,9 +150,9 @@ impl PublishDb {
if let Some(id) = account_id {
conn.execute(
"UPDATE platform_accounts SET nickname = ?1, uid = ?2, cookies = ?3,
login_status = 'active', expires_at = ?4, updated_at = ?5 WHERE id = ?6",
params![nickname, uid, cookies_json, expires, now, id],
"UPDATE platform_accounts SET nickname = ?1, uid = ?2, avatar = ?3, cookies = ?4,
login_status = 'active', expires_at = ?5, updated_at = ?6 WHERE id = ?7",
params![nickname, uid, avatar, cookies_json, expires, now, id],
)?;
return self
.get(id)?
@@ -159,11 +160,30 @@ impl PublishDb {
.ok_or_else(|| PublishDbError::Message("更新账号失败".into()));
}
if !uid.trim().is_empty() {
let mut stmt = conn.prepare(
"SELECT id FROM platform_accounts WHERE platform = ?1 AND uid = ?2 LIMIT 1",
)?;
let mut rows = stmt.query(params![platform, uid])?;
if let Some(row) = rows.next()? {
let existing_id: i64 = row.get(0)?;
conn.execute(
"UPDATE platform_accounts SET nickname = ?1, avatar = ?2, cookies = ?3,
login_status = 'active', expires_at = ?4, updated_at = ?5 WHERE id = ?6",
params![nickname, avatar, cookies_json, expires, now, existing_id],
)?;
return self
.get(existing_id)?
.map(|(r, _)| r)
.ok_or_else(|| PublishDbError::Message("更新账号失败".into()));
}
}
conn.execute(
"INSERT INTO platform_accounts (platform, nickname, uid, avatar, cookies, tokens,
login_status, expires_at, created_at, updated_at)
VALUES (?1, ?2, ?3, '', ?4, '', 'active', ?5, ?6, ?6)",
params![platform, nickname, uid, cookies_json, expires, now],
VALUES (?1, ?2, ?3, ?4, ?5, '', 'active', ?6, ?7, ?7)",
params![platform, nickname, uid, avatar, cookies_json, expires, now],
)?;
let id = conn.last_insert_rowid();
self.get(id)?
@@ -171,6 +191,23 @@ impl PublishDb {
.ok_or_else(|| PublishDbError::Message("插入账号失败".into()))
}
pub fn create_account_slot(&self, platform: &str) -> Result<PlatformAccountRecord, PublishDbError> {
let conn = self.conn.lock().map_err(|_| {
PublishDbError::Message("数据库锁异常".into())
})?;
let now = chrono::Utc::now().timestamp_millis();
conn.execute(
"INSERT INTO platform_accounts (platform, nickname, uid, avatar, cookies, tokens,
login_status, expires_at, created_at, updated_at)
VALUES (?1, '', '', '', '[]', '', 'inactive', NULL, ?2, ?2)",
params![platform, now],
)?;
let id = conn.last_insert_rowid();
self.get(id)?
.map(|(r, _)| r)
.ok_or_else(|| PublishDbError::Message("创建账号槽位失败".into()))
}
pub fn set_login_status(&self, id: i64, status: &str) -> Result<(), PublishDbError> {
let conn = self.conn.lock().map_err(|_| {
PublishDbError::Message("数据库锁异常".into())

View File

@@ -64,6 +64,7 @@ impl PublishStore {
platform: String,
nickname: String,
uid: String,
avatar: String,
cookies_json: String,
account_id: Option<i64>,
) -> Result<PlatformAccountRecord, String> {
@@ -72,6 +73,7 @@ impl PublishStore {
&platform,
&nickname,
&uid,
&avatar,
&cookies_json,
account_id,
)
@@ -80,6 +82,11 @@ impl PublishStore {
.await
}
pub async fn create_account_slot(&self, platform: String) -> Result<PlatformAccountRecord, String> {
self.with_db(move |db| db.create_account_slot(&platform).map_err(|e| e.to_string()))
.await
}
pub async fn set_login_status(&self, id: i64, status: String) -> Result<(), String> {
self.with_db(move |db| db.set_login_status(id, &status).map_err(|e| e.to_string()))
.await