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.

103 lines
4.1 KiB

4 months ago
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 .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}) # 渲染确认点名页面