Compare commits

...

No commits in common. 'a280b2c96b56d849231aac581638ec46ea1e7da3' and '54bdbccdaa4d8f902edbc31fbddadc82e4a14b99' have entirely different histories.

@ -1 +0,0 @@
114514

@ -1,6 +1,5 @@
from django.db import models
# Create your models here.
class UserInfo(models.Model):
"""

@ -45,30 +45,30 @@ def register(request):
def server_error(request):
error_msg = '该手机号或用户名已被注册!'
return HttpResponse("asedfsdf")
def login00(request):
if request.method == 'GET':
return render(request, 'login.html')
error_msg = ""
user = request.POST.get('email')
pwd = request.POST.get('password')
temp_RawQuerySet = UserInfo.objects.raw('select * from app02_userfo')
for temp in temp_RawQuerySet:
if temp.username == user and temp.password == pwd:
if temp.identity == '老师':
return redirect('http://www.baidu.com')
else:
return redirect('http://www.baidu.com')
else:
# 用户密码不匹配
error_msg = '用户名或密码错误'
return render(request, 'login.html', {'error_msg': error_msg})
return HttpResponse("")
# def login00(request):
#
# if request.method == 'GET':
# return render(request, 'login.html')
#
# error_msg = ""
# user = request.POST.get('email')
# pwd = request.POST.get('password')
#
# temp_RawQuerySet = UserInfo.objects.raw('select * from app02_userfo')
#
# for temp in temp_RawQuerySet:
# if temp.username == user and temp.password == pwd:
# if temp.identity == '老师':
# return redirect('http://www.baidu.com')
# else:
# return redirect('http://www.baidu.com')
# else:
# # 用户密码不匹配
# error_msg = '用户名或密码错误'
# return render(request, 'login.html', {'error_msg': error_msg})
def login(request):
@ -85,7 +85,6 @@ def dologin(request):
# 获取表单中提交的验证码
check_code = request.POST.get('check_code')
print(check_code)
# 获取session会话中保存的code
session_checkcode = request.session.get('check_code')
if check_code and check_code.lower() == session_checkcode.lower():
@ -99,7 +98,11 @@ def dologin(request):
for temp in temp_RawQuerySet:
if temp.username == username and temp.password == password:
# ## 存入基本信息到session ## #
request.session['username'] = username
request.session['password'] = password
request.session['id_number'] = temp.id_number
request.session['name'] = temp.name
if rember == 'rember':
# 勾选了记住用户名和密码
# 将用户名和密码保存到cookie中
@ -111,9 +114,10 @@ def dologin(request):
response.delete_cookie('pwd')
if temp.identity == '老师':
return render(request, 'teacher_client.html', {'username': temp.username})
return redirect('teacher_client:teacher_client')
# return render(request, 'teacher_client.html', {'username': temp.username})
else:
return redirect('http://www.baidu.com')
return redirect('student_client:student_client')
# 用户密码不匹配
response.delete_cookie('username')
@ -129,6 +133,7 @@ def logout(request):
response = HttpResponse()
response.delete_cookie('username')
response.delete_cookie('pwd')
request.session.flush()
return response and redirect('login:login')

@ -0,0 +1,3 @@
from django.contrib import admin
# Register your models here.

@ -0,0 +1,5 @@
from django.apps import AppConfig
class StudentClientConfig(AppConfig):
name = 'student_client'

@ -0,0 +1,3 @@
from django.db import models
# Create your models here.

@ -0,0 +1,100 @@
{% load static %}
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
<title>教师端口</title>
<link rel="stylesheet" href="{% static 'css/css.css' %}">
<script type="text/javascript">
function F_Open_dialog()
{document.getElementById("btn_file").click();}
</script>
<script type="text/javascript">
</script>
<!-- Bootstrap -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css" integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">
<link rel="stylesheet" href="{% static 'css/teacher.css' %}">
<!-- HTML5 shim 和 Respond.js 是为了让 IE8 支持 HTML5 元素和媒体查询media queries功能 -->
<!-- 警告:通过 file:// 协议(就是直接将 html 页面拖拽到浏览器中)访问页面时 Respond.js 不起作用 -->
<!--[if lt IE 9]>
<script src="https://fastly.jsdelivr.net/npm/html5shiv@3.7.3/dist/html5shiv.min.js"></script>
<script src="https://fastly.jsdelivr.net/npm/respond.js@1.4.2/dest/respond.min.js"></script>
<![endif]-->
</head>
<body>
<nav class="navbar navbar-default">
<div class="container-fluid">
<!-- Brand and toggle get grouped for better mobile display -->
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar">434534534354</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#">灯塔</a>
</div>
<!-- Collect the nav links, forms, and other content for toggling -->
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav">
{# <li><a>#}
{# <button type="button" onclick="F_Open_dialog()" style="border: 0px; background-color: rgba(0,0,0,0); font-size: 14px;">#}
{# <input type="file" id="btn_file" style="display:none">上传题目#}
{# </button >#}
{# </a></li>#}
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">上传文件<span class="caret"></span></a>
<ul class="dropdown-menu">
<li>
<form method="post" enctype="multipart/form-data" action="{% url 'teacher_client:file_muti' %}">
{% csrf_token %}
<div class="form-group">
<input type="file" name="exc">
</div>
<input type="submit" value="上传" class="btn btn-info btn-sm">
</form>
</li>
</ul>
</li>
<li><a href="{% url 'teacher_client:classSet' %}">我的课堂</a></li>
<li><a href="{% url 'teacher_client:test_release' %}">发布测试</a></li>
<li><a href="#">测试情况</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">欢迎, {{ username }}<span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="{% url 'login:logout' %}">退出登录</a></li>
</ul>
</li>
</ul>
</div>
</div>
</nav>
<!-- jQuery (Bootstrap 的所有 JavaScript 插件都依赖 jQuery所以必须放在前边) -->
<script src="https://fastly.jsdelivr.net/npm/jquery@1.12.4/dist/jquery.min.js" integrity="sha384-nvAa0+6Qg9clwYCGGPpDQLVpLNn0fRaROjHqs13t4Ggj3Ez50XnGQqc/r8MhnRDZ" crossorigin="anonymous"></script>
<!-- 加载 Bootstrap 的所有 JavaScript 插件。你也可以根据需要只加载单个插件。 -->
<script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js" integrity="sha384-aJ21OjlMXNL5UyIl/XNwTMqvzeRMZH2w8c5cRVpzpU8Y5bApTppSuUkhZXN0VxHd" crossorigin="anonymous"></script>
<div class="img">
<img src="img/头哥.png" alt="灯塔测试" title="灯塔测试" style="position: relative; top: -10px;">
</div>
</div>
</div>
</body>
</html>

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

@ -0,0 +1,11 @@
from django.contrib import admin
from django.urls import path
from . import views
app_name = 'student_client'
urlpatterns = [
path("student_client/", views.student_client, name = "student_client")
]

@ -0,0 +1,7 @@
from django.shortcuts import render
def student_client(request):
"""学生端口"""
if request.method == "GET":
return render(request, "student_client.html")

@ -0,0 +1,14 @@
import random
def random_num():
L = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0,
'a', 'b', 'c', 'd', 'e', 'f',
'g', 'h', 'i', 'j', 'k', 'l',
'm', 'n', 'o', 'p', 'q', 'r',
's', 't', 'u', 'v', 'w', 'x',
'y', 'z']
temp = random.sample(L, 5)
a, b, c, d, e = temp
code = str(a)+str(b)+str(c)+str(d)+str(e)
return code

@ -0,0 +1,17 @@
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse, redirect
class AuthMiddleware(MiddlewareMixin):
def process_request(self, request):
# 首先排除那些不需要登录的urls
if request.path_info == '/' or request.path_info == '/register/' or request.path_info == '/dologin/':
return None
# 获取当前访问用户登录时存入的session信息
username = request.session.get('username')
password = request.session.get('password')
# 若不为空,则已经登录
if username and password:
return None
return HttpResponse('请登录')

@ -0,0 +1,36 @@
# Generated by Django 3.1.4 on 2022-04-14 11:45
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('teacher_client', '0001_initial'),
]
operations = [
migrations.CreateModel(
name='classTable',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=32, verbose_name='姓名')),
('id_number', models.CharField(max_length=32, verbose_name='学号/教师编号')),
('phone', models.CharField(max_length=32, unique=True, verbose_name='手机')),
('classCode', models.CharField(default='', max_length=6, verbose_name='加课码')),
],
),
migrations.CreateModel(
name='teacherClass',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=32, verbose_name='姓名')),
('id_number', models.CharField(max_length=32, verbose_name='学号/教师编号')),
('classCode', models.CharField(default='', max_length=20, verbose_name='加课码')),
('classname', models.CharField(default='', max_length=20, verbose_name='课程名')),
],
),
migrations.DeleteModel(
name='questionBank',
),
]

@ -0,0 +1,26 @@
# Generated by Django 3.1.4 on 2022-04-15 09:36
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('teacher_client', '0002_auto_20220414_1945'),
]
operations = [
migrations.CreateModel(
name='questionBank',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('qus_imfomation', models.CharField(max_length=1000, verbose_name='题目信息')),
('qus_A', models.CharField(max_length=1000, verbose_name='选项A')),
('qus_B', models.CharField(max_length=1000, verbose_name='选项B')),
('qus_C', models.CharField(max_length=1000, verbose_name='选项C')),
('qus_D', models.CharField(max_length=1000, verbose_name='选项D')),
('qus_ans', models.CharField(max_length=100, verbose_name='答案')),
('que_classcode', models.CharField(max_length=10, verbose_name='所属班级')),
],
),
]

@ -0,0 +1,23 @@
# Generated by Django 3.1.4 on 2022-04-15 09:55
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('teacher_client', '0003_questionbank'),
]
operations = [
migrations.AlterField(
model_name='questionbank',
name='que_classcode',
field=models.CharField(max_length=1000, verbose_name='所属班级'),
),
migrations.AlterField(
model_name='questionbank',
name='qus_ans',
field=models.CharField(max_length=1000, verbose_name='答案'),
),
]

@ -0,0 +1,18 @@
# Generated by Django 3.1.4 on 2022-04-15 12:25
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('teacher_client', '0004_auto_20220415_1755'),
]
operations = [
migrations.AddField(
model_name='questionbank',
name='que_time',
field=models.CharField(default='', max_length=200, verbose_name='存入时间'),
),
]

@ -0,0 +1,26 @@
# Generated by Django 3.1.4 on 2022-04-15 14:51
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('teacher_client', '0005_questionbank_que_time'),
]
operations = [
migrations.CreateModel(
name='testQuestionBank',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('qus_imfomation', models.CharField(max_length=1000, verbose_name='题目信息')),
('qus_A', models.CharField(max_length=1000, verbose_name='选项A')),
('qus_B', models.CharField(max_length=1000, verbose_name='选项B')),
('qus_C', models.CharField(max_length=1000, verbose_name='选项C')),
('qus_D', models.CharField(max_length=1000, verbose_name='选项D')),
('qus_ans', models.CharField(max_length=1000, verbose_name='答案')),
('test_code', models.CharField(max_length=1000, verbose_name='所属班级')),
],
),
]

@ -0,0 +1,18 @@
# Generated by Django 3.1.4 on 2022-04-16 02:52
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('teacher_client', '0006_testquestionbank'),
]
operations = [
migrations.AddField(
model_name='testquestionbank',
name='test_time',
field=models.CharField(default='', max_length=200, verbose_name='考试时间'),
),
]

@ -1,6 +1,45 @@
from django.db import models
# class questionBank(models.Model):
# """用于存储题目数据"""
class teacherClass(models.Model):
"""记录班级加课码"""
name = models.CharField(max_length=32, verbose_name="姓名", blank=False, null=False)
id_number = models.CharField(max_length=32, verbose_name="学号/教师编号", blank=False, null=False)
classCode = models.CharField(max_length=20, verbose_name="加课码", default='')
classname = models.CharField(max_length=20, verbose_name="课程名", default='')
class classTable(models.Model):
"""班级表"""
name = models.CharField(max_length=32, verbose_name="姓名", blank=False, null=False)
id_number = models.CharField(max_length=32, verbose_name="学号/教师编号", blank=False, null=False)
phone = models.CharField(max_length=32, verbose_name="手机", unique=True, blank=False, null=False)
classCode = models.CharField(max_length=6, verbose_name="加课码", default='')
class questionBank(models.Model):
"""用于存储题目数据"""
"""用于保存用户上传提交的题目"""
qus_imfomation = models.CharField(max_length=1000, verbose_name="题目信息", blank=False, null=False)
qus_A = models.CharField(max_length=1000, verbose_name="选项A", blank=False, null=False)
qus_B = models.CharField(max_length=1000, verbose_name="选项B", blank=False, null=False)
qus_C = models.CharField(max_length=1000, verbose_name="选项C", blank=False, null=False)
qus_D = models.CharField(max_length=1000, verbose_name="选项D")
qus_ans = models.CharField(max_length=1000, verbose_name="答案", blank=False, null=False)
que_classcode = models.CharField(max_length=1000, verbose_name="所属班级", blank=False, null=False)
que_time = models.CharField(max_length=200, verbose_name="存入时间", default="")
class testQuestionBank(models.Model):
"""考试信息表"""
qus_imfomation = models.CharField(max_length=1000, verbose_name="题目信息", blank=False, null=False)
qus_A = models.CharField(max_length=1000, verbose_name="选项A", blank=False, null=False)
qus_B = models.CharField(max_length=1000, verbose_name="选项B", blank=False, null=False)
qus_C = models.CharField(max_length=1000, verbose_name="选项C", blank=False, null=False)
qus_D = models.CharField(max_length=1000, verbose_name="选项D")
qus_ans = models.CharField(max_length=1000, verbose_name="答案")
test_code = models.CharField(max_length=1000, verbose_name="所属班级", blank=False, null=False)
test_time = models.CharField(max_length=200, verbose_name="考试时间", default='')

@ -0,0 +1,47 @@
*{
padding: 0;
margin: 0;
font-size: 20px;
}
.page {
display: block;
position: relative;
/* top: 400px; */
left: 40px;
}
.all{
width: 100%;
/* width: 100px; */
height: 100vh;
display: flex;
/* left: 30px; */
/* justify-content: center; */
flex-wrap: wrap;
}
/*偷懒才用的id*/
#inputs input{
display: inline-block;
width: 100px;
height: 50px;
background-color: white;
margin: 10px;
}
.info {
position: relative;
left: 100px;
}
#table{
display: inline-block;
width: 90%;
}
tr{
width: 100%;
margin: 10px;
}
td{
text-align: center;
/* width: 50%; */
width: 200px;
height: 10vh;
border: 1px solid black;
}

@ -0,0 +1,35 @@
table
{
border-collapse: collapse;
text-align: center;
}
table td, table th
{
border: 1px solid #cad9ea;
color: #666;
height: 35px;
}
table thead th
{
background-color: #CCE8EB;
width: 100px;
}
table tr:nth-child(odd)
{
background: #fff;
}
table tr:nth-child(even)
{
background: #F5FAFA;
}
/*ul,li{ padding:0; margin:0;list-style:none}*/
/*.nav{border:1px solid #000; width:510px; overflow:hidden}*/
/*.nav li{ line-height:22px; float:left; padding:0 5px;}*/
/*.nav li a:hover{ color:#F00}*/
/*nav li{line-height:22px; float:left; padding:0 6px;}*/
/*nav li a{ color:#009900}*/

@ -0,0 +1,120 @@
*{
margin: 0px;
padding: 0px;
}
body {
/* 全局字体大小 */
font-size: 18px;
}
.page {
display: inline-block;
/*position: fixed;*/
display: block;
position: fixed;
width: 340px;
left: 8px;
top: 5px;
/* width: auto; */
height: auto;
/*border-style:solid;*/
/*border-width: 2px;*/
/*border-color:aqua;*/
padding-top: 5px;
padding: 5px;
/* background-color: red; */
}
/*.set_time {*/
/* display: flex;*/
/* display: block;*/
/* top: auto;*/
/* margin: 10px;*/
/*}*/
.set_time {
display: block;
padding: 10px;
}
.set_time input {
font-size: 20px;
width: 300px;
border-style: solid;
border-color: white;
border-bottom-color:black ;
/* 点击后无边框 */
outline:none;
}
.page1 {
border-style:solid;
border-width: 2px;
border-color:aqua;
}
.page a {
display: inline-block;
text-decoration: none;
font-size: 24px;
line-height: 50px;
text-align: center;
width: 50px;
height: 50px;
margin: 5px;
background-color: rgb(246, 224, 224);
border-style: solid;
border-width: 1px;
border-color: aquamarine
}
.page a:hover {
/* 鼠标移动到时的改变颜色 */
background-color: #5096f5;
}
.line {
display: inline-block;
position: relative;
position: fixed;
left: 368px;
width: 6px;
height: 600px;
border-radius: 6px;
background-color:rgb(129, 122, 122);
}
.test {
display: inline-block;
position: relative;
/* position: fixed; */
left: 408px;
height: auto;
/* height: 1000px; */
/* background-color: pink;*/
}
ul {
list-style-type:armenian;
}
ul .ques {
position: relative;
left: 1px;
}
li {
position: relative;
left: 20px;
/* 取消小圆点 */
list-style-type: none;
}
.write {
/* 设置下划线 */
width: 300px;
border-style: solid;
border-color: white;
border-bottom-color:black ;
/* 点击后无边框 */
outline:none;
font-size: 24px;
}
/* .write:hover{
border-style: solid;
border-color: white;
border-bottom-color:black ;
} */

@ -0,0 +1,24 @@
*{
margin: 0px;
padding: 0%;
font-size: 14px;
}
nav {
margin: 0;
padding: 0;
font-size: 14px;
}
.img {
width: 1488px;
margin: 0;
padding: 0;
position: relative;
top: -13px;
}
.class {
width: 400px;
height: 400px;
/* color: blue; */
/* background-color: red; */
}

@ -0,0 +1,15 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="{% url 'teacher_client:classSet'%}" method="post">
{% csrf_token %}
班级名:<input type="text" name="classname" placeholder="班级名称">
<input type="submit" value="提交">
</form>
</body>
</html>

@ -1,3 +1,4 @@
{% load static %}
<!doctype html>
<html lang="zh-CN">
<head>
@ -5,11 +6,19 @@
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
<title>Bootstrap 101 Template</title>
<title>教师端口</title>
<link rel="stylesheet" href="{% static 'css/css.css' %}">
<script type="text/javascript">
function F_Open_dialog()
{document.getElementById("btn_file").click();}
</script>
<script type="text/javascript">
</script>
<!-- Bootstrap -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css" integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">
<link rel="stylesheet" href="{% static 'css/teacher.css' %}">
<!-- HTML5 shim 和 Respond.js 是为了让 IE8 支持 HTML5 元素和媒体查询media queries功能 -->
<!-- 警告:通过 file:// 协议(就是直接将 html 页面拖拽到浏览器中)访问页面时 Respond.js 不起作用 -->
<!--[if lt IE 9]>
@ -35,10 +44,29 @@
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav">
<li><a href="#">上传题目</a></li>
<!-- 之后执行弹窗进行上传 -->
<li><a href="#">我的课堂</a></li>
<li><a href="#">发布测试</a></li>
{# <li><a>#}
{# <button type="button" onclick="F_Open_dialog()" style="border: 0px; background-color: rgba(0,0,0,0); font-size: 14px;">#}
{# <input type="file" id="btn_file" style="display:none">上传题目#}
{# </button >#}
{# </a></li>#}
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">上传文件<span class="caret"></span></a>
<ul class="dropdown-menu">
<li>
<form method="post" enctype="multipart/form-data" action="{% url 'teacher_client:file_muti' %}">
{% csrf_token %}
<div class="form-group">
<input type="file" name="exc">
</div>
<input type="submit" value="上传" class="btn btn-info btn-sm">
</form>
</li>
</ul>
</li>
<li><a href="{% url 'teacher_client:classSet' %}">我的课堂</a></li>
<li><a href="{% url 'teacher_client:test_release' %}">发布测试</a></li>
<li><a href="#">测试情况</a></li>
</ul>
@ -60,5 +88,82 @@
<script src="https://fastly.jsdelivr.net/npm/jquery@1.12.4/dist/jquery.min.js" integrity="sha384-nvAa0+6Qg9clwYCGGPpDQLVpLNn0fRaROjHqs13t4Ggj3Ez50XnGQqc/r8MhnRDZ" crossorigin="anonymous"></script>
<!-- 加载 Bootstrap 的所有 JavaScript 插件。你也可以根据需要只加载单个插件。 -->
<script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js" integrity="sha384-aJ21OjlMXNL5UyIl/XNwTMqvzeRMZH2w8c5cRVpzpU8Y5bApTppSuUkhZXN0VxHd" crossorigin="anonymous"></script>
<div class="img">
<img src="img/头哥.png" alt="灯塔测试" title="灯塔测试" style="position: relative; top: -10px;">
</div>
<div class="page">
<div class="all">
<!-- 导航 -->
<div id="inputs">
</div>
<!-- 表内数据 -->
<div class="info">
<table id="table">
</table>
</div>
{# <script src="{% static 'js/jsj.js' %}">#}
{##}
{# </script>#}
<script>
var classname = {{ classname|safe}};
var strs = {{ res|safe}};
//假设规定每页显示长度为3
var len = 3;
//确认该集合会被分成几页,分成几页就代表需要几个页面按钮,封装封装方便多次运用
function limits(){
var countLim = Math.ceil(strs.length/len);//余数也算是一页,这里用向上取整
//确认页面按钮个数,进行循环显示到页面上
document.getElementById("inputs").innerHTML='';//清空一下
// 导航内容每个内容需要保定一个value
for(var i=1;i<=countLim;i++){
document.getElementById("inputs").innerHTML+='<input type="button" value="'+ i +'" onclick="limitinput(this)"/ style="display: block;">';//每个页面按钮都绑定上一个点击事件
}
}
var choose = 0;//创建一个全局变量用来保存当前处于第几个页面
//点击按钮获取当前按钮的值进行选择当前table是第几页数据
function limitinput(ids){
choose = ids.value;
tablestr(choose);//刷新table数据
limits();//刷新页面按钮
ids.style.backgroundColor='red';//当前点击的页面按钮背景颜色改变为红色
liminputcolor(choose);//页面按钮变色
}
//通过当前页面按钮和页面数据长度将数据放进table内封装封装必须封装
function tablestr(num){//num是指当前哪个页面
var num1 = (num-1)*len;//确定循环开始的集合下标
var num2 = num*len;//确定循环结束的结束下标
document.getElementById("table").innerHTML='';//清空一下
for(var i=num1;i<num2;i++){//
var str = '';
for(var h in strs[i]){//遍历集合
str+='<td>'+strs[i][h]+'</td>';
}
document.getElementById("table").innerHTML+='<tr>'+str+'</tr>';//每循环一次添加一条数据
}
}
function liminputcolor(choose){
document.getElementById("inputs").childNodes[choose-1].style.backgroundColor="red";
}
//初始化,当前页面显示为第一页
limits();//页面按钮生成
document.getElementById("inputs").childNodes[0].style.backgroundColor="red";//第一个按钮的背景颜色为红色
tablestr(1);//table数据显示
/*
到这里就结束了,但是!!!这些都是被封装好了的,意思就是说,在最开始的时候这就是通用的做法;
最开始的数据就是在模拟后端的集合,也就是说,不论你后端传递给前端什么集合都可以实现分页功能
*/
</script>
</div>
</div>
</body>
</html>

@ -0,0 +1,110 @@
{% load static %}
<!DOCTYPE html>
<html lang="zh-CN">
<!-- {% load static %} -->
<head>
<meta charset="UTF-8">
<title>Title</title>
<!-- <link rel="stylesheet" href="{% static 'css/henyeqi.css' %}"> -->
<link rel="stylesheet" href="{% static 'css/stud.css' %}">
</head>
<body>
<div>
<div class="page">
<div class="page1">
{% if single_choice %}
单选题<br>
{% for counter in single_choice %}
<a href="#0{{ forloop.counter }}"><span>{{ forloop.counter }}</span></a>
{% endfor %}
{% endif %}
{% if multiple_choice %}
<br>多选题<br>
{% for counter in multiple_choice %}
<a href="#1{{ forloop.counter }}"><span>{{ forloop.counter }}</span></a>
{% endfor %}
{% endif %}
{% if gap_filling %}
<br>填空题<br>
{% for counter in gap_filling %}
<a href="#2{{ forloop.counter }}"><span>{{ forloop.counter }}</span></a>
{% endfor %}
{% endif %}
</div>
<form method="post">
{% csrf_token %}
<span class="set_time">
时间:<input type="text" name="test_time" placeholder="输入考试时间,例如 2:30">
</span>
<span>是否决定发布测试?</span><br>
<input type="submit" value="发布测试">
{% if TEST_CODE %}
本场考试的考试码为:{{ TEST_CODE }}
{% endif %}
</form>
</div>
<div class="line"></div>
</div>
<div class="test">
<form action="">
<table >
<!-- 单选 -->
{# {% for student in student_page.object_list %} #}
{% if single_choice %}
一、单选<br><br>
{% for single in single_choice %}
<ul id="0{{ forloop.counter }}">
<li class="ques"><label>{{ forloop.counter }}、(单选){{ single.qus_imfomation }}</label></li>
<li><label><input type="radio" name="choose{{ forloop.counter }}" value="A">{{ single.qus_A }}</label></li>
<li><label><input type="radio" name="choose{{ forloop.counter }}" value="B">{{ single.qus_B }}</label></li>
<li><label><input type="radio" name="choose{{ forloop.counter }}" value="C">{{ single.qus_C }}</label></li>
<li><label><input type="radio" name="choose{{ forloop.counter }}" value="D">{{ single.qus_D }}</label></li>
</ul>
<br>
{% endfor %}
{% endif %}
<!-- 多选 -->
{# {% for student in student_page.object_list %} #}
{% if multiple_choice %}
<br>二、多选<br><br>
{% for multiple in multiple_choice %}
<ul id="1{{ forloop.counter }}">
<li class="ques"><label>{{ forloop.counter }}、(多选){{ multiple.qus_imfomation }}</label></li>
<li><label><input type="checkbox" name="choose{{ forloop.counter }}" value="A">{{ multiple.qus_A }}</label></li>
<li><label><input type="checkbox" name="choose{{ forloop.counter }}" value="B">{{ multiple.qus_B }}</label></li>
<li><label><input type="checkbox" name="choose{{ forloop.counter }}" value="C">{{ multiple.qus_C }}</label></li>
<li><label><input type="checkbox" name="choose{{ forloop.counter }}" value="D">{{ multiple.qus_D }}</label></li>
</ul>
<br>
{% endfor %}
{% endif %}
<!-- 填空 -->
{# {% for student in student_page.object_list %} #}
{% if gap_filling %}
<br>三、填空题<br><br>
{% for gap in gap_filling%}
<ul id="2{{ forloop.counter }}">
<li class="ques"><label>{{ forloop.counter }}、(填空){{ gap.qus_imfomation }}</label></li>
<!-- <li><label><input type="text" name="choose" value="dhsaujdh">A.jshduse</label></li> -->
<li><label><input type="text" class="write" name="choose" placeholder="在此处作答"></label></li>
</ul>
<br>
{% endfor %}
{% endif %}
</table>
</form>
</div>
</div>
</body>
</html>

@ -2,11 +2,19 @@ from django.contrib import admin
from django.urls import path
from . import views
app_name = 'teacher_client'
urlpatterns = [
path('admin/', admin.site.urls),
path('teacher_client/', views.teacher_client),
path('teacher_client/', views.teacher_client, name="teacher_client"),
path('file_muti/', views.file_muti, name="file_muti"),
path('teacher_client/classSet/', views.classSet, name="classSet"),
path('teacher_client/test_release/', views.test_release, name="test_release")
]

@ -1,7 +1,255 @@
from django.shortcuts import render
from django.http import HttpResponse
from django.shortcuts import render, redirect
from .models import teacherClass, classTable, questionBank, testQuestionBank
from .common import createCode
import json, time
from openpyxl import load_workbook
TEST_CODE = 1000
def get_code():
code = createCode.random_num()
return code
def teacher_client(request):
"""教师服务端"""
if request.method == 'GET':
return render(request, 'teacher_client.html')
username = request.session.get('username')
password = request.session.get('password')
print(username, password)
if username and password:
teacherID = request.session.get('id_number')
classCODE = request.session.get('classcode')
classname = []
classcode = []
select_teacher_client_teacherclass = 'select id, id_number, classname, classcode ' \
'from teacher_client_teacherclass ' \
'where id_number = ' + str(teacherID)
temp_RawQuerySetClass = teacherClass.objects.raw(select_teacher_client_teacherclass)
for cc in temp_RawQuerySetClass:
classname.append(cc.classname)
classcode.append(cc.classcode)
classnum = len(classname)
str1 = '('
for temp in classcode:
str1 = str1 + "'" + temp + "'" + ","
str1 = str1.strip(',')
str1 += ')'
select_teacher_client_classtable = 'select id, name, id_number, phone, classcode ' \
'from teacher_client_classtable ' \
'where classcode in ' + str1
temp_RawQuerySetStudent = classTable.objects.raw(select_teacher_client_classtable)
Sname = []
Sno = []
Sphone = []
for ss in temp_RawQuerySetStudent:
Sname.append(ss.name)
Sno.append(ss.id_number)
Sphone.append(ss.phone)
res = []
for i in range(len(Sname)):
res.append([Sname[i], Sno[i], Sphone[i]])
return render(request, 'teacher_client.html',
{'classname': json.dumps(classname), 'res': json.dumps(res), 'classcode': classcode,
"student": temp_RawQuerySetStudent, 'username': username,
"class": temp_RawQuerySetClass}, )
else:
return redirect("http://127.0.0.1:8000/")
def classSet(request):
if request.method == "GET":
return render(request, "createClass.html")
classname = request.POST.get('classname')
request.session['classname'] = classname
if classname != '':
# global CLASS_ID
# CLASS_ID += 1
code = get_code()
request.session['code'] = code
username = request.session.get('username')
id_number = request.session.get('id_number')
teacherClass.objects.create(name=username, id_number=id_number, classCode=code, classname=classname)
return redirect("teacher_client:teacher_client")
else:
return HttpResponse("请输入班级名")
def file_muti(request):
"""用于教师端文件上传"""
file_object = request.FILES.get('exc')
now_time = time.time()
wb = load_workbook(file_object)
sheet = wb.worksheets[0]
for row in sheet.iter_rows(min_row=2):
# for temp in range(7):
# print(row[temp].value)
qus_imfomation = row[0].value
qus_A = row[1].value
qus_B = row[2].value
qus_C = row[3].value
qus_D = row[4].value
qus_ans = row[5].value
que_classcode = row[6].value
questionBank.objects.create(qus_imfomation=qus_imfomation, qus_A=qus_A, qus_B=qus_B, qus_C=qus_C, qus_D=qus_D, qus_ans=qus_ans, que_classcode=que_classcode, que_time=now_time)
return redirect('teacher_client:teacher_client')
def radix_sort(array):
"""基数排序"""
max_num = max(array)
place = 1
while max_num >= 10 ** place:
place += 1
for i in range(place):
buckets = [[] for _ in range(10)]
for num in array:
radix = int(num / (10 ** i) % 10)
buckets[radix].append(num)
j = 0
for k in range(10):
for num in buckets[k]:
array[j] = num
j += 1
return array
def binary_search(alist, data):
"""二分查找"""
n = len(alist)
first = 0
last = n - 1
if data > alist[-1]:
return alist[-1]
while first <= last:
mid = (last + first) // 2
if alist[mid] > data:
last = mid - 1
elif alist[mid] < data:
first = mid + 1
else:
return data
if abs(alist[first] - data) > abs(alist[first-1] - data):
return alist[first-1]
return alist[first]
def test_release(request):
"""用于习题发布"""
if request.method == "GET":
global TEST_CODE
TEST_CODE += 1
# 从前端获取一个考试时间 #
# test_time = request.POST.get('test_time')
time_list = []
time_select = "select id, que_time " \
"from teacher_client_questionbank"
time_res = questionBank.objects.raw(time_select)
for temp in time_res:
if temp.que_time not in time_list:
time_list.append(temp.que_time)
time_list = [float(x) for x in time_list]
time_list = radix_sort(time_list)
print(time_list)
target_time = binary_search(time_list, time.time())
questionSelect = "select id, qus_imfomation, " \
"qus_A, qus_B, qus_C, qus_D, " \
"qus_ans, " \
"que_classcode " \
"from teacher_client_questionbank " \
"where que_time =" + str(target_time)
temp_RawQuerySetquestion = questionBank.objects.raw(questionSelect)
single_choice = []
multiple_choice = []
gap_filling = []
for temp in temp_RawQuerySetquestion:
temp_classcode = temp.que_classcode
if temp.qus_ans is None:
gap_filling.append(temp)
elif len(temp.qus_ans) == 1:
single_choice.append(temp)
else:
multiple_choice.append(temp)
# testQuestionBank.objects.create(qus_imfomation=temp.qus_imfomation, qus_A=temp.qus_A, qus_B=temp.qus_B,
# qus_C=temp.qus_C, qus_D=temp.qus_D, qus_ans=temp.qus_ans,
# test_code=TEST_CODE, test_time=test_time)
total_number = len(gap_filling) + len(multiple_choice) + len(single_choice)
total_list = [x + 1 for x in range(total_number)]
single_choice_number = len(single_choice)
multiple_choice_number = len(multiple_choice)
gap_filling_number = len(gap_filling)
return render(request, "test.html", {"total_num": total_number,
"total_list": total_list,
"single_choice": single_choice,
"multiple_choice": multiple_choice,
"gap_filling": gap_filling,
"ClassCode": temp_classcode,
"TEST_CODE": TEST_CODE,
"single_choice_number": single_choice_number,
"multiple_choice_number": multiple_choice_number,
"gap_filling_number": gap_filling_number
})
# 从前端获取一个考试时间 #
test_time = request.POST.get('test_time')
#
time_list = []
time_select = "select id, que_time " \
"from teacher_client_questionbank"
time_res = questionBank.objects.raw(time_select)
for temp in time_res:
if temp.que_time not in time_list:
time_list.append(temp.que_time)
time_list = [float(x) for x in time_list]
time_list = radix_sort(time_list)
print(time_list)
target_time = binary_search(time_list, time.time())
questionSelect = "select id, qus_imfomation, " \
"qus_A, qus_B, qus_C, qus_D, " \
"qus_ans, " \
"que_classcode " \
"from teacher_client_questionbank " \
"where que_time =" + str(target_time)
temp_RawQuerySetquestion = questionBank.objects.raw(questionSelect)
for temp in temp_RawQuerySetquestion:
temp_classcode = temp.que_classcode
testQuestionBank.objects.create(qus_imfomation=temp.qus_imfomation,qus_A=temp.qus_A, qus_B=temp.qus_B, qus_C=temp.qus_C, qus_D=temp.qus_D,qus_ans=temp.qus_ans,test_code=TEST_CODE, test_time=test_time)
return HttpResponse("发布成功")
# total_number = len(gap_filling) + len(multiple_choice) + len(single_choice)
# total_list = [x+1 for x in range(total_number)]
# single_choice_number = len(single_choice)
# multiple_choice_number = len(multiple_choice)
# gap_filling_number = len(gap_filling)
#
# return render(request, "test.html", {"total_num": total_number,
# "total_list": total_list,
# "single_choice": single_choice,
# "multiple_choice": multiple_choice,
# "gap_filling": gap_filling,
# "ClassCode": temp_classcode,
# "test_time": test_time,
# "single_choice_number": single_choice_number,
# "multiple_choice_number": multiple_choice_number,
# "gap_filling_number": gap_filling_number
# })

@ -38,7 +38,8 @@ INSTALLED_APPS = [
'django.contrib.messages',
'django.contrib.staticfiles',
'login.apps.LoginConfig',
'teacher_client.apps.TeacherClientConfig'
'teacher_client.apps.TeacherClientConfig',
'student_client.apps.StudentClientConfig'
]
MIDDLEWARE = [
@ -49,6 +50,7 @@ MIDDLEWARE = [
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
# 'teacher_client.middleware.auto.AuthMiddleware',
]
ROOT_URLCONF = 'the_online_test_system.urls'

@ -0,0 +1,73 @@
### 1.可行性分析报告:
#### 1.1引言:
随着时代的不断发展,互联网已进入千家万户,社会进入网络时代,计算机网络已经成为社会发展的强大动力。网络不仅给我们带来无穷的信息,也带来了许多便利。不仅企业、政府的正常工作离不开网络,教育事业同样需要网络。远程教育已经成为现代教育技术的发展的主要方向之一,在线习题测试作为远程教育的一个子系统也成为一个重要研究领域。
网络技术的发展使得学生习题的技术手段和载体发生了革命性的变化,网络的开放性、分布性和基于网络的巨大计算能力使学生做题和测试突破了空间和时间的限制。基于网络的习题测试系统正成为人们的研究热点之一。与传统习题测试相比,网络在线测试系统不仅能节约大量时间、人力财力。在线习题测试系统产生的背景正是当今教育信息化的趋势及我国高等教育信息化建设;目的是充分利用学校现有的计算机软硬件资源和网络资源实现无纸化习题测试以避免传统测试的不足。
#### 1.2项目背景:
项目名称:
项目的开发者:
用户:
#### 1.3参考资料:
1、https://www.djangoproject.com/
2、https://blog.csdn.net/weixin_45110404/article/details/90758243
3、《跟老齐学PythonDjango实战第2版》作者: 齐伟 电子工业出版社 出版年: 2019-1
4、https://docs.djangoproject.com/zh-hans/3.0/
5、学长项目https://github.com/EnJoy-git/OnlineExerciseTest
### 2.可行性研究的前提:
#### 2.1要求:
[1、前端设计和后台设计]()
[2、角色划分设计]()
[3、题库管理习题分类单选题、多选题、填空题]()教师可在线录入也可以excel或word文件方式上传试题提供给教师题库模板
[4、自动判题计分功能]()
[5、其他特色功能]()
#### 2.2目标:
1.设计出简洁优美的前端用户交汇界面,首页应包括用户登录、注册两大必备功能。在此基础上,可添加如验证码、记住密码等额外选项。
2.软件用户分为教师和学生,故可对不同的登入账号
### 3.对目前系统的分析:
[1、前端设计和后台设计]()
Loading…
Cancel
Save