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.

110 lines
4.4 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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
# 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 leaderboard(request):
students = Student.objects.all().order_by('-score') # 按分数降序排列
return render(request, 'leaderboard.html', {'students': students})