修改文件上传逻辑

This commit is contained in:
Administrator 2023-06-28 11:13:02 +08:00
parent f789c60a3e
commit d66859966b
2 changed files with 71 additions and 4 deletions

View File

@ -9,6 +9,7 @@ from Utils.SqlAlchemyUtils import get_db
from Schemas import FileSechemas from Schemas import FileSechemas
from Utils.AuthUtils import token_data_depend from Utils.AuthUtils import token_data_depend
from base64 import b64decode from base64 import b64decode
router = APIRouter(prefix="/api/daily/file", tags=["文件"]) router = APIRouter(prefix="/api/daily/file", tags=["文件"])
allow_file_type = { allow_file_type = {
'image', 'image',
@ -21,17 +22,21 @@ allow_file_type = {
@router.post('/file_upload', response_model=FileSechemas.UserFileInfo, summary='文件上次') @router.post('/file_upload', response_model=FileSechemas.UserFileInfo, summary='文件上次')
def file_upload(name: str = Header(None), file: UploadFile = File(...), def file_upload(name: str = Header(None), file: UploadFile = File(...),
db: Session = Depends(get_db), token_data: TokenData = Depends(token_data_depend)): db: Session = Depends(get_db), token_data: TokenData = Depends(token_data_depend)):
file_org_name = file.filename
if name: if name:
name=b64decode(name.encode('utf-8')).decode('utf-8') file_org_name = b64decode(name.encode('utf-8')).decode('utf-8')
mime_type = file.content_type mime_type = file.content_type
common_type, file_type = file.content_type.split('/') common_type, file_type = file.content_type.split('/')
file_type_end = ''
if '.' in file_org_name:
file_type_end = '.' + file_org_name.split('.')[-1].lower()
if common_type not in allow_file_type: if common_type not in allow_file_type:
raise Exception('不允许上传该类型文件') raise Exception('不允许上传该类型文件')
content_start = file.file.read(1024) content_start = file.file.read(1024)
file_md = file_md5(content_start) file_md = file_md5(content_start)
save_path = Path(f"static_data/upload_files/{common_type}/{file_type}") save_path = Path(f"static_data/upload_files/{common_type}/{file_type}")
file_save_path = save_path / file_md file_save_path = save_path / (file_md + file_type_end)
file_url = f'/static_data/upload_files/{common_type}/{file_type}/{file_md}' file_url = f'/static_data/upload_files/{common_type}/{file_type}/{file_md + file_type_end}'
if not os.path.exists(save_path): if not os.path.exists(save_path):
os.makedirs(save_path) os.makedirs(save_path)
user_file = FileCrud.get_file_by_md(db, file_md) user_file = FileCrud.get_file_by_md(db, file_md)
@ -46,7 +51,7 @@ def file_upload(name: str = Header(None), file: UploadFile = File(...),
else: else:
break break
user_file = FileCrud.add_file(db, user_file = FileCrud.add_file(db,
FileSechemas.UserFileCreate(md=file_md, file_name=name or file.filename, FileSechemas.UserFileCreate(md=file_md, file_name=file_org_name,
mime_type=mime_type, mime_type=mime_type,
user_id=token_data.email, common_type=common_type, user_id=token_data.email, common_type=common_type,
file_url=file_url)) file_url=file_url))

View File

@ -1,7 +1,9 @@
from fastapi import APIRouter, Depends, HTTPException from fastapi import APIRouter, Depends, HTTPException
from pydantic import BaseModel
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
from Models.DepartmentModel import Department from Models.DepartmentModel import Department
from Models.PostModel import Post from Models.PostModel import Post
from Models.UserModel import User
from Schemas import UserSchemas from Schemas import UserSchemas
from Crud import UserCrud, AuthCrud from Crud import UserCrud, AuthCrud
from Schemas.UserSchemas import TokenData from Schemas.UserSchemas import TokenData
@ -163,6 +165,66 @@ def refresh_token(token_data: TokenData = Depends(token_data_depend), db: Sessio
return {'token': token} return {'token': token}
class GetLoginVerifyCodeReq(BaseModel):
account: str
@router.post("/get_login_verify_code", tags=["用户接口"], summary="获取登录验证码")
def get_login_verify_code(body: GetLoginVerifyCodeReq, db: Session = Depends(get_db)):
try:
account = body.account
user = db.query(User).filter(User.email == account).first()
if user:
account_type = 'email'
else:
user = db.query(User).filter(User.phone == account).first()
if user:
account_type = "phone"
else:
raise HTTPException(detail="账号未录入系统", status_code=303)
if account_type == 'email':
EmailVerifyCode.send_login_code(account)
if account_type == 'phone':
PhoneVerifyCode.send_code(account, PhoneVerifyType.login)
except HTTPException as e:
raise e
except Exception as e:
print(e)
raise HTTPException(detail="验证码发送失败", status_code=403)
return {"msg": f"验证码已发送至{'邮箱' if account_type == 'email' else '手机'},请查看", "state": 1}
class LoginByVerifyCode(BaseModel):
account: str
code: str
@router.post('/login_by_verify_code', tags=["用户接口"], summary='验证码登录')
def login_by_verify_code(req: LoginByVerifyCode,
db: Session = Depends(get_db)):
account = req.account
if PhoneVerifyCode.check_code(account, req.code, PhoneVerifyType.login):
account_type = 'phone'
else:
if EmailVerifyCode.check_code(account, req.code, EmailVerifyType.login):
account_type = 'email'
else:
raise HTTPException(detail="验证码错误", status_code=303)
user = None
if account_type == 'phone':
user = db.query(User).filter(User.phone == account).first()
if account_type == 'email':
user = db.query(User).filter(User.email == account).first()
if not user:
raise HTTPException(detail="账号未录入系统", status_code=303)
auth_data = AuthCrud.get_user_auth(db, user.email)
user_data = user.to_dict()
user_data["auth_data"] = auth_data
token_data = TokenData(**user_data).dict()
token = create_token(token_data)
return {'msg': "成功", 'state': 1, 'data': {'token': token, 'user_info': user_data}}
@router.post("/get_user_by_department", tags=["用户接口"], summary="根据部门列表获取用户信息", @router.post("/get_user_by_department", tags=["用户接口"], summary="根据部门列表获取用户信息",
response_model=UserSchemas.GetUserByDepartmentRes) response_model=UserSchemas.GetUserByDepartmentRes)
def get_user_by_department(body: UserSchemas.GetUserByDepartmentReq, token_data: TokenData = Depends(token_data_depend), def get_user_by_department(body: UserSchemas.GetUserByDepartmentReq, token_data: TokenData = Depends(token_data_depend),