202 lines
7.2 KiB
Python
202 lines
7.2 KiB
Python
import uuid
|
|
from django.core.files import File
|
|
from django.http import JsonResponse, Http404
|
|
from django.shortcuts import render, redirect
|
|
from .form import RegisterForm, LoginForm, CreateForm, AnswerForm
|
|
from .models import CyberUser, Question, Choice
|
|
from django.contrib.auth import authenticate, login, logout
|
|
from django.contrib.auth.decorators import login_required
|
|
|
|
|
|
# Create your views here.
|
|
|
|
def home(request):
|
|
content = {'user': request.user}
|
|
return render(request, 'home.html', content)
|
|
|
|
|
|
def register(request):
|
|
if request.method == 'GET':
|
|
return render(request, 'register.html', {'form': RegisterForm()})
|
|
elif request.method == 'POST':
|
|
form = RegisterForm(request.POST)
|
|
if form.is_valid():
|
|
username = form.cleaned_data['username']
|
|
nickname = form.cleaned_data['nickname']
|
|
password = form.cleaned_data['password1']
|
|
email = form.cleaned_data['email']
|
|
username_exist = CyberUser.objects.filter(username=username).exists()
|
|
if username_exist:
|
|
return JsonResponse({"code": 400,
|
|
"message": "验证失败",
|
|
"data": {"username": "",
|
|
"password1": "",
|
|
"password2": "",
|
|
"email": "",
|
|
},
|
|
})
|
|
CyberUser.objects.create_user(
|
|
username=username,
|
|
nickname=nickname,
|
|
password=password,
|
|
email=email,
|
|
)
|
|
return JsonResponse({"code": 200,
|
|
"message": "验证通过,已注册",
|
|
"data": {"username": "",
|
|
"password1": "",
|
|
"password2": "",
|
|
"email": "",
|
|
},
|
|
})
|
|
else:
|
|
return JsonResponse({"code": 400, "message": "验证失败", "data": {"username": form.errors.get("username"),
|
|
"password1": form.errors.get("password1"),
|
|
"password2": form.errors.get("password2"),
|
|
"email": form.errors.get("email")}})
|
|
else:
|
|
raise Http404
|
|
|
|
|
|
def login_view(request):
|
|
if request.method == 'GET':
|
|
return render(request, 'login.html', {'form': LoginForm()})
|
|
elif request.method == 'POST':
|
|
form = LoginForm(request.POST)
|
|
if form.is_valid():
|
|
username = form.cleaned_data['username']
|
|
password = form.cleaned_data['password']
|
|
user = authenticate(request, username=username, password=password)
|
|
if user and user.is_active:
|
|
login(request, user)
|
|
request.session['username'] = username
|
|
request.session.set_expiry(1800)
|
|
return JsonResponse(
|
|
{
|
|
"code": 200,
|
|
"message": '登陆成功',
|
|
"data": username,
|
|
}
|
|
)
|
|
elif user and user.is_active:
|
|
return JsonResponse(
|
|
{
|
|
"code": 400,
|
|
"message": "用户状态错误,请联系管理员修正",
|
|
"data": "user is not active",
|
|
}
|
|
)
|
|
else:
|
|
return JsonResponse(
|
|
{
|
|
"code": 400,
|
|
"message": "用户名或密码错误",
|
|
"data": None,
|
|
}
|
|
)
|
|
else:
|
|
return JsonResponse(
|
|
{
|
|
"code": 400,
|
|
"message": "验证失败,用户名或密码格式错误",
|
|
"data": form.errors.get(),
|
|
}
|
|
)
|
|
else:
|
|
raise Http404
|
|
|
|
|
|
def logout_view(request):
|
|
logout(request)
|
|
return redirect('/exam/login')
|
|
|
|
|
|
@login_required
|
|
def create_question(request):
|
|
if request.method == 'GET':
|
|
return render(request, 'create.html', {'form': CreateForm})
|
|
elif request.method == 'POST':
|
|
form = CreateForm(request.POST, request.FILES)
|
|
if form.is_valid():
|
|
text = form.cleaned_data['text']
|
|
image = form.cleaned_data['image']
|
|
a = form.cleaned_data['a']
|
|
b = form.cleaned_data['b']
|
|
c = form.cleaned_data['c']
|
|
d = form.cleaned_data['d']
|
|
answer = form.cleaned_data['answer']
|
|
new_question = Question(
|
|
question_text=text,
|
|
choice_a=a,
|
|
choice_b=b,
|
|
choice_c=c,
|
|
choice_d=d,
|
|
answer=answer,
|
|
)
|
|
if image:
|
|
new_question.image = File(image, name=f'{str(uuid.uuid4())}.jpg')
|
|
new_question.save()
|
|
return JsonResponse(
|
|
{
|
|
'code': 200,
|
|
'message': 'success',
|
|
'data': '',
|
|
}
|
|
)
|
|
else:
|
|
return JsonResponse(
|
|
{
|
|
'code': 400,
|
|
'message': '参数不正确',
|
|
'data': form.errors
|
|
}
|
|
)
|
|
|
|
|
|
@login_required
|
|
def get_question(request):
|
|
user = request.user
|
|
question = Question.objects.exclude(choice__user=user).order_by('?').first()
|
|
return render(request, "question.html", {'question': question, 'form': AnswerForm, 'user': request.user})
|
|
|
|
|
|
@login_required
|
|
def answer(request):
|
|
if request.method == 'POST':
|
|
form = AnswerForm(request.POST)
|
|
if form.is_valid():
|
|
user = request.user
|
|
user_ans = form.cleaned_data['answer']
|
|
questionID = form.cleaned_data['questionID']
|
|
question = Question.objects.get(uid=questionID)
|
|
if Choice.objects.filter(user=user, question=question).exists():
|
|
return JsonResponse(
|
|
{
|
|
'code': 200,
|
|
'message': '该问题已经回答过了',
|
|
'data': '',
|
|
}
|
|
)
|
|
choice = Choice(user=user, question=question, choice=user_ans)
|
|
choice.save()
|
|
if user_ans == question.answer:
|
|
user.score = user.score + 1
|
|
user.save()
|
|
return JsonResponse(
|
|
{
|
|
'code': 200,
|
|
'message': 'success',
|
|
'data': {'correction': user_ans == question.answer},
|
|
}
|
|
)
|
|
else:
|
|
return JsonResponse(
|
|
{
|
|
'code': 400,
|
|
'message': '参数错误',
|
|
'data': '表单不可用',
|
|
}
|
|
)
|
|
else:
|
|
return Http404
|