Compare commits

...

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

@ -1 +0,0 @@
114514

@ -1,8 +1,8 @@
# Default ignored files
/shelf/
/workspace.xml
# Datasource local storage ignored files
/../../../../../../:\djangoProject\djangoProject\djangoProject\the_online_test_system\.idea/dataSources/
/dataSources.local.xml
# 基于编辑器的 HTTP 客户端请求
/httpRequests/
# Default ignored files
/shelf/
/workspace.xml
# Datasource local storage ignored files
/../../../../../../:\djangoProject\djangoProject\djangoProject\the_online_test_system\.idea/dataSources/
/dataSources.local.xml
# 基于编辑器的 HTTP 客户端请求
/httpRequests/

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.8" project-jdk-type="Python SDK" />
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.8" project-jdk-type="Python SDK" />
</project>

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/the_online_test_system.iml" filepath="$PROJECT_DIR$/.idea/the_online_test_system.iml" />
</modules>
</component>
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/the_online_test_system.iml" filepath="$PROJECT_DIR$/.idea/the_online_test_system.iml" />
</modules>
</component>
</project>

@ -1,28 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="FacetManager">
<facet type="django" name="Django">
<configuration>
<option name="rootFolder" value="$MODULE_DIR$" />
<option name="settingsModule" value="the_online_test_system/settings.py" />
<option name="manageScript" value="$MODULE_DIR$/manage.py" />
<option name="environment" value="&lt;map/&gt;" />
<option name="doNotUseTestRunner" value="false" />
<option name="trackFilePattern" value="migrations" />
</configuration>
</facet>
</component>
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
<component name="TemplatesService">
<option name="TEMPLATE_CONFIGURATION" value="Django" />
<option name="TEMPLATE_FOLDERS">
<list>
<option value="$MODULE_DIR$/../the_online_test_system\templates" />
</list>
</option>
</component>
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="FacetManager">
<facet type="django" name="Django">
<configuration>
<option name="rootFolder" value="$MODULE_DIR$" />
<option name="settingsModule" value="the_online_test_system/settings.py" />
<option name="manageScript" value="$MODULE_DIR$/manage.py" />
<option name="environment" value="&lt;map/&gt;" />
<option name="doNotUseTestRunner" value="false" />
<option name="trackFilePattern" value="migrations" />
</configuration>
</facet>
</component>
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
<component name="TemplatesService">
<option name="TEMPLATE_CONFIGURATION" value="Django" />
<option name="TEMPLATE_FOLDERS">
<list>
<option value="$MODULE_DIR$/../the_online_test_system\templates" />
</list>
</option>
</component>
</module>

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

@ -1,5 +1,5 @@
from django.apps import AppConfig
class LoginConfig(AppConfig):
name = 'login'
from django.apps import AppConfig
class LoginConfig(AppConfig):
name = 'login'

@ -1,59 +1,59 @@
import os
from PIL import Image, ImageDraw, ImageFont, ImageFilter
import random
import string
def random_str(length=4):
""" 随机字符串 默认长度 4
:param length: 默认长度 4
:return:
"""
return ''.join(random.sample(string.ascii_letters, length))
def random_color(s=1, e=255):
""" 随机 RGB 颜色
:param s: 起始值, 0-255
:param e: 结束时, 0-255
:return: (r, g, b)
"""
return random.randint(s, e), random.randint(s, e), random.randint(s, e)
def veri_code(length=4, width=160, height=40, size=28):
""" 生成验证码图片
:param length: 验证码字符串长度
:param width: 图片宽度
:param height: 图片高度
:param size: 字体大小
:return: (验证码图片, 验证码字符串)
"""
# 创建Image对象
image = Image.new('RGB', (width, height), (255, 255, 255))
# 创建Font对象
file = os.path.dirname(os.path.abspath(__file__))
font = ImageFont.truetype(f'{file}/FZSTK.ttf', size)
# 创建Draw对象
draw = ImageDraw.Draw(image)
# 随机颜色填充每个像素
for x in range(0, width, 2):
for y in range(height):
draw.point((x, y), fill=random_color(64, 255))
# 验证码
code = random_str(length)
# 随机颜色验证码写到图片上
for t in range(length):
draw.text((40 * t + 5, 5), code[t], font=font, fill=random_color(32, 127))
# 模糊滤镜
# image = image.filter(ImageFilter.BLUR)
return image, code
if __name__ == '__main__':
img, code = veri_code()
with open('test.png', 'wb') as f:
import os
from PIL import Image, ImageDraw, ImageFont, ImageFilter
import random
import string
def random_str(length=4):
""" 随机字符串 默认长度 4
:param length: 默认长度 4
:return:
"""
return ''.join(random.sample(string.ascii_letters, length))
def random_color(s=1, e=255):
""" 随机 RGB 颜色
:param s: 起始值, 0-255
:param e: 结束时, 0-255
:return: (r, g, b)
"""
return random.randint(s, e), random.randint(s, e), random.randint(s, e)
def veri_code(length=4, width=160, height=40, size=28):
""" 生成验证码图片
:param length: 验证码字符串长度
:param width: 图片宽度
:param height: 图片高度
:param size: 字体大小
:return: (验证码图片, 验证码字符串)
"""
# 创建Image对象
image = Image.new('RGB', (width, height), (255, 255, 255))
# 创建Font对象
file = os.path.dirname(os.path.abspath(__file__))
font = ImageFont.truetype(f'{file}/FZSTK.ttf', size)
# 创建Draw对象
draw = ImageDraw.Draw(image)
# 随机颜色填充每个像素
for x in range(0, width, 2):
for y in range(height):
draw.point((x, y), fill=random_color(64, 255))
# 验证码
code = random_str(length)
# 随机颜色验证码写到图片上
for t in range(length):
draw.text((40 * t + 5, 5), code[t], font=font, fill=random_color(32, 127))
# 模糊滤镜
# image = image.filter(ImageFilter.BLUR)
return image, code
if __name__ == '__main__':
img, code = veri_code()
with open('test.png', 'wb') as f:
img.save(f)

@ -1,26 +1,26 @@
# Generated by Django 3.1.4 on 2022-04-08 08:50
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='UserInfo',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('identity', models.CharField(max_length=4, verbose_name='身份')),
('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='手机')),
('username', models.CharField(max_length=32, unique=True, verbose_name='账号')),
('password', models.CharField(max_length=32, verbose_name='密码')),
],
),
]
# Generated by Django 3.1.4 on 2022-04-08 08:50
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='UserInfo',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('identity', models.CharField(max_length=4, verbose_name='身份')),
('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='手机')),
('username', models.CharField(max_length=32, unique=True, verbose_name='账号')),
('password', models.CharField(max_length=32, verbose_name='密码')),
],
),
]

