feat(douyu): 外部单协作 CK 复制统一账号密码格式

This commit is contained in:
yml2213
2026-10-23 10:32:29 +08:00
parent 84d7c8e0a4
commit 2c87deed78
5 changed files with 16 additions and 20 deletions
+2
View File
@@ -432,6 +432,7 @@ class TestDouyuCollabOrders:
assert result["items"][0]["order_no"] == "DY-EXP-1"
assert result["items"][0]["ck_text"] == self.account.cookie
assert result["items"][0]["account_username"] == self.account.username
assert result["items"][0]["account_password"] == "password"
assert result["items"][0]["ck_status_label"] == "CK 正常"
assert [item["order_no"] for item in result["skipped"]] == [
"DY-EXP-2",
@@ -497,6 +498,7 @@ class TestDouyuCollabOrders:
result = collab_api.copy_external_order_ck(order.id, self.session, self.admin)
assert result["exported"] == 1
assert result["items"][0]["ck_text"] == self.account.cookie
assert result["items"][0]["account_password"] == "password"
with pytest.raises(collab_api.HTTPException) as excinfo:
collab_api.copy_external_order_ck(order.id, self.session, operator)
+1
View File
@@ -1885,6 +1885,7 @@ class DouyuCollabCkExportItemOut(BaseModel):
order_no: str = ""
account_id: int | None = None
account_username: str = ""
account_password: str = ""
account_nickname: str = ""
status: str = ""
status_label: str = ""
@@ -2057,6 +2057,7 @@ def export_cks(
"order_no": order.order_no,
"account_id": int(account.id),
"account_username": account.username or order.account_username or "",
"account_password": str(account.password or ""),
"account_nickname": account.nickname or order.account_nickname or "",
"status": order.status,
"status_label": ORDER_STATUS_LABELS.get(order.status, order.status),
+1
View File
@@ -109,6 +109,7 @@ export interface DouyuCollabCkExportItem {
order_no: string;
account_id: number | null;
account_username: string;
account_password: string;
account_nickname: string;
status: DouyuCollabStatus;
status_label: string;
+11 -20
View File
@@ -15,7 +15,6 @@ import {
Input,
InputNumber,
Modal,
Radio,
Row,
Select,
Space,
@@ -258,7 +257,6 @@ export default function DouyuCollabPage() {
const [ckExporting, setCkExporting] = useState(false);
const [ckCopyingId, setCkCopyingId] = useState<number | null>(null);
const [ckExport, setCkExport] = useState<DouyuCollabCkExportResult | null>(null);
const [ckExportFormat, setCkExportFormat] = useState<'plain' | 'with_order'>('plain');
// 批量导出斗鱼用户名:只读列表数据,不含 CK
const [usernameExportOpen, setUsernameExportOpen] = useState(false);
@@ -434,15 +432,13 @@ export default function DouyuCollabPage() {
selectedOrders.length === selectedIds.length &&
selectedOrders.every((row) => row.status === 'done' && !row.is_archived);
/** 导出文本:默认每行一份纯 CK,也可以带订单号方便多选对号。 */
/** 与「CK 管理」保持一致:账号----密码----CK,每行一条。 */
const ckExportText = useMemo(() => {
if (!ckExport) return '';
return ckExport.items
.map((item) =>
ckExportFormat === 'with_order' ? `${item.order_no}\t${item.ck_text}` : item.ck_text,
)
.join('\n');
}, [ckExport, ckExportFormat]);
.map((item) => `${item.account_username}----${item.account_password || ''}----${item.ck_text}`)
.join('\r\n');
}, [ckExport]);
const ckExportRisky = useMemo(
() => (ckExport?.items ?? []).filter((item) => item.ck_status === 'invalid'),
@@ -801,8 +797,10 @@ export default function DouyuCollabPage() {
message.warning(result.skipped[0]?.reason || '这行还没有可复制的 CK');
return;
}
await copyTextToClipboard(item.ck_text);
message.success(`已复制 ${row.order_no} 的 CK`);
await copyTextToClipboard(
`${item.account_username}----${item.account_password || ''}----${item.ck_text}`,
);
message.success(`已复制 ${row.order_no} 的账号密码与 CK`);
} catch (error) {
message.error(`复制失败:${getErrorMessage(error)}`);
} finally {
@@ -1878,8 +1876,8 @@ export default function DouyuCollabPage() {
<Alert
type="warning"
showIcon
message="CK 是账号凭据"
description="斗鱼协作单不存 CK,这里导出的是关联内部账号当前的 cookie。复制后请勿发群 / 截图外传;每次导出都会写审计(谁、什么时候、导出了哪几单),审计里不存 CK 本体。"
message="账号、密码、CK 都是凭据"
description="格式与「CK 管理」一致:账号----密码----CK,每行一条。斗鱼协作单不存 CK,这里导出的是关联内部账号当前的 CK。复制后请勿发群 / 截图外传;每次导出都会写审计,审计里不存凭据本体。"
/>
{ckExport && ckExport.skipped.length > 0 && (
<Text type="warning" style={{ fontSize: 12 }}>
@@ -1899,13 +1897,6 @@ export default function DouyuCollabPage() {
.join(';')}
</Text>
)}
<Radio.Group
value={ckExportFormat}
onChange={(event) => setCkExportFormat(event.target.value)}
>
<Radio value="plain">每行一份纯 CK(直接粘)</Radio>
<Radio value="with_order">订单号 + Tab + CK(多选时好对号)</Radio>
</Radio.Group>
<Input.TextArea
rows={10}
value={ckExportText}
@@ -1918,7 +1909,7 @@ export default function DouyuCollabPage() {
/>
<Text type="secondary" style={{ fontSize: 12 }}>
共 {ckExport?.exported ?? 0} 份 · {ckExportText.length} 字符;
关掉这个弹窗就清掉,不会留在页面上。
每行格式:账号----密码----CK;关掉这个弹窗就清掉,不会留在页面上。
</Text>
</Space>
</Modal>