初始化
This commit is contained in:
61
backend/routes/import_api.py
Normal file
61
backend/routes/import_api.py
Normal file
@@ -0,0 +1,61 @@
|
||||
"""智能导入 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
|
||||
Reference in New Issue
Block a user