@ -1,22 +1,21 @@
from django.db import models
# Create your models here.
class UserInfo(models.Model):
"""
用户列表
用于记录用户基本信息
"""
identity = models.CharField(max_length=4, verbose_name="身份", blank=False, null=False)
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)
username = models.CharField(max_length=32, verbose_name="账号", unique=True, blank=False, null=False)
password = models.CharField(max_length=32, verbose_name="密码", blank=False, null=False)
from django.db import models
class UserInfo(models.Model):
"""
用户列表
用于记录用户基本信息
"""
identity = models.CharField(max_length=4, verbose_name="身份", blank=False, null=False)
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)
username = models.CharField(max_length=32, verbose_name="账号", unique=True, blank=False, null=False)
password = models.CharField(max_length=32, verbose_name="密码", blank=False, null=False)

@ -1,252 +1,252 @@
body .bgimg img{
position:absolute;
width: auto;
height: auto;
width: 100%;
top: 5px;
height: 100%;
left:0%;
top: 0%;
padding: 0;
margin:0;
z-index: 0;
}
body {
font-family: PingFang SC,HarmonyOS_Regular,Helvetica Neue,Microsoft YaHei,sans-serif!important;
font-weight: 400;
overflow-x: auto;
background-color: var(--graph_bg_regular);
}
body {
/* font-size: 14px; */
font-size: 18px;
line-height: 1.6;
/* -webkit-text-size-adjust: 100%; */
-webkit-tap-highlight-color: transparent;
color: #18191c;
background-color: #f6f7f8;
/* min-width: 1100px; */
}
.header-bgimg {
position: absolute;
width: auto;
width: 100%;
top: 0;
left:0;
z-index: 100;
/* width: 1519.2px; */
width: 1535px;
/* height: 155px; */
height: 120px;
}
header .header_bar {
position: absolute;
top: 0;
left: 0px;
z-index: 1002;
display: flex;
align-items: center;
justify-content: space-between;
/* padding: 0 24px; */
max-width: 2560px;
/* width: 100%; */
width: 1535px;
height: 64px;
}
body ul {
/* 取消小原点 */
list-style-type: none;
}
body ul li {
margin: 15px;
}
header .header_bar .left_entry {
display: flex;
align-items: center;
flex-shrink: 0;
margin-right: 30px;
}
body a {
text-decoration: none;
background-color: transparent;
color: inherit;
}
header span {
color: white;
/* font:14px "PingFang SC",HarmonyOs_re */
}
.header_center {
position: relative;
top: 2px;
background-color: #fff;
width: 400px;
height: 32px;
border-radius: 13px;
}
.header_bar .header_center .reseach {
position: relative;
/* display: inline; */
top: -7px;
/* left: 2px; */
width: 360px;
height: 25px;
line-height: 30px;
border-radius: 13px;
border-width: 0px;
outline:none;
}
/* header .header_bar .right_entry {
position: relative;
left: 100px;
} */
header right_last {
position:absolute;
}
header .header_bar .right_entry {
display: flex;
align-items: center;
flex-shrink: 0;
margin-right: 30px;
}
.right_last button {
/* box-shadow: 5px 5px rgb(109, 247, 71); */
/* blur:5px; */
background:transparent;/*按钮背景透明 */
/* background-color: pink; */
border-radius: 14px;
border-color: greenyellow;
border: width 1px; /*边框透明*/
outline:none; /*点击后没边框*/
font-size: 24px;
border-radius: 22px;
}
.mybody {
position: relative;
width: auto;
width: 100%;
left: -8px;
padding: 0px;
margin: 0px;
top: 60px;
/* background: #000; */
}
.body_left{
display: inline-block;
position: relative;
padding: 0px;
margin: 0px;
}
.body_center {
display: inline-block;
position: relative;
top: -220px;
/* left: 900px; */
width: 200px;
/* height: 600px; */
/* background-color: pink; */
}
.body_center ul {
/* position: absolute; */
/* top: -200px;
left: 50px; */
position: relative;
left: 20px;
display:inline-block;
}
.body_center ul li{
margin: 10px;
font-family: Cambria, Cochin, Georgia, Times, 'Times New Roman', serif;
font-weight: 700;
/* font-style: italic; */
font-size: 50px;
position: center;
}
.body_right {
position: absolute;
display: block;
/* width: 100px;
height: 100px; */
top: 70px;
right: 0;
/* background-color: #fff; */
/* background: rgba(249, 246, 246, 0.3); */
font-size: 20px;
/* margin: 20px */
}
.body_right table tr{
margin: 20px;
}
.body_right input {
width: 250px;
height: 23px;
border-color: aqua;
border-radius: 18px;
margin: 20px;
}
.body_right table .sign_ {
position:relative;
width: 220px;
height: 40px;
left: 50px;
/*color: white;*/
/*background:rgba(0,0,0, 0.3);*/
font-size: 24px;
}
.body_right table span {
/* border: red; */
position: relative;
/*background-color:aqua;*/
/*left: 150px;*/
width: 100px;
height: 100px;
border-radius: 18px;
margin: 30px;
}
/*.body_right table {*/
/* margin: 0px;*/
/* width: 50px;*/
/*}*/
.body_right table .add input{
position: relative;
margin: 10px;
width: 15px;
top: 4px;
/*left: 20px;*/
font-size: 16px;
/*color: aliceblue;*/
}
.body_right table .add span {
border-radius: 16px;
border: 4px;
border-color: aqua;
width: 100px;
height: 100px;
background-color:#aedab5;
}
.body_right table .add a {
width: 110px;
border-radius: 16px;
background-color:#aedab5;
}
body .bgimg img{
position:absolute;
width: auto;
height: auto;
width: 100%;
top: 5px;
height: 100%;
left:0%;
top: 0%;
padding: 0;
margin:0;
z-index: 0;
}
body {
font-family: PingFang SC,HarmonyOS_Regular,Helvetica Neue,Microsoft YaHei,sans-serif!important;
font-weight: 400;
overflow-x: auto;
background-color: var(--graph_bg_regular);
}
body {
/* font-size: 14px; */
font-size: 18px;
line-height: 1.6;
/* -webkit-text-size-adjust: 100%; */
-webkit-tap-highlight-color: transparent;
color: #18191c;
background-color: #f6f7f8;
/* min-width: 1100px; */
}
.header-bgimg {
position: absolute;
width: auto;
width: 100%;
top: 0;
left:0;
z-index: 100;
/* width: 1519.2px; */
width: 1535px;
/* height: 155px; */
height: 120px;
}
header .header_bar {
position: absolute;
top: 0;
left: 0px;
z-index: 1002;
display: flex;
align-items: center;
justify-content: space-between;
/* padding: 0 24px; */
max-width: 2560px;
/* width: 100%; */
width: 1535px;
height: 64px;
}
body ul {
/* 取消小原点 */
list-style-type: none;
}
body ul li {
margin: 15px;
}
header .header_bar .left_entry {
display: flex;
align-items: center;
flex-shrink: 0;
margin-right: 30px;
}
body a {
text-decoration: none;
background-color: transparent;
color: inherit;
}
header span {
color: white;
/* font:14px "PingFang SC",HarmonyOs_re */
}
.header_center {
position: relative;
top: 2px;
background-color: #fff;
width: 400px;
height: 32px;
border-radius: 13px;
}
.header_bar .header_center .reseach {
position: relative;
/* display: inline; */
top: -7px;
/* left: 2px; */
width: 360px;
height: 25px;
line-height: 30px;
border-radius: 13px;
border-width: 0px;
outline:none;
}
/* header .header_bar .right_entry {
position: relative;
left: 100px;
} */
header right_last {
position:absolute;
}
header .header_bar .right_entry {
display: flex;
align-items: center;
flex-shrink: 0;
margin-right: 30px;
}
.right_last button {
/* box-shadow: 5px 5px rgb(109, 247, 71); */
/* blur:5px; */
background:transparent;/*按钮背景透明 */
/* background-color: pink; */
border-radius: 14px;
border-color: greenyellow;
border: width 1px; /*边框透明*/
outline:none; /*点击后没边框*/
font-size: 24px;
border-radius: 22px;
}
.mybody {
position: relative;
width: auto;
width: 100%;
left: -8px;
padding: 0px;
margin: 0px;
top: 60px;
/* background: #000; */
}
.body_left{
display: inline-block;
position: relative;
padding: 0px;
margin: 0px;
}
.body_center {
display: inline-block;
position: relative;
top: -220px;
/* left: 900px; */
width: 200px;
/* height: 600px; */
/* background-color: pink; */
}
.body_center ul {
/* position: absolute; */
/* top: -200px;
left: 50px; */
position: relative;
left: 20px;
display:inline-block;
}
.body_center ul li{
margin: 10px;
font-family: Cambria, Cochin, Georgia, Times, 'Times New Roman', serif;
font-weight: 700;
/* font-style: italic; */
font-size: 50px;
position: center;
}
.body_right {
position: absolute;
display: block;
/* width: 100px;
height: 100px; */
top: 70px;
right: 0;
/* background-color: #fff; */
/* background: rgba(249, 246, 246, 0.3); */
font-size: 20px;
/* margin: 20px */
}
.body_right table tr{
margin: 20px;
}
.body_right input {
width: 250px;
height: 23px;
border-color: aqua;
border-radius: 18px;
margin: 20px;
}
.body_right table .sign_ {
position:relative;
width: 220px;
height: 40px;
left: 50px;
/*color: white;*/
/*background:rgba(0,0,0, 0.3);*/
font-size: 24px;
}
.body_right table span {
/* border: red; */
position: relative;
/*background-color:aqua;*/
/*left: 150px;*/
width: 100px;
height: 100px;
border-radius: 18px;
margin: 30px;
}
/*.body_right table {*/
/* margin: 0px;*/
/* width: 50px;*/
/*}*/
.body_right table .add input{
position: relative;
margin: 10px;
width: 15px;
top: 4px;
/*left: 20px;*/
font-size: 16px;
/*color: aliceblue;*/
}
.body_right table .add span {
border-radius: 16px;
border: 4px;
border-color: aqua;
width: 100px;
height: 100px;
background-color:#aedab5;
}
.body_right table .add a {
width: 110px;
border-radius: 16px;
background-color:#aedab5;
}

