feat(douyu): 外部单协作 CK 复制统一账号密码格式
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user