From 9d9fde387c6e968875eb5a4eafc31f8126c0a8ce Mon Sep 17 00:00:00 2001 From: jxxghp Date: Sun, 9 Jul 2023 16:14:04 +0800 Subject: [PATCH] fix user manage --- Dockerfile | 11 ++------- app/api/endpoints/login.py | 4 ++- app/api/endpoints/system.py | 22 ++++++++++++++++- app/api/endpoints/user.py | 49 +++++++++++++++++++------------------ app/core/config.py | 2 +- app/db/models/user.py | 4 +-- app/schemas/user.py | 2 +- 7 files changed, 55 insertions(+), 39 deletions(-) diff --git a/Dockerfile b/Dockerfile index 945a4e3c..e11b78c5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,21 +4,14 @@ ENV LANG="C.UTF-8" \ PUID=0 \ PGID=0 \ UMASK=000 \ - WORKDIR="/app" \ CONFIG_DIR="/config" \ API_TOKEN="moviepilot" \ - SUPERUSER="admin" \ - SUPERUSER_PASSWORD="password" \ AUTH_SITE="iyuu" \ LIBRARY_PATH="" \ DOWNLOAD_PATH="/downloads" \ - TORRENT_TAG="MOVIEPILOT" \ - SEARCH_SOURCE="themoviedb" \ - SCRAP_SOURCE="themoviedb" \ COOKIECLOUD_HOST="https://nastool.org/cookiecloud" \ COOKIECLOUD_KEY="" \ COOKIECLOUD_PASSWORD="" \ - USER_AGENT="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36 Edg/113.0.1774.57" \ MESSAGER="telegram" \ TELEGRAM_TOKEN="" \ TELEGRAM_CHAT_ID="" \ @@ -32,7 +25,7 @@ ENV LANG="C.UTF-8" \ FILTER_RULE="!BLU & 4K & CN > !BLU & 1080P & CN > !BLU & 4K > !BLU & 1080P" \ TRANSFER_TYPE="copy" \ DOUBAN_USER_IDS="" -WORKDIR ${WORKDIR} +WORKDIR "/app" COPY . . RUN apt-get update \ && apt-get -y install musl-dev nginx \ @@ -40,7 +33,7 @@ RUN apt-get update \ && cp -f nginx.conf /etc/nginx/nginx.conf \ && pip install -r requirements.txt \ && python_ver=$(python3 -V | awk '{print $2}') \ - && echo "${WORKDIR}/" > /usr/local/lib/python${python_ver%.*}/site-packages/app.pth \ + && echo "/app/" > /usr/local/lib/python${python_ver%.*}/site-packages/app.pth \ && echo 'fs.inotify.max_user_watches=5242880' >> /etc/sysctl.conf \ && echo 'fs.inotify.max_user_instances=5242880' >> /etc/sysctl.conf \ && playwright install-deps chromium \ diff --git a/app/api/endpoints/login.py b/app/api/endpoints/login.py index a86a217b..19dbd719 100644 --- a/app/api/endpoints/login.py +++ b/app/api/endpoints/login.py @@ -9,6 +9,7 @@ from app import schemas from app.chain.user import UserChain from app.core import security from app.core.config import settings +from app.core.security import get_password_hash from app.db import get_db from app.db.models.user import User from app.log import logger @@ -42,7 +43,8 @@ async def login_access_token( user = User.get_by_name(db=db, name=form_data.username) if not user: logger.info(f"用户不存在,创建用户: {form_data.username}") - user = User(name=form_data.username, is_active=True, is_superuser=False) + user = User(name=form_data.username, is_active=True, + is_superuser=False, hashed_password=get_password_hash(token)) user.create(db) elif not user.is_active: raise HTTPException(status_code=403, detail="用户未启用") diff --git a/app/api/endpoints/system.py b/app/api/endpoints/system.py index df65ec88..e48dae21 100644 --- a/app/api/endpoints/system.py +++ b/app/api/endpoints/system.py @@ -1,11 +1,14 @@ import json import json import time +from typing import Any -from fastapi import APIRouter, HTTPException +from fastapi import APIRouter, HTTPException, Depends from fastapi.responses import StreamingResponse +from app import schemas from app.core.security import verify_token +from app.db.systemconfig_oper import SystemConfigOper from app.helper.message import MessageHelper from app.helper.progress import ProgressHelper @@ -34,6 +37,23 @@ def get_progress(process_type: str, token: str): return StreamingResponse(event_generator(), media_type="text/event-stream") +@router.get("/setting", summary="查询系统设置") +def get_setting(key: str, _: schemas.TokenPayload = Depends(verify_token)): + """ + 查询系统设置 + """ + return schemas.Response(success=True, data=SystemConfigOper().get(key)) + + +@router.put("/setting", summary="更新系统设置") +def set_setting(key: str, value: Any, _: schemas.TokenPayload = Depends(verify_token)): + """ + 更新系统设置 + """ + SystemConfigOper().set(key, value) + return schemas.Response(success=True) + + @router.get("/message", summary="实时消息") def get_progress(token: str): """ diff --git a/app/api/endpoints/user.py b/app/api/endpoints/user.py index acd28c91..92f7136c 100644 --- a/app/api/endpoints/user.py +++ b/app/api/endpoints/user.py @@ -24,7 +24,7 @@ def read_users( return users -@router.post("/", summary="新增用户", response_model=schemas.User) +@router.post("/", summary="新增用户", response_model=schemas.Response) def create_user( *, db: Session = Depends(get_db), @@ -36,63 +36,64 @@ def create_user( """ user = current_user.get_by_name(db, name=user_in.name) if user: - raise HTTPException( - status_code=400, - detail="用户已存在", - ) + return schemas.Response(success=False, message="用户已存在") user_info = user_in.dict() if user_info.get("password"): user_info["hashed_password"] = get_password_hash(user_info["password"]) user_info.pop("password") user = User(**user_info) user = user.create(db) - return user + return schemas.Response(success=True) -@router.put("/", summary="更新用户", response_model=schemas.User) +@router.put("/", summary="更新用户", response_model=schemas.Response) def update_user( *, db: Session = Depends(get_db), user_in: schemas.UserCreate, - current_user: User = Depends(get_current_active_superuser), + _: User = Depends(get_current_active_superuser), ) -> Any: """ 更新用户 """ - user = current_user.get_by_name(db, name=user_in.name) - if not user: - raise HTTPException( - status_code=404, - detail="用户不存在", - ) user_info = user_in.dict() if user_info.get("password"): user_info["hashed_password"] = get_password_hash(user_info["password"]) user_info.pop("password") - user.update(db, **user_info) - return user + user = User.get_by_name(db, name=user_info["name"]) + if not user: + return schemas.Response(success=False, message="用户不存在") + user.update(db, user_info) + return schemas.Response(success=True) -@router.delete("/", summary="删除用户", response_model=schemas.Response) +@router.delete("/{user_name}", summary="删除用户", response_model=schemas.Response) def delete_user( *, db: Session = Depends(get_db), - user_in: schemas.UserCreate, + user_name: str, current_user: User = Depends(get_current_active_superuser), ) -> Any: """ 删除用户 """ - user = current_user.get_by_name(db, name=user_in.name) + user = current_user.get_by_name(db, name=user_name) if not user: - raise HTTPException( - status_code=404, - detail="用户不存在", - ) - user.delete_by_name(db, user_in.name) + return schemas.Response(success=False, message="用户不存在") + user.delete_by_name(db, user_name) return schemas.Response(success=True) +@router.get("/current", summary="当前登录用户信息", response_model=schemas.User) +def read_current_user( + current_user: User = Depends(get_current_active_user) +) -> Any: + """ + 当前登录用户信息 + """ + return current_user + + @router.get("/{user_id}", summary="用户详情", response_model=schemas.User) def read_user_by_id( user_id: int, diff --git a/app/core/config.py b/app/core/config.py index 40303c3c..a5958a01 100644 --- a/app/core/config.py +++ b/app/core/config.py @@ -27,7 +27,7 @@ class Settings(BaseSettings): CONFIG_DIR: str = None # 超级管理员 SUPERUSER: str = "admin" - # 超级管理员密码 + # 超级管理员初始密码 SUPERUSER_PASSWORD: str = "password" # API密钥,需要更换 API_TOKEN: str = "moviepilot" diff --git a/app/db/models/user.py b/app/db/models/user.py index ce258508..94676f5b 100644 --- a/app/db/models/user.py +++ b/app/db/models/user.py @@ -14,9 +14,9 @@ class User(Base): # 用户名 name = Column(String, index=True, nullable=False) # 邮箱,未启用 - email = Column(String, unique=True, index=True) + email = Column(String) # 加密后密码 - hashed_password = Column(String, nullable=False) + hashed_password = Column(String) # 是否启用 is_active = Column(Boolean(), default=True) # 是否管理员 diff --git a/app/schemas/user.py b/app/schemas/user.py index 8a162255..0eb114d2 100644 --- a/app/schemas/user.py +++ b/app/schemas/user.py @@ -21,7 +21,7 @@ class UserBase(BaseModel): class UserCreate(UserBase): name: str email: Optional[str] = None - password: str + password: Optional[str] = None # Properties to receive via API on update