@ -1,102 +1,102 @@
.mybody{padding: 0;margin: 0;}
.body_left{
position: relative;
/* top: 40px; */
/* width: 100vw;
height: 100vh; */
width: 750px;
height: 600px;
/* background: #82ccdd; */
display:inline-block;
/* justify-content: center;
align-items: center; */
}
/* 显示框 */
div.scroll-photo{
position: absolute;
/* width: 400px;
height: 300px; */
/* width: 800px; */
width: 765px;
height: 450px;
left: 0px;
overflow: hidden;
}
/* 内置图片的排列总宽度 */
div.photos{
position: absolute;
/* width: 1200px;
height: 300px; */
width: 22500px;
height: 450px;
z-index: 0;
}
div.photos img{
position: relative;
/* width: 400px;
height: 300px; */
width: 800px;
height: 450px;
float: left;
}
div.index ul{
position: absolute;
display: grid;
bottom: -10px;
left: 40%;
transform: translateX(-50%);
list-style: none;
width: 150px;
grid-template: 1fr/repeat(3,1fr);
justify-items: center;
}
div.index ul::after{
content: '';
position: absolute;
top: 15px;
left: 55px;
width: 25px;
height: 25px;
border-radius: 50%;
z-index: -1;
/* background: #d63031; */
background: rgb(0, 255, 255);
}
div.index ul li{
position: relative;
width: 25px;
height: 25px;
border-radius: 50%;
color: #FFF;
background: rgba(0,0,0,.5);
display: grid;
justify-content: center;
align-items: center;
}
div.photos{
animation:scroll 12s steps(3,end);
animation-iteration-count: infinite;
}
div.index ul::after{
animation:index-scroll 12s steps(3,end);
animation-iteration-count: infinite;
}
/* 图片移动像素 */
@keyframes scroll{
to{
transform: translateX(-2400px);
}
}
/*下标移动像素 */
@keyframes index-scroll{
to{
transform: translateX(165px);
}
.mybody{padding: 0;margin: 0;}
.body_left{
position: relative;
/* top: 40px; */
/* width: 100vw;
height: 100vh; */
width: 750px;
height: 600px;
/* background: #82ccdd; */
display:inline-block;
/* justify-content: center;
align-items: center; */
}
/* 显示框 */
div.scroll-photo{
position: absolute;
/* width: 400px;
height: 300px; */
/* width: 800px; */
width: 765px;
height: 450px;
left: 0px;
overflow: hidden;
}
/* 内置图片的排列总宽度 */
div.photos{
position: absolute;
/* width: 1200px;
height: 300px; */
width: 22500px;
height: 450px;
z-index: 0;
}
div.photos img{
position: relative;
/* width: 400px;
height: 300px; */
width: 800px;
height: 450px;
float: left;
}
div.index ul{
position: absolute;
display: grid;
bottom: -10px;
left: 40%;
transform: translateX(-50%);
list-style: none;
width: 150px;
grid-template: 1fr/repeat(3,1fr);
justify-items: center;
}
div.index ul::after{
content: '';
position: absolute;
top: 15px;
left: 55px;
width: 25px;
height: 25px;
border-radius: 50%;
z-index: -1;
/* background: #d63031; */
background: rgb(0, 255, 255);
}
div.index ul li{
position: relative;
width: 25px;
height: 25px;
border-radius: 50%;
color: #FFF;
background: rgba(0,0,0,.5);
display: grid;
justify-content: center;
align-items: center;
}
div.photos{
animation:scroll 12s steps(3,end);
animation-iteration-count: infinite;
}
div.index ul::after{
animation:index-scroll 12s steps(3,end);
animation-iteration-count: infinite;
}
/* 图片移动像素 */
@keyframes scroll{
to{
transform: translateX(-2400px);
}
}
/*下标移动像素 */
@keyframes index-scroll{
to{
transform: translateX(165px);
}
}

@ -1,60 +1,60 @@
body {
background-image: url(img/zc3.png);
/* background-repeat: repeat-x; */
position:relative;
background-position-y: -100px;
/* background-position-x: 50px; */
/* top: -200px; */
}
div {
position:relative;
top: 80px;
left: 35%;
width: 500px;
border: 0ch;
border: 4px solid aqua;
background-color: rgba(255,255,255,0.6);
}
div h4 {
text-align: center;
font-size: 36px;
font-style: inherit;
font-family:Georgia, 'Times New Roman', Times, serif
}
td {
position:relative;
left: 15%;
}
input {
width: 300px;
height: 30px;
border-radius: 18px;
border-color: aqua;
position: relative;
/* left: 25%; */
margin: 20px;
}
.tk input{
position:relative;
width: 15px;
vertical-align: middle;
/* height: 100%; */
/* margin:0px; */
/* line-height: 72px; */
/* right: 50%; */
}
select {
width: 300px;
height: 30px;
border-radius: 18px;
border-color: aqua;
position: relative;
/* left: 25%; */
margin: 20px;
}
a {
position: relative;
left: 20%;
text-decoration: none;
body {
background-image: url(img/zc3.png);
/* background-repeat: repeat-x; */
position:relative;
background-position-y: -100px;
/* background-position-x: 50px; */
/* top: -200px; */
}
div {
position:relative;
top: 80px;
left: 35%;
width: 500px;
border: 0ch;
border: 4px solid aqua;
background-color: rgba(255,255,255,0.6);
}
div h4 {
text-align: center;
font-size: 36px;
font-style: inherit;
font-family:Georgia, 'Times New Roman', Times, serif
}
td {
position:relative;
left: 15%;
}
input {
width: 300px;
height: 30px;
border-radius: 18px;
border-color: aqua;
position: relative;
/* left: 25%; */
margin: 20px;
}
.tk input{
position:relative;
width: 15px;
vertical-align: middle;
/* height: 100%; */
/* margin:0px; */
/* line-height: 72px; */
/* right: 50%; */
}
select {
width: 300px;
height: 30px;
border-radius: 18px;
border-color: aqua;
position: relative;
/* left: 25%; */
margin: 20px;
}
a {
position: relative;
left: 20%;
text-decoration: none;
}

@ -1,148 +1,148 @@
{% 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.0">
<title>主页</title>
<link rel="stylesheet" href="{% static 'css/myhome.css' %}">
<link rel="stylesheet" href="{% static 'css/phontos_show.css' %}">
<script>
function changeCheckCode(ths){
<!--改变URL刷新图片。-->
ths.src = "{% url 'login:captcha_img' %}?r=" + Math.random();
}
</script>
</head>
<body>
<div class="bgimg">
<img src="{% static 'img/主页1.png' %}" alt="">
</div>
<header>
<!-- <img src="img/bilis.png" alt="" class="header-bgimg"> -->
<div class="header_bar">
<ul class="left_entry">
<li>
<a href="#">
<img src="{% static 'img/首页1.jpg' %}" alt="首页" width="18px">
<span>首页</span>
</a>
</li>
<li>
<a href="">
<span>
我的
</span>
</a>
</li>
</ul>
<div class="header_center">
<form action="">
<div>
<input type="text" class="reseach">
<a href="#">
<img src="{% static 'img/rch.png' %}" alt="搜索" style="position: relative; width: 30px; line-height: 30px; border-radius: 13px; top:3px">
</a>
</div>
</form>
</div>
<ul class="right_entry">
<!-- <li>注册</li> -->
<li class="right_last">
<a href="https://www.bilibili.com/?spm_id_from=333.1007.0.0" target="_blank">
<button>
<span>后台管理</span>
</button>
</a>
</li>
</ul>
</div>
</header>
<div class="mybody">
<div class="body_left">
<div class="scroll-photo">
<!--图片组-->
<div class="photos">
<img src="{% static 'img/1.jpg' %}">
<img src="{% static 'img/2.jpg' %}">
<img src="{% static 'img/3.jpg' %}">
</div>
<!--页码-->
<div class="index">
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
</div>
</div>
</div>
<div class="body_center">
<ul>
<li><span></span></li>
<li><span></span></li>
<li><span></span></li>
<li><span></span></li>
</ul>
</div>
<div class="body_right">
<form action="{%url 'login:dologin' %}" class="sign" method="post">
{% csrf_token %}
<table>
<tr>
<!-- <td>账号:</td> -->
<td>
账号:&nbsp;<input type="text" name="username" placeholder="账号" value="{{ username }}">
</td>
</tr>
<tr>
<!-- <td>密码:</td> -->
<td>
密码:&nbsp;<input type="password" name="password" placeholder="密码" value="{{ pwd }}">
</td>
</tr>
<tr class="Error">
<td>
{% if error_msg %}<p><strong>{{ error_msg }}</strong></p>{% endif %}
</td>
</tr>
<tr>
<td>
验证码:<input type="text" name="check_code" placeholder="请输入验证码">
<img src="{% url 'login:captcha_img' %}" onclick="changeCheckCode(this);">
</td>
</tr>
<p>
<input type="checkbox" name="rember" value="rember" {% if username %}checked{%endif%}/>记住密码
</p>
<tr>
<td>
<input class="sign_" type="submit" value="登录">
</td>
</tr>
<tr>
<td class>
<a href="http://127.0.0.1:8000/register/" target="_blank">
<span>去注册</span>
</a>
</td>
</tr>
</table>
</form>
</div>
</div>
</body>
{% 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.0">
<title>主页</title>
<link rel="stylesheet" href="{% static 'css/myhome.css' %}">
<link rel="stylesheet" href="{% static 'css/phontos_show.css' %}">
<script>
function changeCheckCode(ths){
<!--改变URL刷新图片。-->
ths.src = "{% url 'login:captcha_img' %}?r=" + Math.random();
}
</script>
</head>
<body>
<div class="bgimg">
<img src="{% static 'img/主页1.png' %}" alt="">
</div>
<header>
<!-- <img src="img/bilis.png" alt="" class="header-bgimg"> -->
<div class="header_bar">
<ul class="left_entry">
<li>
<a href="#">
<img src="{% static 'img/首页1.jpg' %}" alt="首页" width="18px">
<span>首页</span>
</a>
</li>
<li>
<a href="">
<span>
我的
</span>
</a>
</li>
</ul>
<div class="header_center">
<form action="">
<div>
<input type="text" class="reseach">
<a href="#">
<img src="{% static 'img/rch.png' %}" alt="搜索" style="position: relative; width: 30px; line-height: 30px; border-radius: 13px; top:3px">
</a>
</div>
</form>
</div>
<ul class="right_entry">
<!-- <li>注册</li> -->
<li class="right_last">
<a href="https://www.bilibili.com/?spm_id_from=333.1007.0.0" target="_blank">
<button>
<span>后台管理</span>
</button>
</a>
</li>
</ul>
</div>
</header>
<div class="mybody">
<div class="body_left">
<div class="scroll-photo">
<!--图片组-->
<div class="photos">
<img src="{% static 'img/1.jpg' %}">
<img src="{% static 'img/2.jpg' %}">
<img src="{% static 'img/3.jpg' %}">
</div>
<!--页码-->
<div class="index">
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
</div>
</div>
</div>
<div class="body_center">
<ul>
<li><span></span></li>
<li><span></span></li>
<li><span></span></li>
<li><span></span></li>
</ul>
</div>
<div class="body_right">
<form action="{%url 'login:dologin' %}" class="sign" method="post">
{% csrf_token %}
<table>
<tr>
<!-- <td>账号:</td> -->
<td>
账号:&nbsp;<input type="text" name="username" placeholder="账号" value="{{ username }}">
</td>
</tr>
<tr>
<!-- <td>密码:</td> -->
<td>
密码:&nbsp;<input type="password" name="password" placeholder="密码" value="{{ pwd }}">
</td>
</tr>
<tr class="Error">
<td>
{% if error_msg %}<p><strong>{{ error_msg }}</strong></p>{% endif %}
</td>
</tr>
<tr>
<td>
验证码:<input type="text" name="check_code" placeholder="请输入验证码">
<img src="{% url 'login:captcha_img' %}" onclick="changeCheckCode(this);">
</td>
</tr>
<p>
<input type="checkbox" name="rember" value="rember" {% if username %}checked{%endif%}/>记住密码
</p>
<tr>
<td>
<input class="sign_" type="submit" value="登录">
</td>
</tr>
<tr>
<td class>
<a href="http://127.0.0.1:8000/register/" target="_blank">
<span>去注册</span>
</a>
</td>
</tr>
</table>
</form>
</div>
</div>
</body>
</html>

@ -1,152 +1,152 @@
{% 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.0">
<title>主页</title>
<link rel="stylesheet" href="{% static 'css/myhome.css' %}">
<link rel="stylesheet" href="{% static 'css/phontos_show.css' %}">
<script>
function changeCheckCode(ths){
<!--改变URL刷新图片。-->
ths.src = "{% url 'login:captcha_img' %}?r=" + Math.random();
}
</script>
</head>
<body>
<div class="bgimg">
<img src="{% static 'img/主页1.png' %}" alt="">
</div>
<header>
<!-- <img src="img/bilis.png" alt="" class="header-bgimg"> -->
<div class="header_bar">
<ul class="left_entry">
<li>
<a href="#">
<img src="{% static 'img/首页1.jpg' %}" alt="首页" width="18px">
<span>首页</span>
</a>
</li>
<li>
<a href="">
<span>
我的
</span>
</a>
</li>
</ul>
<div class="header_center">
<form action="">
<div>
<input type="text" class="reseach">
<a href="#">
<img src="{% static 'img/rch.png' %}" alt="搜索" style="position: relative; width: 30px; line-height: 30px; border-radius: 13px; top:3px">
</a>
</div>
</form>
</div>
<ul class="right_entry">
<!-- <li>注册</li> -->
<li class="right_last">
<a href="http://127.0.0.1:8000/admin/" target="_blank">
<button>
<span>后台管理</span>
</button>
</a>
</li>
</ul>
</div>
</header>
<div class="mybody">
<div class="body_left">
<div class="scroll-photo">
<!--图片组-->
<div class="photos">
<img src="{% static 'img/1.jpg' %}">
<img src="{% static 'img/2.jpg' %}">
<img src="{% static 'img/3.jpg' %}">
</div>
<!--页码-->
<div class="index">
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
</div>
</div>
</div>
<div class="body_center">
<ul>
<li><span></span></li>
<li><span></span></li>
<li><span></span></li>
<li><span></span></li>
</ul>
</div>
<div class="body_right">
<form action="{%url 'login:dologin' %}" class="sign" method="post">
{% csrf_token %}
<table>
<tr>
<!-- <td>账号:</td> -->
<td>
账号:&nbsp;&nbsp;<input type="text" name="username" placeholder="账号" value="{{ username }}">
</td>
</tr>
<tr>
<!-- <td>密码:</td> -->
<td>
密码:&nbsp;&nbsp;<input type="password" name="password" {% if error_msg1 %} placeholder="{{ error_msg1 }}" {% endif %} placeholder="密码" placehol value="{{ pwd }}">
</td>
{# <span style="color: red;font-size: 10px">{% if error_msg %}{{ error_msg }}{% endif %}</span>#}
</tr>
{# <tr class="Error">#}
{# <td>#}
{# #}
{# </td>#}
{# </tr>#}
<tr>
<td>
验证码:<input type="text" name="check_code" {% if error_msg %} placeholder="{{ error_msg }}" {% endif %} placeholder="请输入验证码" style="width: 150px;margin: 0px;">
<img src="{% url 'login:captcha_img' %}" onclick="changeCheckCode(this);" style="height:30px; position:relative ;top:5px">
</td>
</tr>
<tr class="add">
<td>
{# <lable><input class="rember" type="radio" name="rember" {% if username %}checked{%endif%}/> 记住密码<lable>#}
<span>
<input type="checkbox" name="rember" value="rember" {% if username %}checked{%endif%}/>记住密码
</span>
<a href="http://127.0.0.1:8000/register/" target="_blank">
<span class="zc">去注册</span>
</a>
</td>
</tr>
<tr>
<td>
<input class="sign_" type="submit" value="登录">
</td>
</tr>
</table>
</form>
</div>
</div>
</body>
{% 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.0">
<title>主页</title>
<link rel="stylesheet" href="{% static 'css/myhome.css' %}">
<link rel="stylesheet" href="{% static 'css/phontos_show.css' %}">
<script>
function changeCheckCode(ths){
<!--改变URL刷新图片。-->
ths.src = "{% url 'login:captcha_img' %}?r=" + Math.random();
}
</script>
</head>
<body>
<div class="bgimg">
<img src="{% static 'img/主页1.png' %}" alt="">
</div>
<header>
<!-- <img src="img/bilis.png" alt="" class="header-bgimg"> -->
<div class="header_bar">
<ul class="left_entry">
<li>
<a href="#">
<img src="{% static 'img/首页1.jpg' %}" alt="首页" width="18px">
<span>首页</span>
</a>
</li>
<li>
<a href="">
<span>
我的
</span>
</a>
</li>
</ul>
<div class="header_center">
<form action="">
<div>
<input type="text" class="reseach">
<a href="#">
<img src="{% static 'img/rch.png' %}" alt="搜索" style="position: relative; width: 30px; line-height: 30px; border-radius: 13px; top:3px">
</a>
</div>
</form>
</div>
<ul class="right_entry">
<!-- <li>注册</li> -->
<li class="right_last">
<a href="http://127.0.0.1:8000/admin/" target="_blank">
<button>
<span>后台管理</span>
</button>
</a>
</li>
</ul>
</div>
</header>
<div class="mybody">
<div class="body_left">
<div class="scroll-photo">
<!--图片组-->
<div class="photos">
<img src="{% static 'img/1.jpg' %}">
<img src="{% static 'img/2.jpg' %}">
<img src="{% static 'img/3.jpg' %}">
</div>
<!--页码-->
<div class="index">
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
</div>
</div>
</div>
<div class="body_center">
<ul>
<li><span></span></li>
<li><span></span></li>
<li><span></span></li>
<li><span></span></li>
</ul>
</div>
<div class="body_right">
<form action="{%url 'login:dologin' %}" class="sign" method="post">
{% csrf_token %}
<table>
<tr>
<!-- <td>账号:</td> -->
<td>
账号:&nbsp;&nbsp;<input type="text" name="username" placeholder="账号" value="{{ username }}">
</td>
</tr>
<tr>
<!-- <td>密码:</td> -->
<td>
密码:&nbsp;&nbsp;<input type="password" name="password" {% if error_msg1 %} placeholder="{{ error_msg1 }}" {% endif %} placeholder="密码" placehol value="{{ pwd }}">
</td>
{# <span style="color: red;font-size: 10px">{% if error_msg %}{{ error_msg }}{% endif %}</span>#}
</tr>
{# <tr class="Error">#}
{# <td>#}
{# #}
{# </td>#}
{# </tr>#}
<tr>
<td>
验证码:<input type="text" name="check_code" {% if error_msg %} placeholder="{{ error_msg }}" {% endif %} placeholder="请输入验证码" style="width: 150px;margin: 0px;">
<img src="{% url 'login:captcha_img' %}" onclick="changeCheckCode(this);" style="height:30px; position:relative ;top:5px">
</td>
</tr>
<tr class="add">
<td>
{# <lable><input class="rember" type="radio" name="rember" {% if username %}checked{%endif%}/> 记住密码<lable>#}
<span>
<input type="checkbox" name="rember" value="rember" {% if username %}checked{%endif%}/>记住密码
</span>
<a href="http://127.0.0.1:8000/register/" target="_blank">
<span class="zc">去注册</span>
</a>
</td>
</tr>
<tr>
<td>
<input class="sign_" type="submit" value="登录">
</td>
</tr>
</table>
</form>
</div>
</div>
</body>
</html>

@ -1,92 +1,92 @@
<!DOCTYPE html>
<html lang="zh-CN">
{% load static %}
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>注册页面</title>
<link rel="stylesheet" href="{% static 'css/zhuce.css' %}">
</head>
<body>
<form method="post">
{%csrf_token%}
<div>
<h4>启航题库</h4>
<table width="500">
<!-- 第一行 -->
<!-- <tr>
<td>
我是:
</td>
<td>
<label><input type="radio" name="id"><img src="../images/men.jpg" width="25">老师</label>
<label><input type="radio" name="id"> <img src="../images/women.jpg" width="25" >学生</label>
</td>
</tr> -->
<!-- 第二行 -->
<tr>
<td>
<select name="identity" required="required">
<option>我的身份</option>
<option name=identity" value="老师">老师</option>
<option name="identity" value="学生">学生</option>
</select>
</td>
</tr>
<!-- 第三行 -->
<tr>
<td>
<input type="text" name="name" required="required" placeholder="我的姓名">
</td>
</tr>
<!-- 第四行 -->
<tr>
<td>
<input type="text" name="id_number" required="required" placeholder="学号or工号">
</td>
</tr>
<!-- 第六行 -->
<tr>
<td>
<input type="text" name="phone" required="required" placeholder="手机号码">
</td>
<tr>
<td>
<input type="text" name="username" required="required" placeholder="用户名">
</td>
</tr>
<tr>
<td>
<input type="password" name="password" required="required" placeholder="密码">
</td>
</tr>
</tr>
<!-- 第八行 -->
<br>
{% if error_msg %}<p><strong>{{ error_msg }}</strong></p>{% endif %}
<br>
<tr>
<td class>
<input type="submit" value="注册">
</td>
</tr>
<!-- 第九行 -->
<tr>
<td class="tk">
<input type="radio"> 我同意注册条款和会员加入标准
</td>
</tr>
<!-- 第十行 -->
<tr>
<td >
<a href="#"> 我是会员,立即登录</a>
</td>
</tr>
</table>
</div>
</form>
</body>
<!DOCTYPE html>
<html lang="zh-CN">
{% load static %}
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>注册页面</title>
<link rel="stylesheet" href="{% static 'css/zhuce.css' %}">
</head>
<body>
<form method="post">
{%csrf_token%}
<div>
<h4>启航题库</h4>
<table width="500">
<!-- 第一行 -->
<!-- <tr>
<td>
我是:
</td>
<td>
<label><input type="radio" name="id"><img src="../images/men.jpg" width="25">老师</label>
<label><input type="radio" name="id"> <img src="../images/women.jpg" width="25" >学生</label>
</td>
</tr> -->
<!-- 第二行 -->
<tr>
<td>
<select name="identity" required="required">
<option>我的身份</option>
<option name=identity" value="老师">老师</option>
<option name="identity" value="学生">学生</option>
</select>
</td>
</tr>
<!-- 第三行 -->
<tr>
<td>
<input type="text" name="name" required="required" placeholder="我的姓名">
</td>
</tr>
<!-- 第四行 -->
<tr>
<td>
<input type="text" name="id_number" required="required" placeholder="学号or工号">
</td>
</tr>
<!-- 第六行 -->
<tr>
<td>
<input type="text" name="phone" required="required" placeholder="手机号码">
</td>
<tr>
<td>
<input type="text" name="username" required="required" placeholder="用户名">
</td>
</tr>
<tr>
<td>
<input type="password" name="password" required="required" placeholder="密码">
</td>
</tr>
</tr>
<!-- 第八行 -->
<br>
{% if error_msg %}<p><strong>{{ error_msg }}</strong></p>{% endif %}
<br>
<tr>
<td class>
<input type="submit" value="注册">
</td>
</tr>
<!-- 第九行 -->
<tr>
<td class="tk">
<input type="radio"> 我同意注册条款和会员加入标准
</td>
</tr>
<!-- 第十行 -->
<tr>
<td >
<a href="#"> 我是会员,立即登录</a>
</td>
</tr>
</table>
</div>
</form>
</body>
</html>

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

@ -1,21 +1,21 @@
from django.contrib import admin
from django.urls import path
from . import views
app_name = 'login'
urlpatterns = [
path('admin/', admin.site.urls),
path('register/', views.register),
path('login/', views.login, name='login'),
path('dologin/', views.dologin, name='dologin'),
path('logout/', views.logout, name='logout'),
path('captcha_img/', views.captcha_img, name='captcha_img'),
]
from django.contrib import admin
from django.urls import path
from . import views
app_name = 'login'
urlpatterns = [
path('admin/', admin.site.urls),
path('register/', views.register),
path('login/', views.login, name='login'),
path('dologin/', views.dologin, name='dologin'),
path('logout/', views.logout, name='logout'),
path('captcha_img/', views.captcha_img, name='captcha_img'),
]

@ -1,140 +1,145 @@
from django.shortcuts import render, HttpResponse, redirect
from pymysql import IntegrityError
from io import BytesIO
from login.models import UserInfo
from django.core.paginator import Paginator, Page
from django.conf import settings
from login.common import captcha
def home(request):
return render(request, 'home.html')
def register(request):
"""
注册模块
:param request:
:return:
"""
if request.method == 'GET':
return render(request, 'zhuce.html')
# 获取用户提交的数据
try:
identity = request.POST.get("identity")
name = request.POST.get("name")
id_number = request.POST.get("id_number")
phone = request.POST.get("phone")
username = request.POST.get("username")
password = request.POST.get("password")
# 添加到数据库
UserInfo.objects.create(identity=identity, name=name, id_number=id_number, phone=phone, username=username, password=password)
# 一个跳转
#
#
# 之后跳转至登录界面
#
return redirect('login:login')
except IntegrityError:
error_msg = '该手机号或用户名已被注册!'
return render(request, 'zhuce.html', {'error_msg': error_msg} )
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})
def login(request):
# 从cookie中获取用户名和密码
username = request.COOKIES.get('username')
password = request.get_signed_cookie('pwd', None, salt='pwdsalt')
if username and password:
return render(request, 'login.html', {'username': username, 'pwd': password})
else:
return render(request, 'login.html')
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():
# 从登录表单中获取用户名和密码及是否勾选了记住密码
username = request.POST.get('username')
password = request.POST.get('password')
rember = request.POST.get('rember')
response = HttpResponse()
temp_RawQuerySet = UserInfo.objects.raw('select * from login_userinfo')
for temp in temp_RawQuerySet:
if temp.username == username and temp.password == password:
if rember == 'rember':
# 勾选了记住用户名和密码
# 将用户名和密码保存到cookie中
response.set_cookie('username', username, max_age=3 * 24 * 3600)
response.set_signed_cookie('pwd', password, salt='pwdsalt', max_age=3 * 24 * 3600)
else:
# 删除cookie中的之前保存用户名和密码
response.delete_cookie('username')
response.delete_cookie('pwd')
if temp.identity == '老师':
return render(request, 'teacher_client.html', {'username': temp.username})
else:
return redirect('http://www.baidu.com')
# 用户密码不匹配
response.delete_cookie('username')
response.delete_cookie('pwd')
error_msg = '用户名或密码错误'
return render(request, 'login.html', {'error_msg1': error_msg})
else:
error_msg = '验证码错误'
return render(request, 'login.html', {'error_msg': error_msg})
def logout(request):
response = HttpResponse()
response.delete_cookie('username')
response.delete_cookie('pwd')
return response and redirect('login:login')
def captcha_img(request):
stream = BytesIO()
img, code = captcha.veri_code()
img.save(stream, 'PNG')
request.session['check_code'] = code
from django.shortcuts import render, HttpResponse, redirect
from pymysql import IntegrityError
from io import BytesIO
from login.models import UserInfo
from django.core.paginator import Paginator, Page
from django.conf import settings
from login.common import captcha
def home(request):
return render(request, 'home.html')
def register(request):
"""
注册模块
:param request:
:return:
"""
if request.method == 'GET':
return render(request, 'zhuce.html')
# 获取用户提交的数据
try:
identity = request.POST.get("identity")
name = request.POST.get("name")
id_number = request.POST.get("id_number")
phone = request.POST.get("phone")
username = request.POST.get("username")
password = request.POST.get("password")
# 添加到数据库
UserInfo.objects.create(identity=identity, name=name, id_number=id_number, phone=phone, username=username, password=password)
# 一个跳转
#
#
# 之后跳转至登录界面
#
return redirect('login:login')
except IntegrityError:
error_msg = '该手机号或用户名已被注册!'
return render(request, 'zhuce.html', {'error_msg': error_msg} )
def server_error(request):
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):
# 从cookie中获取用户名和密码
username = request.COOKIES.get('username')
password = request.get_signed_cookie('pwd', None, salt='pwdsalt')
if username and password:
return render(request, 'login.html', {'username': username, 'pwd': password})
else:
return render(request, 'login.html')
def dologin(request):
# 获取表单中提交的验证码
check_code = request.POST.get('check_code')
# 获取session会话中保存的code
session_checkcode = request.session.get('check_code')
if check_code and check_code.lower() == session_checkcode.lower():
# 从登录表单中获取用户名和密码及是否勾选了记住密码
username = request.POST.get('username')
password = request.POST.get('password')
rember = request.POST.get('rember')
response = HttpResponse()
temp_RawQuerySet = UserInfo.objects.raw('select * from login_userinfo')
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中
response.set_cookie('username', username, max_age=3 * 24 * 3600)
response.set_signed_cookie('pwd', password, salt='pwdsalt', max_age=3 * 24 * 3600)
else:
# 删除cookie中的之前保存用户名和密码
response.delete_cookie('username')
response.delete_cookie('pwd')
if temp.identity == '老师':
return redirect('teacher_client:teacher_client')
# return render(request, 'teacher_client.html', {'username': temp.username})
else:
return redirect('student_client:student_client')
# 用户密码不匹配
response.delete_cookie('username')
response.delete_cookie('pwd')
error_msg = '用户名或密码错误'
return render(request, 'login.html', {'error_msg1': error_msg})
else:
error_msg = '验证码错误'
return render(request, 'login.html', {'error_msg': error_msg})
def logout(request):
response = HttpResponse()
response.delete_cookie('username')
response.delete_cookie('pwd')
request.session.flush()
return response and redirect('login:login')
def captcha_img(request):
stream = BytesIO()
img, code = captcha.veri_code()
img.save(stream, 'PNG')
request.session['check_code'] = code
return HttpResponse(stream.getvalue())

@ -1,22 +1,22 @@
#!/usr/bin/env python
"""Django's command-line utility for administrative tasks."""
import os
import sys
def main():
"""Run administrative tasks."""
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'the_online_test_system.settings')
try:
from django.core.management import execute_from_command_line
except ImportError as exc:
raise ImportError(
"Couldn't import Django. Are you sure it's installed and "
"available on your PYTHONPATH environment variable? Did you "
"forget to activate a virtual environment?"
) from exc
execute_from_command_line(sys.argv)
if __name__ == '__main__':
main()
#!/usr/bin/env python
"""Django's command-line utility for administrative tasks."""
import os
import sys
def main():
"""Run administrative tasks."""
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'the_online_test_system.settings')
try:
from django.core.management import execute_from_command_line
except ImportError as exc:
raise ImportError(
"Couldn't import Django. Are you sure it's installed and "
"available on your PYTHONPATH environment variable? Did you "
"forget to activate a virtual environment?"
) from exc
execute_from_command_line(sys.argv)
if __name__ == '__main__':
main()

@ -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")

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

@ -1,5 +1,5 @@
from django.apps import AppConfig
class TeacherClientConfig(AppConfig):
name = 'teacher_client'
from django.apps import AppConfig
class TeacherClientConfig(AppConfig):
name = 'teacher_client'

@ -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('请登录')

@ -1,20 +1,20 @@
# Generated by Django 3.1.4 on 2022-04-09 08:54
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='questionBank',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
],
),
]
# Generated by Django 3.1.4 on 2022-04-09 08:54
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='questionBank',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
],
),
]

@ -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):
"""用于存储题目数据"""
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,64 +1,169 @@
<!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>Bootstrap 101 Template</title>
<!-- Bootstrap -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css" integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">
<!-- 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 href="#">上传题目</a></li>
<!-- 之后执行弹窗进行上传 -->
<li><a href="#">我的课堂</a></li>
<li><a href="#">发布测试</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>
</body>
{% 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 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>

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

@ -1,12 +1,20 @@
from django.contrib import admin
from django.urls import path
from . import views
urlpatterns = [
path('admin/', admin.site.urls),
path('teacher_client/', views.teacher_client),
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, 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
def teacher_client(request):
"""教师服务端"""
if request.method == 'GET':
return render(request, 'teacher_client.html')
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':
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
# })

@ -1,16 +1,16 @@
"""
ASGI config for the_online_test_system project.
It exposes the ASGI callable as a module-level variable named ``application``.
For more information on this file, see
https://docs.djangoproject.com/en/3.1/howto/deployment/asgi/
"""
import os
from django.core.asgi import get_asgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'the_online_test_system.settings')
application = get_asgi_application()
"""
ASGI config for the_online_test_system project.
It exposes the ASGI callable as a module-level variable named ``application``.
For more information on this file, see
https://docs.djangoproject.com/en/3.1/howto/deployment/asgi/
"""
import os
from django.core.asgi import get_asgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'the_online_test_system.settings')
application = get_asgi_application()

@ -1,134 +1,136 @@
"""
Django settings for the_online_test_system project.
Generated by 'django-admin startproject' using Django 3.1.4.
For more information on this file, see
https://docs.djangoproject.com/en/3.1/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/3.1/ref/settings/
"""
import os
from pathlib import Path
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/3.1/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '%_iwhh8=4=smi^)&tzfdu%v9n=elm*0p21dpd-df8pcjift#ve'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = []
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'login.apps.LoginConfig',
'teacher_client.apps.TeacherClientConfig'
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = 'the_online_test_system.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': []
,
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'the_online_test_system.wsgi.application'
# Database
# https://docs.djangoproject.com/en/3.1/ref/settings/#databases
# DATABASES = {
# 'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': BASE_DIR / 'db.sqlite3',
# }
# }
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'superstar_1', # 数据库的名字
'USER': 'root', # MySQL账户名
'PASSWORD': '1234', # MySQL密码
'HOST': 'localhost', # 哪台机器上的MySQL
'PORT': 3306, # 端口
}
}
# Password validation
# https://docs.djangoproject.com/en/3.1/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
# Internationalization
# https://docs.djangoproject.com/en/3.1/topics/i18n/
LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.1/howto/static-files/
STATIC_URL = '/static/'
"""
Django settings for the_online_test_system project.
Generated by 'django-admin startproject' using Django 3.1.4.
For more information on this file, see
https://docs.djangoproject.com/en/3.1/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/3.1/ref/settings/
"""
import os
from pathlib import Path
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/3.1/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '%_iwhh8=4=smi^)&tzfdu%v9n=elm*0p21dpd-df8pcjift#ve'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = []
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'login.apps.LoginConfig',
'teacher_client.apps.TeacherClientConfig',
'student_client.apps.StudentClientConfig'
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'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'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': []
,
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'the_online_test_system.wsgi.application'
# Database
# https://docs.djangoproject.com/en/3.1/ref/settings/#databases
# DATABASES = {
# 'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': BASE_DIR / 'db.sqlite3',
# }
# }
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'superstar_1', # 数据库的名字
'USER': 'root', # MySQL账户名
'PASSWORD': '1234', # MySQL密码
'HOST': 'localhost', # 哪台机器上的MySQL
'PORT': 3306, # 端口
}
}
# Password validation
# https://docs.djangoproject.com/en/3.1/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
# Internationalization
# https://docs.djangoproject.com/en/3.1/topics/i18n/
LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.1/howto/static-files/
STATIC_URL = '/static/'

@ -1,35 +1,35 @@
"""the_online_test_system URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/3.1/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path, include
from login import views
import login
urlpatterns = [
# admin后台界面
path('admin/', admin.site.urls),
# 主界面home
path('', views.login),
# 注册界面
path('', include("login.urls")),
# 教师端口
path('', include("teacher_client.urls")),
]
"""the_online_test_system URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/3.1/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path, include
from login import views
import login
urlpatterns = [
# admin后台界面
path('admin/', admin.site.urls),
# 主界面home
path('', views.login),
# 注册界面
path('', include("login.urls")),
# 教师端口
path('', include("teacher_client.urls")),
]
handler500 = login.views.server_error

@ -1,16 +1,16 @@
"""
WSGI config for the_online_test_system project.
It exposes the WSGI callable as a module-level variable named ``application``.
For more information on this file, see
https://docs.djangoproject.com/en/3.1/howto/deployment/wsgi/
"""
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'the_online_test_system.settings')
application = get_wsgi_application()
"""
WSGI config for the_online_test_system project.
It exposes the WSGI callable as a module-level variable named ``application``.
For more information on this file, see
https://docs.djangoproject.com/en/3.1/howto/deployment/wsgi/
"""
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'the_online_test_system.settings')
application = get_wsgi_application()

@ -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