From cf174de2b577c82f199c2e4eb1abcf56dac42510 Mon Sep 17 00:00:00 2001 From: Miyamizu-MitsuhaSang <2510681107@qq.com> Date: Sun, 17 Aug 2025 16:53:18 +0800 Subject: [PATCH] =?UTF-8?q?dict.py:=20-=E6=96=B0=E5=A2=9E=E5=90=8E?= =?UTF-8?q?=E5=8F=B0=E4=B8=8A=E4=BC=A0xlsx=E8=A1=A8=E6=A0=BC=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E8=BF=9B=E8=A1=8C=E6=89=B9=E9=87=8F=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/admin/dict.py | 41 +++++++++++++++++++++++++++++++++++++---- scripts/update_fr.py | 1 + 2 files changed, 38 insertions(+), 4 deletions(-) diff --git a/app/api/admin/dict.py b/app/api/admin/dict.py index dbe5e89..02cbabf 100644 --- a/app/api/admin/dict.py +++ b/app/api/admin/dict.py @@ -1,7 +1,11 @@ -from fastapi import Depends, HTTPException, Request, Query +import tempfile +from pathlib import Path + +from fastapi import Depends, HTTPException, Request, Query, UploadFile, File from typing import Literal, Tuple, Union from tortoise.exceptions import DoesNotExist +from tortoise.transactions import in_transaction from app.models.base import User from app.models.fr import DefinitionFr @@ -10,6 +14,7 @@ from app.api.admin.router import admin_router import app.models.fr as fr import app.models.jp as jp from app.schemas.admin_schemas import CreateWord, UpdateWordSet, UpdateWord, SearchWordRequest +from scripts.update_fr import import_wordlist_fr, import_def_fr @admin_router.get("/dict") @@ -106,7 +111,7 @@ async def search_word( async def adjust_dict( request: Request, updated_contents: UpdateWordSet, - admin_user: Tuple[User, dict] = Depends(get_current_user) + admin_user: Tuple[User, dict] = Depends(is_admin_user) ): """ 只关心更新的内容,不关心未改变的内容。 @@ -167,11 +172,11 @@ async def adjust_dict( } -@admin_router.post("/dict/add") +@admin_router.post("/dict/add", deprecated=False) async def add_dict( request: Request, new_word: CreateWord, - admin_user: Tuple[User, dict] = Depends(get_current_user) + admin_user: Tuple[User, dict] = Depends(is_admin_user), ) -> None: if not admin_user[0].is_admin: raise HTTPException(status_code=403, detail="非管理员,无权限访问") @@ -198,3 +203,31 @@ async def add_dict( raise HTTPException(status_code=409, detail="释义已存在") else: raise HTTPException(status_code=400, detail="暂不支持语言类型") + + +@admin_router.post("/dict/update_by_xlsx", deprecated=False) +async def update_by_xlsx( + file: UploadFile = File(...), + admin_user: Tuple[User, dict] = Depends(is_admin_user), +): + """ + 上传法语词典Excel文件并导入至数据库 + """ + + if not file.filename.endswith((".xlsx", ".xls")): + raise HTTPException(status_code=400, detail="文件格式必须为Excel(.xlsx或.xls)") + + try: + suffix = Path(file.filename).suffix + with tempfile.NamedTemporaryFile(delete=False, suffix=suffix) as tmp: + content = await file.read() + tmp.write(content) + tmp_path = Path(tmp.name) + + async with in_transaction(): + await import_wordlist_fr(path=tmp_path) + await import_def_fr(path=tmp_path) + except Exception as e: + raise HTTPException(status_code=500, detail=f"导入失败:{str(e)}") + + return {"message": "导入成功"} diff --git a/scripts/update_fr.py b/scripts/update_fr.py index 9389c37..b15d747 100644 --- a/scripts/update_fr.py +++ b/scripts/update_fr.py @@ -4,6 +4,7 @@ from pathlib import Path import pandas as pd from tortoise import Tortoise from tortoise.exceptions import MultipleObjectsReturned +from fastapi import UploadFile from app.models.fr import DefinitionFr, WordlistFr from settings import TORTOISE_ORM