300 lines
12 KiB
Python
300 lines
12 KiB
Python
import os
|
|
from datetime import datetime
|
|
from pathlib import Path
|
|
from django.contrib.auth import authenticate, login, logout
|
|
from django.contrib.auth.decorators import login_required
|
|
from django.views.decorators.csrf import csrf_exempt
|
|
|
|
from mainProject.models import UserPlus, corretingWord, Wrong
|
|
from django.http import JsonResponse, Http404, StreamingHttpResponse, FileResponse
|
|
from django.shortcuts import render, HttpResponse, redirect
|
|
|
|
from mainProject.models import simdFiles
|
|
from zhipuai import ZhipuAI
|
|
from docx import Document
|
|
from docx.shared import Pt
|
|
|
|
|
|
def index(request):
|
|
username = request.session.get("username")
|
|
word_list = simdFiles.objects.filter(user_id=username).values()
|
|
profession = request.session.get("profession")
|
|
return render(request, "index.html", {'word_list': word_list, "username": username, "profession": profession})
|
|
|
|
|
|
def login_page(request):
|
|
return render(request, "login.html")
|
|
|
|
|
|
def upload(request):
|
|
username = request.session.get("username")
|
|
word_list = list(simdFiles.objects.filter(user_id=username).values('id', 'title'))
|
|
returnData = {}
|
|
for item in word_list:
|
|
temp = corretingWord.objects.filter(word_id=item['id']).values()
|
|
for item_x in temp:
|
|
returnData['id'] = item['id']
|
|
returnData['score'] = item_x['score']
|
|
returnData['title'] = item['title']
|
|
profession = request.session.get("profession")
|
|
return render(request, "upload.html", {'word_list': returnData, "username": username, "profession": profession})
|
|
|
|
@csrf_exempt
|
|
def change(request):
|
|
if request.method == 'POST':
|
|
data = request.POST.get('password') # 获取 Ajax 请求中的数据
|
|
username = request.session.get("username")
|
|
UserPlus.objects.filter(username=username).update(password=data)
|
|
return JsonResponse({"result": 1}) # 返回处理结果
|
|
|
|
|
|
def logout_x(request):
|
|
logout(request)
|
|
request.session.clear()
|
|
return redirect("/index/")
|
|
|
|
|
|
@login_required
|
|
def user_page(request):
|
|
username = request.session.get("username")
|
|
profession = request.session.get("profession")
|
|
number = corretingWord.objects.filter(student_id=username).count()
|
|
data = {"username": username, "profession": profession, "number": number}
|
|
return render(request, "user.html", data)
|
|
|
|
|
|
def static_page(request):
|
|
profession = request.session.get("profession")
|
|
username = request.session.get("username")
|
|
scores = [
|
|
corretingWord.objects.filter(score__range=(0, 10)).count(),
|
|
corretingWord.objects.filter(score__range=(11, 20)).count(),
|
|
corretingWord.objects.filter(score__range=(21, 30)).count(),
|
|
corretingWord.objects.filter(score__range=(31, 40)).count(),
|
|
corretingWord.objects.filter(score__range=(41, 50)).count(),
|
|
corretingWord.objects.filter(score__range=(51, 60)).count(),
|
|
corretingWord.objects.filter(score__range=(61, 70)).count(),
|
|
corretingWord.objects.filter(score__range=(71, 80)).count(),
|
|
corretingWord.objects.filter(score__range=(81, 90)).count(),
|
|
corretingWord.objects.filter(score__range=(91, 100)).count(),
|
|
]
|
|
|
|
all_type = Wrong.objects.values('title').distinct()
|
|
type_a = []
|
|
number = []
|
|
for i in all_type:
|
|
count = Wrong.objects.filter(title=i['title']).count()
|
|
number.append(count)
|
|
type_a.append(i['title'])
|
|
|
|
return render(request, "statical.html",
|
|
{"username": username, "profession": profession, "scores": scores, "all_type": type_a,
|
|
"number": number})
|
|
|
|
|
|
@csrf_exempt
|
|
def login_x(request):
|
|
if request.method == 'GET':
|
|
return render(
|
|
request,
|
|
'login.html',
|
|
)
|
|
elif request.method == 'POST':
|
|
# 获取参数
|
|
user_name = request.POST.get('username', '')
|
|
pwd = request.POST.get('password', '')
|
|
# 用户已存在
|
|
if UserPlus.objects.filter(username=user_name):
|
|
# 使用内置方法验证
|
|
user = authenticate(username=user_name, password=pwd)
|
|
usern = UserPlus.objects.get(username=user_name)
|
|
profession = usern.profession
|
|
# 验证通过
|
|
if user:
|
|
# 用户已激活
|
|
if user.is_active:
|
|
login(request, usern)
|
|
request.session["username"] = user_name
|
|
request.session["profession"] = profession
|
|
return redirect("/index/")
|
|
# 未激活
|
|
else:
|
|
return JsonResponse({
|
|
'code': 200,
|
|
'msg': '用户未激活'
|
|
})
|
|
|
|
# 验证失败
|
|
else:
|
|
return JsonResponse({
|
|
'code': 403,
|
|
'msg': '用户认证失败'
|
|
})
|
|
# 用户不存在
|
|
else:
|
|
return redirect('/login_page')
|
|
|
|
|
|
def register_page(request):
|
|
return render(request, "register.html")
|
|
|
|
|
|
def register(request):
|
|
if request.method == 'GET':
|
|
return render(
|
|
request,
|
|
'register.html'
|
|
)
|
|
elif request.method == 'POST':
|
|
# 获取参数
|
|
user_name = request.POST.get('username', '')
|
|
pwd = request.POST.get('password', '')
|
|
pparameter = request.POST.getlist('select')
|
|
# 将数组转化为字符串
|
|
pparameter = ','.join(pparameter)
|
|
# 用户已存在
|
|
if UserPlus.objects.filter(username=user_name):
|
|
return JsonResponse({
|
|
'code': 200,
|
|
'msg': '用户已存在'
|
|
})
|
|
# 用户不存在
|
|
else:
|
|
# 使用User内置方法创建用户
|
|
user = UserPlus.objects.create_user(
|
|
username=user_name,
|
|
password=pwd,
|
|
profession=pparameter,
|
|
email='123@qq.com',
|
|
is_staff=1,
|
|
is_active=1,
|
|
is_superuser=0
|
|
)
|
|
usern = UserPlus.objects.get(username=user_name)
|
|
login(request, usern)
|
|
request.session["username"] = user_name
|
|
request.session["profession"] = pparameter
|
|
print(pparameter)
|
|
return redirect("/index/")
|
|
else:
|
|
return JsonResponse({
|
|
'code': 403,
|
|
'msg': '被禁止的请求'
|
|
})
|
|
|
|
|
|
# 这是一个迭代器,减少内存占用
|
|
def read_file(url, chunk_size=512):
|
|
with open(url, "rb") as f:
|
|
while True:
|
|
c = f.read(chunk_size)
|
|
if c:
|
|
yield c
|
|
else:
|
|
break
|
|
|
|
|
|
@login_required
|
|
def download(request):
|
|
path = corretingWord.objects.filter(word_id=request.GET.get('id')).first()
|
|
file = Path(str(path.file_correting.name)).resolve()
|
|
if file.is_file():
|
|
response = FileResponse(open(file, 'rb'), as_attachment=True)
|
|
return response
|
|
else:
|
|
return HttpResponse('文件不存在')
|
|
|
|
|
|
@login_required
|
|
def word_upload(request):
|
|
if request.method == 'POST':
|
|
username = request.session.get('username')
|
|
profession = UserPlus.objects.filter(username=username).values('profession')
|
|
profession_x = profession[0].get('profession')
|
|
files = request.FILES.getlist('words')
|
|
word_list = simdFiles.objects.filter(user_id=username).values()
|
|
if profession_x == 0 and len(files) > 1:
|
|
return render(request, 'upload.html', {'word_list': word_list})
|
|
time = "D:\\upload" + datetime.now().strftime(
|
|
'%Y-%m-%d-%H-%M-%S') + username
|
|
# 遍历写入到数据库中
|
|
for word in files:
|
|
if not os.path.exists('D:\\upload'):
|
|
os.mkdir('D:\\upload')
|
|
# 写入到数据库中
|
|
simdFiles.objects.create(title=word.name,
|
|
file_upload=time + word.name,
|
|
user_id=request.session.get('username'))
|
|
doc = Document(word)
|
|
s = ''
|
|
for para in doc.paragraphs:
|
|
s += para.text
|
|
client = ZhipuAI(api_key="a8d31831195a45a1570692903062a660.zxJIB74Ibupbpdqh")
|
|
response = client.chat.completions.create(
|
|
model="glm-4",
|
|
messages=[
|
|
{"role": "system", "content":
|
|
"你现在是一名教授python课程的大学老师,现在你要参考标准答案,结合自身知识储备批阅学生的作业,你很清楚Python"
|
|
"编程类填空题具有一定的主观性,与标准答案稍有差别的学生答案也有可能正确,需要你谨慎批改。"},
|
|
{"role": "system",
|
|
"content": "请你批改作业中的填空题,给出该学生的最终得分,并按照文本格式返回给我"},
|
|
{
|
|
"role": "system",
|
|
"content": "请在最后以"
|
|
"学生成绩:"
|
|
"所有错误题号:"
|
|
"的形式严格发给我,在最后不需要你的提示或者注意!!!学生成绩后面只需要分数,例如学生成绩:3"
|
|
},
|
|
{
|
|
"role": "user",
|
|
"content": "以下是学生的作业:"
|
|
},
|
|
{
|
|
"role": "user",
|
|
"content": s
|
|
}
|
|
],
|
|
stream=True
|
|
)
|
|
file = Document()
|
|
file.encoding = 'utf-8'
|
|
var = ''
|
|
for chunk in response:
|
|
var += chunk.choices[0].delta.content
|
|
|
|
pg = file.add_paragraph(var)
|
|
response = client.chat.completions.create(
|
|
model="glm-4",
|
|
messages=[
|
|
{"role": "user", "content": var},
|
|
{"role": "user",
|
|
"content": "请提取上文中学生的成绩 以及错误题号 只需要返回给我 成绩: 错误题号:,以下为返回样例 成绩:3 错误题号:19,20"}
|
|
],
|
|
stream=True
|
|
)
|
|
x = ''
|
|
for chunk in response:
|
|
x += chunk.choices[0].delta.content
|
|
temp = x.split("\n")
|
|
score = temp[0].split(":")[1]
|
|
ti = temp[1].split(":")[1].split(",")
|
|
for i in ti:
|
|
Wrong.objects.create(student_id=username, title=i)
|
|
run = pg.runs[0]
|
|
run.font.name = '宋体'
|
|
run.font.size = Pt(12)
|
|
word_ixd = simdFiles.objects.filter(
|
|
file_upload=time + word.name).values(
|
|
'id')
|
|
word_realid = word_ixd[0].get('id')
|
|
corretingWord.objects.create(word_id=word_realid, file_correting="D:\\download\\" +
|
|
datetime.now().strftime(
|
|
'%Y-%m-%d-%H-%M-%S') +
|
|
username + word.name,
|
|
student_id=username,
|
|
cor_time=datetime.now(), score=score)
|
|
if not os.path.exists('D:\\download'):
|
|
os.mkdir('D:\\download')
|
|
file.save("D:\\download\\" + datetime.now().strftime('%Y-%m-%d-%H-%M-%S') + username + word.name)
|
|
return redirect('/upload/')
|