194 lines
6.6 KiB
Python
194 lines
6.6 KiB
Python
from datetime import timedelta
|
||
from typing import Any
|
||
|
||
import redis
|
||
from fastapi import APIRouter, Body, Depends, HTTPException, Request
|
||
from fastapi.security import OAuth2PasswordRequestForm
|
||
from motor.motor_asyncio import AsyncIOMotorClient, AsyncIOMotorDatabase
|
||
|
||
import crud, schemas
|
||
from api import deps
|
||
from core import security
|
||
from core.config import settings
|
||
from db.redisdb import RedisDrive, get_redis_pool
|
||
from utils import get_uid, random_hex
|
||
from db import get_database
|
||
from utils.dingding import send_dates
|
||
|
||
router = APIRouter()
|
||
|
||
host = settings.REDIS_CONF.get('host')
|
||
port = settings.REDIS_CONF.get('port')
|
||
db = settings.REDIS_CONF.get('db')
|
||
redisdb = redis.Redis(host=host, port=port, db=db)
|
||
|
||
@router.post("/send_auth_code")
|
||
async def reset_password(request: Request,
|
||
data_in: schemas.send,
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
rdb: RedisDrive = Depends(get_redis_pool)
|
||
):
|
||
"""发送验证码"""
|
||
res= await crud.user.get_by_user(db,data_in.name)
|
||
user_id=res['user_id']
|
||
# X平台登陆提醒:你的验证码是7933
|
||
if res['types'] == 1: # 内部员工发送验证码
|
||
code=random_hex(4)
|
||
content=f'X平台登陆提醒:你的验证码是{code}'
|
||
send_dates(content, [user_id]) # 发送验证码
|
||
redisdb.set(name=user_id, value=code, ex=120) # 120秒
|
||
return schemas.Msg(code=0, msg='ok',data='')
|
||
|
||
|
||
@router.post("/login")
|
||
async def login(
|
||
# data: schemas.UserLogin,
|
||
#code:str,
|
||
data: OAuth2PasswordRequestForm = Depends(),
|
||
db: AsyncIOMotorDatabase = Depends(get_database)
|
||
) -> Any:
|
||
"""
|
||
OAuth2兼容令牌登录,获取将来令牌的访问令牌
|
||
"""
|
||
user = await crud.user.authenticate(db,
|
||
name=data.username, password=data.password
|
||
)
|
||
if user.types == 1: # 内部员工校验验证码
|
||
rdbcode=redisdb.get(user.user_id)
|
||
if rdbcode == None:
|
||
return schemas.Msg(code=-1, msg='验证码过期')
|
||
if rdbcode.decode() != data.scopes[0]:
|
||
return schemas.Msg(code=-1, msg='验证码错误')
|
||
if not user:
|
||
# raise HTTPException(status_code=400, detail="Incorrect name or password")
|
||
return schemas.Msg(code=-1, msg='密码或用户名错误')
|
||
access_token_expires = timedelta(minutes=settings.ACCESS_TOKEN_EXPIRE_MINUTES)
|
||
# access_token_expires = timedelta(seconds=5)
|
||
await crud.user.update_login_time(db, data.username)
|
||
|
||
return {
|
||
'data': {
|
||
'name': user.name,
|
||
'nickname': user.nickname,
|
||
'email': user.email,
|
||
'tel': user.tel,
|
||
'userid': user.id,
|
||
|
||
'token': security.create_access_token(
|
||
expires_delta=access_token_expires, _id=str(user.id), email=user.email,
|
||
nickname=user.nickname,
|
||
is_superuser=user.is_superuser, name=user.name,
|
||
data_where=user.data_where,
|
||
),
|
||
"token_type": "bearer",
|
||
|
||
},
|
||
'access_token': security.create_access_token(
|
||
expires_delta=access_token_expires, _id=str(user.id), email=user.email,
|
||
nickname=user.nickname,
|
||
is_superuser=user.is_superuser, name=user.name, data_where=user.data_where
|
||
),
|
||
"token_type": "bearer",
|
||
|
||
'code': 0,
|
||
'msg': 'success',
|
||
}
|
||
|
||
|
||
@router.get("/me", response_model=schemas.User)
|
||
def me(current_user: schemas.User = Depends(deps.get_current_user)) -> Any:
|
||
"""
|
||
Test access token
|
||
"""
|
||
return current_user
|
||
|
||
|
||
@router.post("/reset_password")
|
||
async def reset_password(request: Request,
|
||
game: str,
|
||
data_in: schemas.UserRestPassword,
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
current_user: schemas.User = Depends(deps.get_current_user)
|
||
) -> Any:
|
||
"""
|
||
修改其他人密码
|
||
"""
|
||
try:
|
||
await crud.user.reset_password(db, data_in)
|
||
except Exception as e:
|
||
return schemas.Msg(code=0, msg='修改失败', data={'username': data_in})
|
||
return schemas.Msg(code=0, msg='ok')
|
||
|
||
|
||
@router.post("/reset_my_password")
|
||
async def reset_password(request: Request,
|
||
game: str,
|
||
data_in: schemas.UserRestMyPassword,
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
current_user: schemas.User = Depends(deps.get_current_user)
|
||
) -> Any:
|
||
"""
|
||
修改自己的密码
|
||
"""
|
||
await crud.user.reset_password(db, schemas.UserRestPassword(username=current_user.name, password=data_in.password))
|
||
return schemas.Msg(code=0, msg='ok')
|
||
|
||
|
||
@router.post("/edit_profile")
|
||
async def edit_profile(request: Request,
|
||
game: str,
|
||
data_in: schemas.UserProfileEdit,
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
current_user: schemas.User = Depends(deps.get_current_user)
|
||
) -> Any:
|
||
"""
|
||
编辑用户资料
|
||
"""
|
||
await crud.user.edit_profile(db, data_in, user_id=request.user.id)
|
||
return schemas.Msg(code=0, msg='ok', data=data_in)
|
||
|
||
|
||
@router.get("/all_account")
|
||
async def all_account(page: int = 1, limit: int = 100, db: AsyncIOMotorDatabase = Depends(get_database),
|
||
current_user: schemas.User = Depends(deps.get_current_user)
|
||
) -> Any:
|
||
"""
|
||
获取所有用户
|
||
"""
|
||
page -= 1
|
||
if page < 0:
|
||
page = 0
|
||
cursor = crud.user.find(db).skip(page * limit).limit(limit)
|
||
|
||
data = [schemas.UserDB(**user) async for user in cursor]
|
||
|
||
return schemas.Msg(code=0, msg='ok', data=data)
|
||
|
||
|
||
@router.post("/add_account")
|
||
async def all_account(
|
||
data_in: schemas.CreateAccount,
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
current_user: schemas.User = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
"""
|
||
创建新账号
|
||
"""
|
||
created = []
|
||
id = []
|
||
for name in data_in.account_list:
|
||
if is_exists := await crud.user.exists(db, {'name': name}):
|
||
continue
|
||
else:
|
||
new_account = schemas.UserCreate(name=name, password='123')
|
||
created.append(name)
|
||
# 创建账户并返回id
|
||
id_one = await crud.user.create(db, new_account)
|
||
id.append(id_one)
|
||
res = {
|
||
'created_account': created,
|
||
'password': '123',
|
||
'id': id
|
||
}
|
||
return schemas.Msg(code=0, msg='ok', data=res)
|