120 lines
3.6 KiB
Python
120 lines
3.6 KiB
Python
# -*- coding: utf-8 -*-
|
|
# @Time : 2022/5/14 15:05
|
|
# @Author : 臧成龙
|
|
# @FileName: login.py
|
|
# @Software: PyCharm
|
|
import json
|
|
from datetime import datetime
|
|
# from django.core.cache import cache
|
|
|
|
from django.contrib import auth
|
|
from django.forms import model_to_dict
|
|
from django.shortcuts import get_object_or_404
|
|
from ninja import Router, ModelSchema, Query, Schema, Field
|
|
|
|
from fuadmin.settings import SECRET_KEY, TOKEN_LIFETIME
|
|
from system.models import Users, Role, MenuButton, MenuColumnField
|
|
from utils.fu_jwt import FuJwt
|
|
from utils.fu_response import FuResponse
|
|
from utils.request_util import save_login_log
|
|
from utils.usual import get_user_info_from_token
|
|
|
|
router = Router()
|
|
|
|
|
|
class SchemaOut(ModelSchema):
|
|
homePath: str = Field(None, alias="home_path")
|
|
|
|
class Config:
|
|
model = Users
|
|
model_exclude = ['password', 'role', 'post']
|
|
|
|
|
|
class LoginSchema(Schema):
|
|
username: str = Field(None, alias="username")
|
|
password: str = Field(None, alias="password")
|
|
|
|
|
|
class Out(Schema):
|
|
multi_depart: str
|
|
sysAllDictItems: str
|
|
departs: str
|
|
userInfo: SchemaOut
|
|
token: str
|
|
|
|
|
|
@router.post("/login", response=Out, auth=None)
|
|
def login(request, data: LoginSchema):
|
|
user_obj = auth.authenticate(request, **data.dict())
|
|
if user_obj:
|
|
request.user = user_obj
|
|
role = user_obj.role.all().values('id')
|
|
post = list(user_obj.post.all().values('id'))
|
|
role_list = []
|
|
post_list = []
|
|
for item in role:
|
|
role_list.append(item['id'])
|
|
for item in post:
|
|
post_list.append(item['id'])
|
|
user_obj_dic = model_to_dict(user_obj)
|
|
user_obj_dic['post'] = post_list
|
|
user_obj_dic['role'] = role_list
|
|
del user_obj_dic['password']
|
|
del user_obj_dic['avatar']
|
|
|
|
time_now = int(datetime.now().timestamp())
|
|
jwt = FuJwt(SECRET_KEY, user_obj_dic, valid_to=time_now + TOKEN_LIFETIME)
|
|
# 将生成的token加入缓存
|
|
# cache.set(user_obj.id, jwt.encode())
|
|
token = f"bearer {jwt.encode()}"
|
|
data = {
|
|
"multi_depart": 1,
|
|
"sysAllDictItems": "q",
|
|
"departs": "e",
|
|
'userInfo': user_obj_dic,
|
|
'token': token
|
|
}
|
|
save_login_log(request=request)
|
|
return data
|
|
else:
|
|
return FuResponse(code=500, msg="账号/密码错误")
|
|
|
|
|
|
@router.get("/logout", auth=None)
|
|
def get_post(request):
|
|
# 删除缓存
|
|
user_info = get_user_info_from_token(request)
|
|
# cache.delete(user_info['id'])
|
|
return FuResponse(msg="注销成功")
|
|
|
|
|
|
@router.get("/userinfo", response=SchemaOut)
|
|
def get_userinfo(request):
|
|
user_info = get_user_info_from_token(request)
|
|
user = get_object_or_404(Users, id=user_info['id'])
|
|
return user
|
|
|
|
|
|
@router.get("/permCode")
|
|
def route_menu_tree(request):
|
|
"""用于前端获取当前用户的按钮权限"""
|
|
token_user = get_user_info_from_token(request)
|
|
user = Users.objects.get(id=token_user['id'])
|
|
|
|
if not token_user['is_superuser']:
|
|
menu_button_ids = user.role.values_list('permission__id', flat=True)
|
|
menu_column_ids = user.role.values_list('column__id', flat=True)
|
|
|
|
# queryset = MenuButton.objects.filter(id__in=menuIds, status=1).values()
|
|
queryset_button = MenuButton.objects.filter(id__in=menu_button_ids)
|
|
queryset_column = MenuColumnField.objects.filter(id__in=menu_column_ids)
|
|
else:
|
|
queryset_button = MenuButton.objects.all()
|
|
queryset_column = MenuColumnField.objects.all()
|
|
|
|
queryset = [*queryset_button, *queryset_column]
|
|
code_list = []
|
|
for item in queryset:
|
|
code_list.append(item.code)
|
|
return FuResponse(data=code_list)
|