初始化
This commit is contained in:
221
backend/routes/websites.py
Normal file
221
backend/routes/websites.py
Normal file
@@ -0,0 +1,221 @@
|
||||
"""网站管理相关路由"""
|
||||
from fastapi import APIRouter, Depends, HTTPException, Request
|
||||
from sqlalchemy.orm import Session, joinedload
|
||||
from models import get_db, Website, Account, Folder
|
||||
from middleware.user_context import UserContext
|
||||
|
||||
router = APIRouter(tags=["网站管理"])
|
||||
|
||||
|
||||
# ===== 网站 CRUD =====
|
||||
|
||||
@router.get("/api/websites")
|
||||
def list_websites(folder_id: int = None, db: Session = Depends(get_db), request: Request = None):
|
||||
"""获取网站列表(仅当前用户)"""
|
||||
user_id = UserContext.get_user_id(request)
|
||||
q = db.query(Website).options(joinedload(Website.accounts)).filter(Website.created_by == user_id)
|
||||
if folder_id:
|
||||
q = q.filter(Website.folder_id == folder_id)
|
||||
return q.order_by(Website.name).all()
|
||||
|
||||
|
||||
@router.post("/api/websites")
|
||||
def create_website(data: dict, db: Session = Depends(get_db), request: Request = None):
|
||||
"""创建网站"""
|
||||
user_id = UserContext.get_user_id(request)
|
||||
website = Website(
|
||||
name=data.get("name", ""),
|
||||
url=data.get("url", ""),
|
||||
folder_id=data.get("folder_id"),
|
||||
created_by=user_id,
|
||||
updated_by=user_id,
|
||||
)
|
||||
db.add(website)
|
||||
db.commit()
|
||||
db.refresh(website)
|
||||
return {"id": website.id, "name": website.name, "url": website.url,
|
||||
"folder_id": website.folder_id}
|
||||
|
||||
|
||||
@router.get("/api/websites/{website_id}")
|
||||
def get_website(website_id: int, db: Session = Depends(get_db), request: Request = None):
|
||||
"""获取网站详情(含账号列表)"""
|
||||
user_id = UserContext.get_user_id(request)
|
||||
website = db.query(Website).options(joinedload(Website.accounts)).filter(
|
||||
Website.id == website_id, Website.created_by == user_id
|
||||
).first()
|
||||
if not website:
|
||||
raise HTTPException(404, "网站不存在")
|
||||
return website
|
||||
|
||||
|
||||
@router.put("/api/websites/{website_id}")
|
||||
def update_website(website_id: int, data: dict, db: Session = Depends(get_db), request: Request = None):
|
||||
"""更新网站信息"""
|
||||
user_id = UserContext.get_user_id(request)
|
||||
website = db.query(Website).filter(Website.id == website_id, Website.created_by == user_id).first()
|
||||
if not website:
|
||||
raise HTTPException(404, "网站不存在")
|
||||
for field in ["name", "url", "folder_id"]:
|
||||
if field in data:
|
||||
setattr(website, field, data[field])
|
||||
website.updated_by = user_id
|
||||
db.commit()
|
||||
db.refresh(website)
|
||||
return {"ok": True}
|
||||
|
||||
|
||||
@router.delete("/api/websites/{website_id}")
|
||||
def delete_website(website_id: int, db: Session = Depends(get_db), request: Request = None):
|
||||
"""删除网站"""
|
||||
user_id = UserContext.get_user_id(request)
|
||||
website = db.query(Website).filter(Website.id == website_id, Website.created_by == user_id).first()
|
||||
if not website:
|
||||
raise HTTPException(404, "网站不存在")
|
||||
db.delete(website)
|
||||
db.commit()
|
||||
return {"ok": True}
|
||||
|
||||
|
||||
# ===== 账号 CRUD =====
|
||||
|
||||
@router.post("/api/websites/{website_id}/accounts")
|
||||
def add_account(website_id: int, data: dict, db: Session = Depends(get_db), request: Request = None):
|
||||
"""添加账号"""
|
||||
user_id = UserContext.get_user_id(request)
|
||||
account = Account(
|
||||
website_id=website_id,
|
||||
username=data.get("username", ""),
|
||||
password=data.get("password", ""),
|
||||
remark=data.get("remark", ""),
|
||||
sort_order=data.get("sort_order", 0),
|
||||
created_by=user_id,
|
||||
updated_by=user_id,
|
||||
)
|
||||
db.add(account)
|
||||
db.commit()
|
||||
db.refresh(account)
|
||||
return {"id": account.id, "username": account.username, "remark": account.remark, "sort_order": account.sort_order}
|
||||
|
||||
|
||||
@router.get("/api/accounts/{account_id}")
|
||||
def get_account(account_id: int, db: Session = Depends(get_db), request: Request = None):
|
||||
"""获取单个账号"""
|
||||
user_id = UserContext.get_user_id(request)
|
||||
account = db.query(Account).filter(Account.id == account_id, Account.created_by == user_id).first()
|
||||
if not account:
|
||||
raise HTTPException(404, "账号不存在")
|
||||
return {"id": account.id, "username": account.username,
|
||||
"password": account.password, "remark": account.remark}
|
||||
|
||||
|
||||
@router.put("/api/accounts/{account_id}")
|
||||
def update_account(account_id: int, data: dict, db: Session = Depends(get_db), request: Request = None):
|
||||
"""更新账号"""
|
||||
user_id = UserContext.get_user_id(request)
|
||||
account = db.query(Account).filter(Account.id == account_id, Account.created_by == user_id).first()
|
||||
if not account:
|
||||
raise HTTPException(404, "账号不存在")
|
||||
for field in ["username", "password", "remark", "sort_order"]:
|
||||
if field in data:
|
||||
setattr(account, field, data[field])
|
||||
account.updated_by = user_id
|
||||
db.commit()
|
||||
db.refresh(account)
|
||||
return {"ok": True}
|
||||
|
||||
@router.delete("/api/accounts/{account_id}")
|
||||
def delete_account(account_id: int, db: Session = Depends(get_db), request: Request = None):
|
||||
"""删除账号"""
|
||||
user_id = UserContext.get_user_id(request)
|
||||
account = db.query(Account).filter(Account.id == account_id, Account.created_by == user_id).first()
|
||||
if not account:
|
||||
raise HTTPException(404, "账号不存在")
|
||||
db.delete(account)
|
||||
db.commit()
|
||||
return {"ok": True}
|
||||
|
||||
|
||||
@router.put("/api/accounts/{account_id}/move")
|
||||
def move_account(account_id: int, data: dict, db: Session = Depends(get_db), request: Request = None):
|
||||
"""移动账号顺序: direction = 'up' | 'down'"""
|
||||
user_id = UserContext.get_user_id(request)
|
||||
account = db.query(Account).filter(Account.id == account_id, Account.created_by == user_id).first()
|
||||
if not account:
|
||||
raise HTTPException(404, "账号不存在")
|
||||
|
||||
direction = data.get("direction", "down")
|
||||
website_id = account.website_id
|
||||
|
||||
# 同网站下按 sort_order 排序的所有账号
|
||||
siblings = db.query(Account).filter_by(website_id=website_id).order_by(Account.sort_order).all()
|
||||
|
||||
idx = next((i for i, a in enumerate(siblings) if a.id == account_id), None)
|
||||
if idx is None:
|
||||
return {"ok": False}
|
||||
|
||||
if direction == "up" and idx > 0:
|
||||
siblings[idx].sort_order, siblings[idx-1].sort_order = siblings[idx-1].sort_order, siblings[idx].sort_order
|
||||
elif direction == "down" and idx < len(siblings) - 1:
|
||||
siblings[idx].sort_order, siblings[idx+1].sort_order = siblings[idx+1].sort_order, siblings[idx].sort_order
|
||||
|
||||
db.commit()
|
||||
return {"ok": True}
|
||||
|
||||
|
||||
# ===== 文件夹 API =====
|
||||
|
||||
@router.get("/api/folders")
|
||||
def list_folders(type: str = "website", db: Session = Depends(get_db), request: Request = None):
|
||||
"""获取文件夹列表(仅当前用户)"""
|
||||
user_id = UserContext.get_user_id(request)
|
||||
return db.query(Folder).filter(
|
||||
Folder.type == type,
|
||||
Folder.created_by == user_id,
|
||||
).order_by(Folder.sort_order).all()
|
||||
|
||||
|
||||
@router.post("/api/folders")
|
||||
def create_folder(data: dict, db: Session = Depends(get_db), request: Request = None):
|
||||
"""创建文件夹"""
|
||||
user_id = UserContext.get_user_id(request)
|
||||
folder = Folder(
|
||||
name=data.get("name", "新文件夹"),
|
||||
type=data.get("type", "website"),
|
||||
created_by=user_id,
|
||||
)
|
||||
db.add(folder)
|
||||
db.commit()
|
||||
db.refresh(folder)
|
||||
return {"id": folder.id, "name": folder.name, "type": folder.type}
|
||||
|
||||
|
||||
@router.put("/api/folders/{folder_id}")
|
||||
def update_folder(folder_id: int, data: dict, db: Session = Depends(get_db), request: Request = None):
|
||||
"""重命名文件夹"""
|
||||
user_id = UserContext.get_user_id(request)
|
||||
folder = db.query(Folder).filter(Folder.id == folder_id, Folder.created_by == user_id).first()
|
||||
if not folder:
|
||||
raise HTTPException(404, "文件夹不存在")
|
||||
if "name" in data:
|
||||
folder.name = data["name"]
|
||||
db.commit()
|
||||
return {"ok": True, "id": folder.id, "name": folder.name}
|
||||
|
||||
|
||||
@router.delete("/api/folders/{folder_id}")
|
||||
def delete_folder(folder_id: int, db: Session = Depends(get_db), request: Request = None):
|
||||
"""删除文件夹(文件夹下的内容变为未分类)"""
|
||||
user_id = UserContext.get_user_id(request)
|
||||
folder = db.query(Folder).filter(Folder.id == folder_id, Folder.created_by == user_id).first()
|
||||
if not folder:
|
||||
raise HTTPException(404, "文件夹不存在")
|
||||
# 将该文件夹下的网站/笔记移到未分类(仅限当前用户)
|
||||
from models import Website, Note
|
||||
if folder.type == "website":
|
||||
db.query(Website).filter_by(folder_id=folder_id, created_by=user_id).update({"folder_id": None})
|
||||
else:
|
||||
db.query(Note).filter_by(folder_id=folder_id, created_by=user_id).update({"folder_id": None})
|
||||
db.delete(folder)
|
||||
db.commit()
|
||||
return {"ok": True}
|
||||
Reference in New Issue
Block a user