62 lines
2.0 KiB
Python
62 lines
2.0 KiB
Python
"""智能导入 API — 文本解析与匹配"""
|
|
from fastapi import APIRouter, Depends, Request
|
|
from sqlalchemy.orm import Session, joinedload
|
|
from models import get_db, Website
|
|
from middleware.user_context import UserContext
|
|
from urllib.parse import urlparse
|
|
|
|
router = APIRouter(prefix="/api/import", tags=["智能导入"])
|
|
|
|
|
|
@router.post("/parse")
|
|
def parse_import_text(data: dict, db: Session = Depends(get_db), request: Request = None):
|
|
"""解析粘贴的文本,返回结构化结果 + 匹配信息"""
|
|
user_id = UserContext.get_user_id(request)
|
|
text = data.get("text", "").strip()
|
|
if not text:
|
|
return {"ok": False, "error": "文本为空"}
|
|
|
|
lines = [l.strip() for l in text.split("\n") if l.strip()]
|
|
if len(lines) < 3:
|
|
return {"ok": False, "error": "至少需要 3 行:网址+网站名、账号、密码"}
|
|
|
|
# 解析首行: 网址 + 空格 + 网站名
|
|
first_line = lines[0]
|
|
space_idx = first_line.find(" ")
|
|
if space_idx > 0:
|
|
url = first_line[:space_idx].strip()
|
|
site_name = first_line[space_idx + 1:].strip()
|
|
else:
|
|
url = first_line
|
|
try:
|
|
site_name = urlparse(url).hostname or url
|
|
except Exception:
|
|
site_name = url
|
|
|
|
result = {
|
|
"ok": True,
|
|
"url": url,
|
|
"site_name": site_name,
|
|
"username": lines[1] if len(lines) > 1 else "",
|
|
"password": lines[2] if len(lines) > 2 else "",
|
|
"remark": lines[3] if len(lines) > 3 else "",
|
|
}
|
|
|
|
# 匹配已有网站(仅当前用户)
|
|
existing = db.query(Website).options(joinedload(Website.accounts)).filter(
|
|
Website.url == url, Website.created_by == user_id
|
|
).first()
|
|
if existing:
|
|
result["matched_site"] = {
|
|
"id": existing.id,
|
|
"name": existing.name,
|
|
"folder_id": existing.folder_id,
|
|
"account_count": len(existing.accounts),
|
|
}
|
|
result["action"] = "append"
|
|
else:
|
|
result["matched_site"] = None
|
|
result["action"] = "create"
|
|
|
|
return result
|