forth commit

main
Lyanling 1 month ago
parent e85ced7137
commit 718566efb1

@ -40,6 +40,7 @@ INSTALLED_APPS = [
'polls', 'polls',
'rest_framework', 'rest_framework',
'drf_spectacular', 'drf_spectacular',
'corsheaders'
] ]
MIDDLEWARE = [ MIDDLEWARE = [
@ -50,8 +51,15 @@ MIDDLEWARE = [
'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware', 'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware',
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
] ]
CORS_ORIGIN_ALLOW_ALL = True
CORS_ALLOW_CREDENTIALS = True
CORS_ALLOW_ALL_ORIGINS = True
ROOT_URLCONF = 'mysite10_7.urls' ROOT_URLCONF = 'mysite10_7.urls'
TEMPLATES = [ TEMPLATES = [
@ -133,4 +141,28 @@ DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
REST_FRAMEWORK = { REST_FRAMEWORK = {
'DEFAULT_SCHEMA_CLASS': 'drf_spectacular.openapi.AutoSchema', # 使用 drf-spectacular 生成接口 'DEFAULT_SCHEMA_CLASS': 'drf_spectacular.openapi.AutoSchema', # 使用 drf-spectacular 生成接口
} }
# -----------------------
CORS_ALLOW_METHODS = (
'DELETE',
'GET',
'OPTIONS',
'PATCH',
'POST',
'PUT',
'VIEW',
)
CORS_ALLOW_HEADERS = (
'XMLHttpRequest',
'X_FILENAME',
'accept-encoding',
'authorization',
'content-type',
'dnt',
'origin',
'user-agent',
'x-csrftoken',
'x-requested-with',
'Pragma',
)

@ -1,3 +1,38 @@
<!--&lt;!&ndash;<!DOCTYPE html>&ndash;&gt;-->
<!--&lt;!&ndash;<html lang="en">&ndash;&gt;-->
<!--&lt;!&ndash;<head>&ndash;&gt;-->
<!--&lt;!&ndash; <meta charset="UTF-8">&ndash;&gt;-->
<!--&lt;!&ndash; <title>确认点名</title>&ndash;&gt;-->
<!--&lt;!&ndash;</head>&ndash;&gt;-->
<!--&lt;!&ndash;<body>&ndash;&gt;-->
<!--&lt;!&ndash;<form method="post">&ndash;&gt;-->
<!--&lt;!&ndash; {% csrf_token %}&ndash;&gt;-->
<!--&lt;!&ndash; <h2>确认点名学生:</h2>&ndash;&gt;-->
<!--&lt;!&ndash; <p>姓名: {{ student.name }}</p>&ndash;&gt;-->
<!--&lt;!&ndash; <p>学号: {{ student.student_id }}</p>&ndash;&gt;-->
<!--&lt;!&ndash; <label for="attended">是否到达课堂:</label>&ndash;&gt;-->
<!--&lt;!&ndash; <input type="checkbox" name="attended" id="attended">&ndash;&gt;-->
<!--&lt;!&ndash; <label for="question_repeat">是否准确重复问题:</label>&ndash;&gt;-->
<!--&lt;!&ndash; <select name="question_repeat" id="question_repeat">&ndash;&gt;-->
<!--&lt;!&ndash; <option value="inaccurate">不准确</option>&ndash;&gt;-->
<!--&lt;!&ndash; <option value="accurate">准确</option>&ndash;&gt;-->
<!--&lt;!&ndash; </select>&ndash;&gt;-->
<!--&lt;!&ndash; <label for="answer_accuracy">回答问题准确性:</label>&ndash;&gt;-->
<!--&lt;!&ndash; <select name="answer_accuracy" id="answer_accuracy">&ndash;&gt;-->
<!--&lt;!&ndash; <option value="0">0分 - 未回答准确</option>&ndash;&gt;-->
<!--&lt;!&ndash; <option value="0.5">0.5分 - 回答部分正确</option>&ndash;&gt;-->
<!--&lt;!&ndash; <option value="1.5">1.5分 - 回答大部分正确</option>&ndash;&gt;-->
<!--&lt;!&ndash; <option value="3">3分 - 完全正确</option>&ndash;&gt;-->
<!--&lt;!&ndash; </select>&ndash;&gt;-->
<!--&lt;!&ndash; <button type="submit">确认并提交</button>&ndash;&gt;-->
<!--&lt;!&ndash;</form>&ndash;&gt;-->
<!--&lt;!&ndash;</body>&ndash;&gt;-->
<!--&lt;!&ndash;</html>&ndash;&gt;-->
<!--<!DOCTYPE html>--> <!--<!DOCTYPE html>-->
<!--<html lang="en">--> <!--<html lang="en">-->
<!--<head>--> <!--<head>-->
@ -31,45 +66,10 @@
<!-- <button type="submit">确认并提交</button>--> <!-- <button type="submit">确认并提交</button>-->
<!--</form>--> <!--</form>-->
<!--{% if protection_awarded %}-->
<!--<p>该学生获得保护权自动加2分</p>-->
<!--{% endif %}-->
<!--</body>--> <!--</body>-->
<!--</html>--> <!--</html>-->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>确认点名</title>
</head>
<body>
<form method="post">
{% csrf_token %}
<h2>确认点名学生:</h2>
<p>姓名: {{ student.name }}</p>
<p>学号: {{ student.student_id }}</p>
<label for="attended">是否到达课堂:</label>
<input type="checkbox" name="attended" id="attended">
<label for="question_repeat">是否准确重复问题:</label>
<select name="question_repeat" id="question_repeat">
<option value="inaccurate">不准确</option>
<option value="accurate">准确</option>
</select>
<label for="answer_accuracy">回答问题准确性:</label>
<select name="answer_accuracy" id="answer_accuracy">
<option value="0">0分 - 未回答准确</option>
<option value="0.5">0.5分 - 回答部分正确</option>
<option value="1.5">1.5分 - 回答大部分正确</option>
<option value="3">3分 - 完全正确</option>
</select>
<button type="submit">确认并提交</button>
</form>
{% if protection_awarded %}
<p>该学生获得保护权自动加2分</p>
{% endif %}
</body>
</html>

@ -1,27 +1,27 @@
<!DOCTYPE html> <!--<!DOCTYPE html>-->
<html> <!--<html>-->
<head> <!--<head>-->
<title>积分排行榜</title> <!-- <title>积分排行榜</title>-->
</head> <!--</head>-->
<body> <!--<body>-->
<h1>积分排行榜</h1> <!-- <h1>积分排行榜</h1>-->
<table border="1"> <!-- <table border="1">-->
<tr> <!-- <tr>-->
<th>排名</th> <!-- <th>排名</th>-->
<th>学号</th> <!-- <th>学号</th>-->
<th>姓名</th> <!-- <th>姓名</th>-->
<th>积分</th> <!-- <th>积分</th>-->
<th>到课次数</th> <!-- <th>到课次数</th>-->
</tr> <!-- </tr>-->
{% for student in students %} <!-- {% for student in students %}-->
<tr> <!-- <tr>-->
<td>{{ forloop.counter }}</td> <!-- 使用forloop.counter显示排名 --> <!-- <td>{{ forloop.counter }}</td> &lt;!&ndash; 使用forloop.counter显示排名 &ndash;&gt;-->
<td>{{ student.student_id }}</td> <!-- <td>{{ student.student_id }}</td>-->
<td>{{ student.name }}</td> <!-- <td>{{ student.name }}</td>-->
<td>{{ student.score }}</td> <!-- <td>{{ student.score }}</td>-->
<td>{{ student.attendance_count }}</td> <!-- <td>{{ student.attendance_count }}</td>-->
</tr> <!-- </tr>-->
{% endfor %} <!-- {% endfor %}-->
</table> <!-- </table>-->
</body> <!--</body>-->
</html> <!--</html>-->

@ -1,15 +1,15 @@
<!DOCTYPE html> <!--<!DOCTYPE html>-->
<html lang="en" xmlns="http://www.w3.org/1999/html"> <!--<html lang="en" xmlns="http://www.w3.org/1999/html">-->
<head> <!--<head>-->
<meta charset="UTF-8"> <!-- <meta charset="UTF-8">-->
<title>登录</title> <!-- <title>登录</title>-->
</head> <!--</head>-->
<body> <!--<body>-->
<form action="/polls/index/" method="post"> <!--<form action="/polls/index/" method="post">-->
{% csrf_token %} <!-- {% csrf_token %}-->
<p><label>用户名:</label><input name="user"/></p> <!--<p><label>用户名:</label><input name="user"/></p>-->
<p><label>密码:</label><input name="pwd"/></p> <!--<p><label>密码:</label><input name="pwd"/></p>-->
<input type="submit" value="提交"> <!-- <input type="submit" value="提交">-->
</form> <!--</form>-->
</body> <!--</body>-->
</html> <!--</html>-->

@ -1,15 +1,15 @@
<!DOCTYPE html> <!--<!DOCTYPE html>-->
<html lang="en"> <!--<html lang="en">-->
<head> <!--<head>-->
<meta charset="UTF-8"> <!-- <meta charset="UTF-8">-->
<title>注册</title> <!-- <title>注册</title>-->
</head> <!--</head>-->
<body> <!--<body>-->
<form action="/polls/register/" method="post"> <!--<form action="/polls/register/" method="post">-->
{% csrf_token %} <!-- {% csrf_token %}-->
<p><label>用户名:</label><input name="user"/></p> <!-- <p><label>用户名:</label><input name="user"/></p>-->
<p><label>密码:</label><input name="pwd"/></p> <!-- <p><label>密码:</label><input name="pwd"/></p>-->
<input type="submit" value="注册"> <!-- <input type="submit" value="注册">-->
</form> <!--</form>-->
</body> <!--</body>-->
</html> <!--</html>-->

@ -1,15 +1,15 @@
<!DOCTYPE html> <!--<!DOCTYPE html>-->
<html lang="en"> <!--<html lang="en">-->
<head> <!--<head>-->
<meta charset="UTF-8"> <!-- <meta charset="UTF-8">-->
<title>Title</title> <!-- <title>Title</title>-->
</head> <!--</head>-->
<body> <!--<body>-->
<form method="post" enctype="multipart/form-data"> <!--<form method="post" enctype="multipart/form-data">-->
{% csrf_token %} <!-- {% csrf_token %}-->
{{ form.as_p }} <!-- {{ form.as_p }}-->
<button type="submit">上传学生名单</button> <!-- <button type="submit">上传学生名单</button>-->
</form> <!--</form>-->
</body> <!--</body>-->
</html> <!--</html>-->

@ -1,3 +0,0 @@
from django.test import TestCase
# Create your tests here.

@ -1,165 +1,3 @@
# from django.shortcuts import render
# from django.http import HttpResponse
# from .models import *
# from django.shortcuts import render, redirect, get_object_or_404
# import random
# import pandas as pd
# from django.db.models import Window, F
# from django.db.models.functions import Rank
# # 导入表单
# from .forms import UploadFileForm
#
# from rest_framework import viewsets
# from .serializers import StudentSerializer
#
# from rest_framework.response import Response
# from rest_framework.decorators import api_view
# # Create your views here.
# def toLogin_view(request):
# return render(request,'login.html')
# def Login_view(request):
# u=request.POST.get("user",'')
# p=request.POST.get("pwd",'')
#
# if u and p:
# c=StudentInfo.objects.filter(stu_name=u,stu_pwd=p).count()
# if c >= 1:
# return HttpResponse("登录成功!")
# else:
# return HttpResponse("账号密码错误!")
# else:
# return HttpResponse("请输入正确的账号和密码!")
#
# def toregister_view(request):
# return render(request, 'register.html')
#
# # #点击注册后做的逻辑判断
# def register_view(request):
# u = request.POST.get("user", '')
# p = request.POST.get("pwd", '')
# if u and p:
# stu = StudentInfo(stu_id=random.choice('0123456789'),stu_name=u, stu_pwd=p)
# stu.save()
# return HttpResponse("注册成功")
# else:
# return HttpResponse("请输入完整的账号和密码!")
#
# #导入excel
# # 上传学生名单的视图
# def upload_students(request):
# if request.method == 'POST':
# form = UploadFileForm(request.POST, request.FILES)
# if form.is_valid():
# # 读取上传的 Excel 文件
# excel_file = request.FILES['file']
# df = pd.read_excel(excel_file) # 使用 pandas 读取 Excel 文件
#
# # 遍历 DataFrame将每个学生保存到数据库
# for _, row in df.iterrows():
# student_id = row['student_id']
# name = row['name']
# Student.objects.get_or_create(student_id=student_id, name=name) # 如果学生已存在则不创建
#
# return redirect('roll_call') # 完成后重定向到点名页面
# else:
# form = UploadFileForm()
#
# return render(request, 'upload_students.html', {'form': form}) # 渲染上传页面
#
# # 开始点名的视图
# def roll_call(request):
# students = Student.objects.all() # 获取所有学生
# selected_student = None # 初始化被选中的学生
#
# # 当教师点击“开始点名”按钮时
# if request.method == 'POST' and 'start_roll_call' in request.POST:
# # 设置权重:总分越高,被点名的概率越低
# weights = [1 / (student.score + 1) for student in students] # 根据分数调整被点名概率
# selected_student = random.choices(students, weights=weights, k=1)[0] # 随机选择一个学生
# request.session['selected_student_id'] = selected_student.student_id # 存储被点名学生的ID到session中
# return redirect('confirm_roll_call') # 跳转到确认点名页面
#
# return render(request, 'roll_call.html', {'selected_student': selected_student}) # 渲染点名页面
#
# # 确认点名的视图
# # def confirm_roll_call(request):
# # # 从 session 中获取被点名的学生
# # student_id = request.session.get('selected_student_id')
# # student = get_object_or_404(Student, student_id=student_id)
# #
# # if request.method == 'POST':
# # # 学生是否到课
# # if 'attended' in request.POST: # 如果选择了到课
# # student.score += 1 # 到课加1分
# # student.attendance_count += 1 # 到课次数加1
# #
# # # 处理是否准确重复问题
# # if request.POST['question_repeat'] == 'accurate':
# # student.score += 0.5 # 重复问题准确加0.5分
# # else:
# # student.score -= 1 # 重复问题不准确扣1分
# #
# # # 处理回答问题的准确性0-3分
# # answer_accuracy = float(request.POST.get('answer_accuracy', 0))
# # student.score += answer_accuracy # 根据回答准确性加分
# # else:
# # student.score -= 5 # 未到课扣5分
# #
# # student.save() # 保存更新后的学生信息
# # return redirect('roll_call') # 返回点名页面,进行下一轮点名
# #
# # return render(request, 'confirm_roll_call.html', {'student': student}) # 渲染确认点名页面
# def confirm_roll_call(request):
# student_id = request.session.get('selected_student_id')
# student = get_object_or_404(Student, student_id=student_id)
# protection_awarded = False # 初始化保护权标志
#
# if request.method == 'POST':
# # 增加学生的被点名次数
# student.called_count += 1
#
# # 检查学生是否有“保护权”
# if student.called_count % 3 == 0:
# # 如果被点名次数是3的倍数赋予保护权自动加2分
# student.score += 2
# protection_awarded = True # 设置保护权标志
# print(f"Student {student.name} ({student.student_id})获得保护权自动加2分")
# else:
# # 学生是否到课
# if 'attended' in request.POST: # 如果选择了到课
# student.score += 1 # 到课加1分
# student.attendance_count += 1 # 到课次数加1
#
# # 处理是否准确重复问题
# if request.POST['question_repeat'] == 'accurate':
# student.score += 0.5 # 重复问题准确加0.5分
# else:
# student.score -= 1 # 重复问题不准确扣1分
#
# # 处理回答问题的准确性0-3分
# answer_accuracy = float(request.POST.get('answer_accuracy', 0))
# student.score += answer_accuracy # 根据回答准确性加分
# else:
# student.score -= 5 # 未到课扣5分
#
# # 保存更新后的学生信息
# student.save()
# return redirect('roll_call') # 返回点名页面,进行下一轮点名
#
# return render(request, 'confirm_roll_call.html', {'student': student, 'protection_awarded': protection_awarded}) # 渲染确认点名页面
#
#
#
#
# # 积分排行榜
# def leaderboard(request):
# students = Student.objects.all().order_by('-score') # 按分数降序排列
# return render(request, 'leaderboard.html', {'students': students})
#
#
# class StudentViewSet(viewsets.ModelViewSet):
# queryset = Student.objects.all() # 获取所有学生数据
# serializer_class = StudentSerializer # 指定序列化器
from django.shortcuts import render from django.shortcuts import render
from django.http import HttpResponse from django.http import HttpResponse
from .models import * from .models import *
@ -167,86 +5,43 @@ from django.shortcuts import render, redirect, get_object_or_404
import random import random
from django.http import JsonResponse from django.http import JsonResponse
import pandas as pd import pandas as pd
import json
from django.db.models import Window, F from django.db.models import Window, F
from django.db.models.functions import Rank from django.db.models.functions import Rank
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from django.views.decorators.csrf import csrf_exempt
# 导入表单 # 导入表单
from .forms import UploadFileForm from .forms import UploadFileForm
# Create your views here.
def toLogin_view(request):
return render(request,'login.html')
# def Login_view(request):
# u=request.POST.get("user",'')
# p=request.POST.get("pwd",'')
#
# if u and p:
# c=StudentInfo.objects.filter(stu_name=u,stu_pwd=p).count()
# if c >= 1:
# return HttpResponse("登录成功!")
# else:
# return HttpResponse("账号密码错误!")
# else:
# return HttpResponse("请输入正确的账号和密码!")
def Login_view(request): @csrf_exempt
u = request.POST.get("user", '')
p = request.POST.get("pwd", '')
if u and p:
c = StudentInfo.objects.filter(stu_name=u, stu_pwd=p).count()
if c >= 1:
return JsonResponse({"message": "登录成功!"})
else:
return JsonResponse({"message": "账号密码错误!"}, status=400)
else:
return JsonResponse({"message": "请输入正确的账号和密码!"}, status=400)
def toregister_view(request): def toregister_view(request):
return render(request, 'register.html') return JsonResponse({'message': '注册成功!'})
import json
from django.views.decorators.csrf import csrf_exempt
# #点击注册后做的逻辑判断 @csrf_exempt # 可选,视具体情况决定是否使用
# def register_view(request): def register_view(request):
# u = request.POST.get("user", '') if request.method == 'POST':
# p = request.POST.get("pwd", '') try:
# if u and p: data = json.loads(request.body) # 从请求体中加载 JSON 数据
# stu = StudentInfo(stu_id=random.choice('0123456789'),stu_name=u, stu_pwd=p) u = data.get("user", '')
# stu.save() p = data.get("pwd", '')
# return HttpResponse("注册成功")
# else: if u and p:
# return HttpResponse("请输入完整的账号和密码!") stu = StudentInfo(stu_id=random.choice('0123456789'), stu_name=u, stu_pwd=p)
stu.save()
return JsonResponse({"message": "注册成功"})
else:
return JsonResponse({"message": "请输入完整的账号和密码!"}, status=400)
except json.JSONDecodeError:
return JsonResponse({"message": "无效的 JSON 数据!"}, status=400)
return JsonResponse({"message": "只支持 POST 请求!"}, status=405)
def register_view(request):
u = request.POST.get("user", '')
p = request.POST.get("pwd", '')
if u and p:
stu = StudentInfo(stu_id=random.choice('0123456789'), stu_name=u, stu_pwd=p)
stu.save()
return JsonResponse({"message": "注册成功"})
else:
return JsonResponse({"message": "请输入完整的账号和密码!"}, status=400)
#导入excel
# 上传学生名单的视图
# def upload_students(request):
# if request.method == 'POST':
# form = UploadFileForm(request.POST, request.FILES)
# if form.is_valid():
# # 读取上传的 Excel 文件
# excel_file = request.FILES['file']
# df = pd.read_excel(excel_file) # 使用 pandas 读取 Excel 文件
#
# # 遍历 DataFrame将每个学生保存到数据库
# for _, row in df.iterrows():
# student_id = row['student_id']
# name = row['name']
# Student.objects.get_or_create(student_id=student_id, name=name) # 如果学生已存在则不创建
#
# return redirect('roll_call') # 完成后重定向到点名页面
# else:
# form = UploadFileForm()
# #
# return render(request, 'upload_students.html', {'form': form}) # 渲染上传页面 @csrf_exempt
def upload_students(request): def upload_students(request):
if request.method == 'POST': if request.method == 'POST':
form = UploadFileForm(request.POST, request.FILES) form = UploadFileForm(request.POST, request.FILES)
@ -268,156 +63,116 @@ def upload_students(request):
return render(request, 'upload_students.html', {'form': form}) # 确保在GET请求时返回HttpResponse return render(request, 'upload_students.html', {'form': form}) # 确保在GET请求时返回HttpResponse
# return render(request, 'upload_students.html', {'form': form}) # 渲染上传页面
# # 开始点名的视图 @csrf_exempt # 如果需要,可以移除此装饰器,确保 CSRF 保护
# def roll_call(request):
# students = Student.objects.all() # 获取所有学生
# selected_student = None # 初始化被选中的学生
#
# # 当教师点击“开始点名”按钮时
# if request.method == 'POST' and 'start_roll_call' in request.POST:
# # 设置权重:总分越高,被点名的概率越低
# weights = [1 / (student.score + 1) for student in students] # 根据分数调整被点名概率
# selected_student = random.choices(students, weights=weights, k=1)[0] # 随机选择一个学生
# request.session['selected_student_id'] = selected_student.student_id # 存储被点名学生的ID到session中
# return redirect('confirm_roll_call') # 跳转到确认点名页面
#
# return render(request, 'roll_call.html', {'selected_student': selected_student}) # 渲染点名页面
def roll_call(request): def roll_call(request):
students = Student.objects.all() # 获取所有学生 students = Student.objects.all() # 获取所有学生
selected_student = None # 初始化被选中的学生
# 当教师点击“开始点名”按钮时 # 当教师点击“开始点名”按钮时
if request.method == 'POST' and 'start_roll_call' in request.POST: if request.method == 'POST':
# 设置权重:总分越高,被点名的概率越低 try:
weights = [1 / (student.score + 1) for student in students] # 根据分数调整被点名概率 data = json.loads(request.body) # 从请求中读取 JSON 数据
selected_student = random.choices(students, weights=weights, k=1)[0] # 随机选择一个学生 if data.get('start_roll_call') == 'true':
request.session['selected_student_id'] = selected_student.student_id # 存储被点名学生的ID到session中 # 设置权重:总分越高,被点名的概率越低
return JsonResponse({"message": "点名成功", "student_id": selected_student.student_id, "student_name": selected_student.name}) weights = [1 / (student.score + 1) for student in students] # 根据分数调整被点名概率
selected_student = random.choices(students, weights=weights, k=1)[0] # 随机选择一个学生
return render(request, 'roll_call.html', {'selected_student': selected_student}) # 渲染点名页面 request.session['selected_student_id'] = selected_student.student_id # 存储被点名学生的ID到session中
# 确认点名的视图 return JsonResponse({"message": "点名成功", "student_id": selected_student.student_id, "student_name": selected_student.name})
# def confirm_roll_call(request): except json.JSONDecodeError:
# # 从 session 中获取被点名的学生 return JsonResponse({"error": "无效的 JSON 数据"}, status=400)
# student_id = request.session.get('selected_student_id')
# student = get_object_or_404(Student, student_id=student_id) # 返回错误信息,如果不是 POST 请求或没有触发点名
# return JsonResponse({"error": "只支持 POST 请求"}, status=405)
# if request.method == 'POST':
# # 学生是否到课 @csrf_exempt
# if 'attended' in request.POST: # 如果选择了到课
# student.score += 1 # 到课加1分
# student.attendance_count += 1 # 到课次数加1
#
# # 处理是否准确重复问题
# if request.POST['question_repeat'] == 'accurate':
# student.score += 0.5 # 重复问题准确加0.5分
# else:
# student.score -= 1 # 重复问题不准确扣1分
#
# # 处理回答问题的准确性0-3分
# answer_accuracy = float(request.POST.get('answer_accuracy', 0))
# student.score += answer_accuracy # 根据回答准确性加分
# else:
# student.score -= 5 # 未到课扣5分
#
# student.save() # 保存更新后的学生信息
# return redirect('roll_call') # 返回点名页面,进行下一轮点名
#
# return render(request, 'confirm_roll_call.html', {'student': student}) # 渲染确认点名页面
# def confirm_roll_call(request):
# student_id = request.session.get('selected_student_id')
# student = get_object_or_404(Student, student_id=student_id)
# protection_awarded = False # 初始化保护权标志
#
# if request.method == 'POST':
# # 增加学生的被点名次数
# student.called_count += 1
#
# # 检查学生是否有“保护权”
# if student.called_count % 3 == 0:
# # 如果被点名次数是3的倍数赋予保护权自动加2分
# student.score += 2
# protection_awarded = True # 设置保护权标志
# print(f"Student {student.name} ({student.student_id})获得保护权自动加2分")
# else:
# # 学生是否到课
# if 'attended' in request.POST: # 如果选择了到课
# student.score += 1 # 到课加1分
# student.attendance_count += 1 # 到课次数加1
#
# # 处理是否准确重复问题
# if request.POST['question_repeat'] == 'accurate':
# student.score += 0.5 # 重复问题准确加0.5分
# else:
# student.score -= 1 # 重复问题不准确扣1分
#
# # 处理回答问题的准确性0-3分
# answer_accuracy = float(request.POST.get('answer_accuracy', 0))
# student.score += answer_accuracy # 根据回答准确性加分
# else:
# student.score -= 5 # 未到课扣5分
#
# # 保存更新后的学生信息
# student.save()
# return redirect('roll_call') # 返回点名页面,进行下一轮点名
#
# return render(request, 'confirm_roll_call.html', {'student': student, 'protection_awarded': protection_awarded}) # 渲染确认点名页面
#
#
#
#
# # 积分排行榜
# def leaderboard(request):
# students = Student.objects.all().order_by('-score') # 按分数降序排列
# return render(request, 'leaderboard.html', {'students': students})
def confirm_roll_call(request): def confirm_roll_call(request):
student_id = request.session.get('selected_student_id')
student = get_object_or_404(Student, student_id=student_id)
protection_awarded = False # 初始化保护权标志
if request.method == 'POST': if request.method == 'POST':
# 增加学生的被点名次数 try:
student.called_count += 1 # 从请求体中解析 JSON 数据
data = json.loads(request.body)
# 检查学生是否有“保护权” student_id = data.get('student_id')
if student.called_count % 3 == 0:
student.score += 2 # 确保 student_id 存在
protection_awarded = True # 设置保护权标志 if not student_id:
print(f"Student {student.name} ({student.student_id})获得保护权自动加2分") return JsonResponse({"message": "未找到被点名学生ID"}, status=400)
else:
# 学生是否到课 # 获取学生对象若不存在则返回404
if 'attended' in request.POST: # 如果选择了到课 student = get_object_or_404(Student, student_id=student_id)
student.score += 1 # 到课加1分 protection_awarded = False # 初始化保护权标志
student.attendance_count += 1 # 到课次数加1
# 增加学生的被点名次数
# 处理是否准确重复问题 student.called_count += 1
if request.POST['question_repeat'] == 'accurate':
student.score += 0.5 # 重复问题准确加0.5分 # 检查学生是否有“保护权”
else: if student.called_count % 3 == 0:
student.score -= 1 # 重复问题不准确扣1分 student.score += 2
protection_awarded = True # 设置保护权标志
# 处理回答问题的准确性0-3分 print(f"Student {student.name} ({student.student_id})获得保护权自动加2分")
answer_accuracy = float(request.POST.get('answer_accuracy', 0))
student.score += answer_accuracy # 根据回答准确性加分
else: else:
student.score -= 5 # 未到课扣5分 # 学生是否到课
attended = data.get('attended', 'false').lower() == 'true' # 转为布尔值
if attended: # 如果选择了到课
student.score += 1 # 到课加1分
student.attendance_count += 1 # 到课次数加1
# 处理是否准确重复问题
if data.get('question_repeat') == 'accurate':
student.score += 0.5 # 重复问题准确加0.5分
else:
student.score -= 1 # 重复问题不准确扣1分
# 处理回答问题的准确性0-3分
answer_accuracy = float(data.get('answer_accuracy', 0))
student.score += answer_accuracy # 根据回答准确性加分
else:
student.score -= 5 # 未到课扣5分
# 保存更新后的学生信息 # 保存更新后的学生信息
student.save() student.save()
return JsonResponse({ return JsonResponse({
"message": "确认点名成功", "message": "确认点名成功",
"student_id": student.student_id, "student_id": student.student_id,
"student_name": student.name, "student_name": student.name,
"current_score": student.score, "current_score": student.score,
"protection_awarded": protection_awarded "protection_awarded": protection_awarded
}) })
return render(request, 'confirm_roll_call.html', except json.JSONDecodeError:
{'student': student, 'protection_awarded': protection_awarded}) # 渲染确认点名页面 return JsonResponse({"message": "请求体解析错误"}, status=400)
# GET 请求时渲染页面
return JsonResponse({"message": "不支持的请求方法"}, status=405)
@csrf_exempt
def leaderboard(request): def leaderboard(request):
students = Student.objects.all().order_by('-score') # 按分数降序排列 students = Student.objects.all().order_by('-score') # 按分数降序排列
leaderboard_data = [{"student_id": student.student_id, "name": student.name, "score": student.score} for student in students] leaderboard_data = [{"student_id": student.student_id, "name": student.name, "score": student.score} for student in students]
return JsonResponse({"leaderboard": leaderboard_data}) # 返回排行榜数据 return JsonResponse({"leaderboard": leaderboard_data}) # 返回排行榜数据
# 111
@csrf_exempt # If you're testing without CSRF protection
def toLogin_view(request):
return JsonResponse({"message": "请提供用户名和密码进行登录"})
@csrf_exempt
def Login_view(request):
if request.method == 'POST':
try:
data = json.loads(request.body)
u = data.get("user", '')
p = data.get("pwd", '')
if u and p:
c = StudentInfo.objects.filter(stu_name=u, stu_pwd=p).count()
if c >= 1:
return JsonResponse({"message": "登录成功!"})
else:
return JsonResponse({"message": "账号密码错误!"}, status=400)
else:
return JsonResponse({"message": "请输入正确的账号和密码!"}, status=400)
except json.JSONDecodeError:
return JsonResponse({"message": "无效的JSON数据"}, status=400)
return JsonResponse({"message": "仅支持POST请求"}, status=405)

@ -0,0 +1,6 @@
from django.http import JsonResponse
def leaderboard_view(request):
response = JsonResponse({'data': 'your data'})
response["Access-Control-Allow-Origin"] = "http://localhost:8000"
return response

@ -0,0 +1,19 @@
import requests
# 目标 URL
url = 'http://127.0.0.1:8000/polls/index/'
# 测试数据
data = {
'user': 'zmm', # 用于测试的用户名
'pwd': 'Zmm' # 用于测试的密码
}
# 发送 POST 请求
response = requests.post(url, data=data)
# 检查响应状态和内容
if response.status_code == 200:
print("登录成功:", response.json())
else:
print("登录失败:", response.status_code, response.json())

@ -0,0 +1,29 @@
import requests
import json
# 点名请求
roll_call_url = 'http://127.0.0.1:8000/polls/roll_call/'
roll_call_response = requests.post(roll_call_url, json={'start_roll_call': 'true'})
if roll_call_response.status_code == 200:
print("点名成功:", roll_call_response.json())
selected_student_id = roll_call_response.json()['student_id']
# 确认点名请求
confirm_roll_call_url = 'http://127.0.0.1:8000/polls/confirm_roll_call/'
confirm_data = {
'student_id': selected_student_id,
'attended': 'true',
'question_repeat': 'accurate',
'answer_accuracy': 2.0
}
confirm_response = requests.post(confirm_roll_call_url, json=confirm_data)
if confirm_response.status_code == 200:
print("确认点名成功:", confirm_response.json())
else:
print("确认点名失败:", confirm_response.status_code, confirm_response.text)
else:
print("点名失败:", roll_call_response.status_code, roll_call_response.text)

@ -0,0 +1,13 @@
import requests
# 设定接口 URL
leaderboard_url = 'http://127.0.0.1:8000/polls/leaderboard/'
# 发送 GET 请求
response = requests.get(leaderboard_url)
# 检查请求是否成功
if response.status_code == 200:
print("排行榜数据:", response.json())
else:
print("请求失败:", response.status_code, response.text)

@ -0,0 +1,19 @@
import requests
import json
# 目标 URL
url = 'http://127.0.0.1:8000/polls/register/'
# 发送 POST 请求,使用 json 参数而不是 data
data = {
'user': 'zmm12300000', # 用于测试的用户名
'pwd': 'Zmm12314' # 用于测试的密码
}
response = requests.post(url, json=data) # 使用 json 参数发送数据
# 检查响应状态和内容
if response.status_code == 200:
print("注册成功:", response.json())
else:
print("注册失败:", response.status_code, response.json())

@ -0,0 +1,20 @@
import requests
# 目标 URL
url = 'http://127.0.0.1:8000/polls/roll_call/'
# 发送 POST 请求,模拟教师点击“开始点名”按钮
data = {
'start_roll_call': 'true' # 发送一个模拟参数以触发点名功能
}
response = requests.post(url, json=data) # 使用 json 参数
# 检查响应状态和内容
if response.status_code == 200:
try:
print("点名成功:", response.json())
except ValueError:
print("响应不是有效的 JSON:", response.text)
else:
print("点名失败:", response.status_code, response.text)

@ -0,0 +1,18 @@
import requests
# 目标 URL
url = 'http://127.0.0.1:8000/polls/upload/' # 确保与 Django 开发服务器地址一致
# 准备要上传的 Excel 文件
files = {
'file': open('D:/python20240709/pycharm/mingdan.xlsx', 'rb') # 替换为你的 Excel 文件路径
}
# 发送 POST 请求
response = requests.post(url, files=files)
# 检查响应状态和内容
if response.status_code == 200:
print("学生信息上传成功:", response.json())
else:
print("上传失败:", response.status_code, response.json())
Loading…
Cancel
Save