Cookie导出增加格式选择
- 后端: export接口增加 format 参数,支持 csv 和 custom 格式 - custom 格式: 账号----密码----ck,导出为 txt - 后端: 导出用批量查 Account 替代逐条查询,消除 N+1 - 前端: 导出按钮改为下拉菜单可选格式 - 修复: blob 导出时不再取 .data(拦截器已提取) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5
parent
e7edb56107
commit
1b20317b42
@@ -65,28 +65,54 @@ def list_cookies(
|
||||
|
||||
@router.get("/export")
|
||||
def export_cookies(
|
||||
format: str = "csv",
|
||||
db: Session = Depends(get_db),
|
||||
current: User = Depends(require_permission("cookie:export")),
|
||||
):
|
||||
"""导出 Cookie 为 CSV。"""
|
||||
"""导出 Cookie,支持 csv 和 custom 格式。
|
||||
csv: 账号, Cookie, 时间
|
||||
custom: 账号----密码----ck
|
||||
"""
|
||||
tasks = db.query(LoginTask).filter(
|
||||
LoginTask.status == "success"
|
||||
).order_by(LoginTask.finished_at.desc()).all()
|
||||
|
||||
output = io.StringIO()
|
||||
writer = csv.writer(output)
|
||||
writer.writerow(["账号", "Cookie", "时间"])
|
||||
# 批量查账号,避免 N+1
|
||||
account_ids = [t.account_id for t in tasks]
|
||||
accounts_map = {}
|
||||
if account_ids:
|
||||
accs = db.query(Account).filter(Account.id.in_(account_ids)).all()
|
||||
accounts_map = {a.id: a for a in accs}
|
||||
|
||||
for t in tasks:
|
||||
acc = db.query(Account).filter(Account.id == t.account_id).first()
|
||||
username = acc.username if acc else ""
|
||||
writer.writerow([username, t.cookie or "", _fmt_dt(t.finished_at) or ""])
|
||||
if format == "custom":
|
||||
# 账号----密码----ck
|
||||
lines = []
|
||||
for t in tasks:
|
||||
acc = accounts_map.get(t.account_id)
|
||||
username = acc.username if acc else ""
|
||||
password = acc.password if acc else ""
|
||||
ck = t.cookie or ""
|
||||
lines.append(f"{username}----{password}----{ck}")
|
||||
content = "\n".join(lines)
|
||||
filename = "cookies_custom.txt"
|
||||
media = "text/plain"
|
||||
else:
|
||||
# CSV: 账号, Cookie, 时间
|
||||
output = io.StringIO()
|
||||
writer = csv.writer(output)
|
||||
writer.writerow(["账号", "Cookie", "时间"])
|
||||
for t in tasks:
|
||||
acc = accounts_map.get(t.account_id)
|
||||
username = acc.username if acc else ""
|
||||
writer.writerow([username, t.cookie or "", _fmt_dt(t.finished_at) or ""])
|
||||
content = output.getvalue()
|
||||
filename = "cookies.csv"
|
||||
media = "text/csv"
|
||||
|
||||
output.seek(0)
|
||||
return StreamingResponse(
|
||||
iter([output.getvalue()]),
|
||||
media_type="text/csv",
|
||||
headers={"Content-Disposition": "attachment; filename=cookies.csv"},
|
||||
iter([content]),
|
||||
media_type=media,
|
||||
headers={"Content-Disposition": f"attachment; filename={filename}"},
|
||||
)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user