diff --git a/apps/desktop-client/src/main/adapters/wangyihao-links.ts b/apps/desktop-client/src/main/adapters/wangyihao-links.ts new file mode 100644 index 0000000..38fe5b9 --- /dev/null +++ b/apps/desktop-client/src/main/adapters/wangyihao-links.ts @@ -0,0 +1,6 @@ +const WANGYI_PUBLIC_ARTICLE_URL_PREFIX = "https://www.163.com/dy/article"; + +export function wangyihaoPublicArticleUrl(articleId: string): string | null { + const normalized = articleId.trim(); + return normalized ? `${WANGYI_PUBLIC_ARTICLE_URL_PREFIX}/${encodeURIComponent(normalized)}.html` : null; +} diff --git a/apps/desktop-client/src/main/adapters/wangyihao.test.ts b/apps/desktop-client/src/main/adapters/wangyihao.test.ts index 0750315..16f639c 100644 --- a/apps/desktop-client/src/main/adapters/wangyihao.test.ts +++ b/apps/desktop-client/src/main/adapters/wangyihao.test.ts @@ -1,6 +1,7 @@ import { describe, expect, it } from "vitest"; import { prepareWangyihaoArticleHtml } from "./wangyihao-content"; +import { wangyihaoPublicArticleUrl } from "./wangyihao-links"; describe("wangyihao article content", () => { it("downgrades markdown tables to paragraph rows before saving drafts", () => { @@ -24,3 +25,15 @@ describe("wangyihao article content", () => { expect(html).toContain("

下一段中文说明

"); }); }); + +describe("wangyihao publish result", () => { + it("builds the public article URL from the NetEase doc id", () => { + expect(wangyihaoPublicArticleUrl(" IK5K461I05561G2M ")).toBe( + "https://www.163.com/dy/article/IK5K461I05561G2M.html", + ); + }); + + it("does not build an external URL without a doc id", () => { + expect(wangyihaoPublicArticleUrl(" ")).toBeNull(); + }); +}); diff --git a/apps/desktop-client/src/main/adapters/wangyihao.ts b/apps/desktop-client/src/main/adapters/wangyihao.ts index f33cc27..4024b9f 100644 --- a/apps/desktop-client/src/main/adapters/wangyihao.ts +++ b/apps/desktop-client/src/main/adapters/wangyihao.ts @@ -10,6 +10,7 @@ import { import { fetchImageAssetBlob } from "./media-image"; import type { PublishAdapter, PublishAdapterContext } from "./base"; import { prepareWangyihaoArticleHtml } from "./wangyihao-content"; +import { wangyihaoPublicArticleUrl } from "./wangyihao-links"; import { WANGYIHAO_DRAFT_SAVE_PARAMETER_MESSAGE, WANGYIHAO_PUBLISH_CLICK_MESSAGE, @@ -820,7 +821,7 @@ function buildResultPayload(articleId: string, mediaName: string): Record): string | null { + if (task.platform !== "wangyihao" || extractString(result.publish_type) === "draft") { + return null; + } + + const articleId = extractStringId(result.external_article_id); + if (!articleId) { + return null; + } + + return `https://www.163.com/dy/article/${encodeURIComponent(articleId)}.html`; +} + function normalizePublishTaskStatus(status: DesktopTaskInfo["status"]): DesktopTaskInfo["status"] { return status === "unknown" ? "failed" : status; } @@ -208,13 +221,6 @@ function summaryForTask( } } -function manageLinkLabel(task: PublishTaskItem): string { - if (task.publishType === "draft" && task.platform === "weixin_gzh") { - return "打开草稿箱"; - } - return "打开管理页"; -} - function parseTimestamp(value: string | null): number { if (!value) { return Date.now(); @@ -432,7 +438,7 @@ const publishTasks = computed(() => updatedAt: parseTimestamp(task.updated_at), externalArticleUrl: publishType === "draft" ? null - : extractString(result.external_article_url) ?? buildSohuArticleUrl(task, result), + : extractString(result.external_article_url) ?? buildWangyihaoArticleUrl(task, result) ?? buildSohuArticleUrl(task, result), externalManageUrl: extractString(result.external_manage_url), publishType, fallbackReason, @@ -455,7 +461,7 @@ const tableColumns = [ { title: "状态", key: "status", dataIndex: "status", width: 96 }, { title: "任务信息", key: "meta", dataIndex: "meta", width: 280 }, { title: "时间", key: "time", dataIndex: "time", width: 132 }, - { title: "", key: "actions", align: "right" as const, width: 64, fixed: "right" as const }, + { title: "操作", key: "actions", align: "right" as const, width: 132, fixed: "right" as const }, ]; const tableScroll = { x: 1000 } as const; @@ -604,37 +610,6 @@ const tableScroll = { x: 1000 } as const; · 租约 {{ formatRelativeTime(record.leaseExpiresAt) }} 到期 - - @@ -653,6 +628,32 @@ const tableScroll = { x: 1000 } as const;