This commit is contained in:
949036910@qq.com
2026-06-03 22:12:26 +08:00
parent 328ee75be5
commit efed871f57
3 changed files with 119 additions and 20 deletions

View File

@@ -8,6 +8,7 @@ const {
publishPlatforms,
publishing,
publishLoggingIn,
publishStatus,
titleGenerated,
coverImagePath,
generatedVideoPath,
@@ -17,6 +18,8 @@ const {
} = storeToRefs(workflow);
const feedback = ref({ severity: "", message: "" });
/** 账号管理弹窗内提示(避免被 Dialog 挡住主卡片 feedback */
const accountFeedback = ref({ severity: "", message: "" });
const scheduleDialogVisible = ref(false);
const scheduleDate = ref(null);
const accountDialogVisible = ref(false);
@@ -60,11 +63,13 @@ const activePlatform = computed(
);
function showFeedback(result) {
if (!result?.message) return;
const message = String(result?.message || result?.error || "").trim();
if (!message) return;
feedback.value = {
severity: result.ok ? "success" : "error",
message: result.message,
message,
};
accountFeedback.value = feedback.value;
}
onMounted(async () => {
@@ -75,6 +80,7 @@ function openAccountManager() {
if (publishPlatforms.value.length && !activePlatform.value) {
activePlatformKey.value = publishPlatforms.value[0].key;
}
accountFeedback.value = { severity: "", message: "" };
accountDialogVisible.value = true;
}
@@ -117,6 +123,7 @@ function cancelSchedule() {
async function onLogin(platform, accountId = undefined) {
feedback.value = { severity: "", message: "" };
accountFeedback.value = { severity: "", message: "" };
showFeedback(await workflow.loginPublishPlatform(platform.key, accountId));
}
@@ -142,16 +149,11 @@ async function onOpenAccount(platform, account) {
showFeedback(result);
}
function onDeleteAccount(platform, account) {
platform.accounts = (platform.accounts || []).filter((a) => a.id !== account.id);
if (platform.accountId === account.id) {
platform.accountId = null;
}
if (!platform.accounts.length) {
platform.loggedIn = false;
platform.nickname = "";
}
feedback.value = { severity: "success", message: "已从本地列表移除账号,刷新后可重新获取" };
async function onDeleteAccount(platform, account) {
accountFeedback.value = { severity: "", message: "" };
showFeedback(
await workflow.deletePublishAccount(platform.key, account.id),
);
}
function formatAccountStatus(account) {
@@ -294,6 +296,21 @@ function formatUpdateTime(account) {
modal
:style="{ width: '640px' }"
>
<p
v-if="publishLoggingIn && publishStatus"
class="mb-2 text-sm text-sky-400"
>
{{ publishStatus }}
</p>
<p
v-else-if="accountFeedback.message"
class="mb-2 text-sm"
:class="
accountFeedback.severity === 'error' ? 'text-red-400' : 'text-emerald-400'
"
>
{{ accountFeedback.message }}
</p>
<div class="account-manager">
<div class="platform-tabs">
<div

View File

@@ -1,7 +1,11 @@
import { invoke } from "@tauri-apps/api/core";
import { listen } from "@tauri-apps/api/event";
import { resolveStep4TitleForCover } from "../utils/coverTextSplit.js";
const PUBLISH_LOGIN_SCRIPT = "publish_login.js";
const NODEJS_EVENT = "nodejs:event";
export const PUBLISH_PLATFORM_DEFS = [
{ key: "douyin", label: "抖音" },
{ key: "kuaishou", label: "快手" },
@@ -52,6 +56,46 @@ export async function refreshPublishAccounts(store) {
}
}
/**
* @param {ReturnType<typeof import('../stores/workflow.js').useWorkflowStore>} store
* @param {string} platformKey
* @param {number} accountId
*/
export async function deletePublishAccount(store, platformKey, accountId) {
const row = store.publishPlatforms.find((p) => p.key === platformKey);
if (!row) return { ok: false, message: "未知平台" };
const id = Number(accountId);
if (!Number.isFinite(id) || id <= 0) {
return { ok: false, message: "无效的账号 ID" };
}
try {
await invoke("publish_delete_account", { accountId: id });
row.accounts = (row.accounts || []).filter((a) => a.id !== id);
if (row.accountId === id) {
row.accountId = null;
row.loggedIn = false;
row.nickname = "";
} else {
const active = row.accounts.find(
(a) => a.loginStatus === "active" && a.hasCookies,
);
if (active) {
row.loggedIn = true;
row.nickname = active.nickname || "";
} else if (!row.accounts.length) {
row.loggedIn = false;
row.nickname = "";
}
}
return { ok: true, message: "账号已删除" };
} catch (err) {
const msg = err instanceof Error ? err.message : String(err);
return { ok: false, message: `删除失败:${msg}` };
}
}
/**
* @param {ReturnType<typeof import('../stores/workflow.js').useWorkflowStore>} store
* @param {string} platformKey
@@ -61,7 +105,33 @@ export async function loginPublishPlatform(store, platformKey, accountId = undef
if (!row) return { ok: false, message: "未知平台" };
store.publishLoggingIn = platformKey;
store.publishStatus = "正在准备扫码登录…";
let unlisten = null;
try {
try {
unlisten = await listen(NODEJS_EVENT, (e) => {
const p = e.payload;
const forLogin =
!p?.scriptName || p.scriptName === PUBLISH_LOGIN_SCRIPT;
if (!forLogin) return;
if (p?.type === "progress" && typeof p.status === "string") {
store.publishStatus = p.status;
} else if (p?.type === "log") {
const text =
p.fields != null ? `${p.msg} ${JSON.stringify(p.fields)}` : p.msg;
if (p.level === "error") {
store.publishStatus = text;
console.error(`[nodejs/${PUBLISH_LOGIN_SCRIPT}]`, text);
} else {
console.info(`[nodejs/${PUBLISH_LOGIN_SCRIPT}]`, text);
}
}
});
} catch {
/* 非 Tauri 环境 */
}
const result = await invoke("publish_login", {
params: {
platform: platformKey,
@@ -69,10 +139,11 @@ export async function loginPublishPlatform(store, platformKey, accountId = undef
},
});
if (!result?.success) {
return {
ok: false,
message: String(result?.error || result?.message || "登录失败"),
};
const errMsg = String(
result?.error || result?.message || "登录失败,请查看是否已安装 Chrome",
);
store.publishStatus = errMsg;
return { ok: false, message: errMsg };
}
if (result.account) {
row.accountId = result.account.id;
@@ -80,15 +151,21 @@ export async function loginPublishPlatform(store, platformKey, accountId = undef
row.nickname = result.account.nickname || "";
}
await refreshPublishAccounts(store);
return {
ok: true,
message: String(result.message || "登录成功"),
};
const okMsg = String(result.message || "登录成功");
store.publishStatus = okMsg;
return { ok: true, message: okMsg };
} catch (err) {
const msg = err instanceof Error ? err.message : String(err);
store.publishStatus = `登录失败:${msg}`;
return { ok: false, message: `登录失败:${msg}` };
} finally {
if (typeof unlisten === "function") {
unlisten();
}
store.publishLoggingIn = "";
if (!store.publishStatus || store.publishStatus.startsWith("正在")) {
store.publishStatus = "";
}
}
}

View File

@@ -50,6 +50,7 @@ import {
checkPublishLoginStatus,
openPublishAccount,
loginPublishPlatform,
deletePublishAccount,
refreshPublishAccounts,
} from "../services/videoPublish.js";
import { SUBTITLE_TEMPLATES } from "../config/subtitleTemplates.js";
@@ -721,6 +722,10 @@ export const useWorkflowStore = defineStore("workflow", {
return loginPublishPlatform(this, platformKey, accountId);
},
async deletePublishAccount(platformKey, accountId) {
return deletePublishAccount(this, platformKey, accountId);
},
async checkPublishLoginStatus(platformKey, accountId = null, checkBrowser = true) {
return checkPublishLoginStatus(this, platformKey, accountId, checkBrowser);
},