You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
78 lines
2.5 KiB
78 lines
2.5 KiB
import json
|
|
from datetime import datetime, timedelta
|
|
|
|
import jwt
|
|
|
|
from django.views.decorators.csrf import csrf_exempt
|
|
from Student.models import *
|
|
from teacher.models import Teacher
|
|
from EduSystemServer.settings import TOKEN_KEY
|
|
from EduSystemServer.utils import *
|
|
|
|
|
|
# 用户登录成功后生成 JWT Token
|
|
def generate_jwt_token(user, _type):
|
|
# 设置 Token 的有效期
|
|
expiration_time = datetime.utcnow() + timedelta(hours=1)
|
|
print(datetime.utcnow())
|
|
print(expiration_time)
|
|
|
|
# 构建 Token 数据
|
|
payload = {
|
|
'type': _type,
|
|
'username': user.username,
|
|
'exp': expiration_time
|
|
}
|
|
# 使用密钥对数据进行签名生成 Token
|
|
token = jwt.encode(payload, TOKEN_KEY, algorithm='HS256')
|
|
return token
|
|
|
|
@csrf_exempt
|
|
def login(request):
|
|
"""
|
|
登录
|
|
"""
|
|
username = request.POST.get("username")
|
|
password = request.POST.get("password")
|
|
_type = request.POST.get("type")
|
|
if _type == "student":
|
|
student = Student.objects.filter(username=username,
|
|
password=password).first()
|
|
if student:
|
|
result = student.to_dict()
|
|
result = ResponseUtil.ok(result, "login success!")
|
|
result["token"] = generate_jwt_token(student, "student").decode("utf-8")
|
|
else:
|
|
result = {"code": -1, "message": "username or password error!"}
|
|
elif _type == "teacher":
|
|
teacher = Teacher.objects.filter(username=username,
|
|
password=password).first()
|
|
if teacher:
|
|
result = teacher.to_dict()
|
|
result = ResponseUtil.ok(result, "login success!")
|
|
result["token"] = generate_jwt_token(teacher, "teacher").decode("utf-8")
|
|
else:
|
|
result = ResponseUtil.error("username or password error!")
|
|
else:
|
|
result = ResponseUtil.error("type error!")
|
|
response = JsonResponse(result)
|
|
return response
|
|
|
|
@csrf_exempt
|
|
def get_user_info(request):
|
|
"""
|
|
返回用户信息
|
|
"""
|
|
_type = request.jwt_payload.get("type")
|
|
username = request.jwt_payload.get("username")
|
|
if _type == "student":
|
|
student = Student.objects.filter(username=username).first()
|
|
result = ResponseUtil.ok(student.to_dict())
|
|
elif _type == "teacher":
|
|
teacher = Teacher.objects.filter(username=username).first()
|
|
result = ResponseUtil.ok(teacher.to_dict())
|
|
else:
|
|
result = ResponseUtil.error("type error")
|
|
request.session.clear()
|
|
return JsonResponse(result)
|