commit 54bdbccdaa4d8f902edbc31fbddadc82e4a14b99 Author: 张舜尧 <2957162290@qq.com> Date: Sun Apr 17 15:21:24 2022 +0800 我新加了一个文件 diff --git a/the_online_test_system/.idea/.gitignore b/the_online_test_system/.idea/.gitignore new file mode 100644 index 0000000..32301b0 --- /dev/null +++ b/the_online_test_system/.idea/.gitignore @@ -0,0 +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/ diff --git a/the_online_test_system/.idea/inspectionProfiles/profiles_settings.xml b/the_online_test_system/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/the_online_test_system/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/the_online_test_system/.idea/misc.xml b/the_online_test_system/.idea/misc.xml new file mode 100644 index 0000000..b534b89 --- /dev/null +++ b/the_online_test_system/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/the_online_test_system/.idea/modules.xml b/the_online_test_system/.idea/modules.xml new file mode 100644 index 0000000..ce93eab --- /dev/null +++ b/the_online_test_system/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/the_online_test_system/.idea/the_online_test_system.iml b/the_online_test_system/.idea/the_online_test_system.iml new file mode 100644 index 0000000..99bf594 --- /dev/null +++ b/the_online_test_system/.idea/the_online_test_system.iml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/the_online_test_system/__pycache__/manage.cpython-38.pyc b/the_online_test_system/__pycache__/manage.cpython-38.pyc new file mode 100644 index 0000000..99ea617 Binary files /dev/null and b/the_online_test_system/__pycache__/manage.cpython-38.pyc differ diff --git a/the_online_test_system/login/__init__.py b/the_online_test_system/login/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/the_online_test_system/login/__pycache__/__init__.cpython-38.pyc b/the_online_test_system/login/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000..695d7f1 Binary files /dev/null and b/the_online_test_system/login/__pycache__/__init__.cpython-38.pyc differ diff --git a/the_online_test_system/login/__pycache__/admin.cpython-38.pyc b/the_online_test_system/login/__pycache__/admin.cpython-38.pyc new file mode 100644 index 0000000..6dd190b Binary files /dev/null and b/the_online_test_system/login/__pycache__/admin.cpython-38.pyc differ diff --git a/the_online_test_system/login/__pycache__/apps.cpython-38.pyc b/the_online_test_system/login/__pycache__/apps.cpython-38.pyc new file mode 100644 index 0000000..0afbacc Binary files /dev/null and b/the_online_test_system/login/__pycache__/apps.cpython-38.pyc differ diff --git a/the_online_test_system/login/__pycache__/models.cpython-38.pyc b/the_online_test_system/login/__pycache__/models.cpython-38.pyc new file mode 100644 index 0000000..73d5d40 Binary files /dev/null and b/the_online_test_system/login/__pycache__/models.cpython-38.pyc differ diff --git a/the_online_test_system/login/__pycache__/urls.cpython-38.pyc b/the_online_test_system/login/__pycache__/urls.cpython-38.pyc new file mode 100644 index 0000000..6ff3c83 Binary files /dev/null and b/the_online_test_system/login/__pycache__/urls.cpython-38.pyc differ diff --git a/the_online_test_system/login/__pycache__/views.cpython-38.pyc b/the_online_test_system/login/__pycache__/views.cpython-38.pyc new file mode 100644 index 0000000..9d79010 Binary files /dev/null and b/the_online_test_system/login/__pycache__/views.cpython-38.pyc differ diff --git a/the_online_test_system/login/admin.py b/the_online_test_system/login/admin.py new file mode 100644 index 0000000..ea5d68b --- /dev/null +++ b/the_online_test_system/login/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/the_online_test_system/login/apps.py b/the_online_test_system/login/apps.py new file mode 100644 index 0000000..0264a8b --- /dev/null +++ b/the_online_test_system/login/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class LoginConfig(AppConfig): + name = 'login' diff --git a/the_online_test_system/login/common/FZSTK.TTF b/the_online_test_system/login/common/FZSTK.TTF new file mode 100644 index 0000000..407d370 Binary files /dev/null and b/the_online_test_system/login/common/FZSTK.TTF differ diff --git a/the_online_test_system/login/common/__pycache__/captcha.cpython-38.pyc b/the_online_test_system/login/common/__pycache__/captcha.cpython-38.pyc new file mode 100644 index 0000000..44b60bd Binary files /dev/null and b/the_online_test_system/login/common/__pycache__/captcha.cpython-38.pyc differ diff --git a/the_online_test_system/login/common/captcha.py b/the_online_test_system/login/common/captcha.py new file mode 100644 index 0000000..6ca3508 --- /dev/null +++ b/the_online_test_system/login/common/captcha.py @@ -0,0 +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: + img.save(f) \ No newline at end of file diff --git a/the_online_test_system/login/migrations/0001_initial.py b/the_online_test_system/login/migrations/0001_initial.py new file mode 100644 index 0000000..c7f3df0 --- /dev/null +++ b/the_online_test_system/login/migrations/0001_initial.py @@ -0,0 +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='密码')), + ], + ), + ] diff --git a/the_online_test_system/login/migrations/__init__.py b/the_online_test_system/login/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/the_online_test_system/login/migrations/__pycache__/0001_initial.cpython-38.pyc b/the_online_test_system/login/migrations/__pycache__/0001_initial.cpython-38.pyc new file mode 100644 index 0000000..56db1f7 Binary files /dev/null and b/the_online_test_system/login/migrations/__pycache__/0001_initial.cpython-38.pyc differ diff --git a/the_online_test_system/login/migrations/__pycache__/__init__.cpython-38.pyc b/the_online_test_system/login/migrations/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000..25f8c4e Binary files /dev/null and b/the_online_test_system/login/migrations/__pycache__/__init__.cpython-38.pyc differ diff --git a/the_online_test_system/login/models.py b/the_online_test_system/login/models.py new file mode 100644 index 0000000..7bffcc1 --- /dev/null +++ b/the_online_test_system/login/models.py @@ -0,0 +1,21 @@ +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) + + + + + + + diff --git a/the_online_test_system/login/static/css/myhome.css b/the_online_test_system/login/static/css/myhome.css new file mode 100644 index 0000000..7693811 --- /dev/null +++ b/the_online_test_system/login/static/css/myhome.css @@ -0,0 +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; +} + + + diff --git a/the_online_test_system/login/static/css/phontos_show.css b/the_online_test_system/login/static/css/phontos_show.css new file mode 100644 index 0000000..4933821 --- /dev/null +++ b/the_online_test_system/login/static/css/phontos_show.css @@ -0,0 +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); + } + } \ No newline at end of file diff --git a/the_online_test_system/login/static/css/zhuce.css b/the_online_test_system/login/static/css/zhuce.css new file mode 100644 index 0000000..ff28232 --- /dev/null +++ b/the_online_test_system/login/static/css/zhuce.css @@ -0,0 +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; +} \ No newline at end of file diff --git a/the_online_test_system/login/static/img/01d9485955c34aa8012193a3101e20.gif b/the_online_test_system/login/static/img/01d9485955c34aa8012193a3101e20.gif new file mode 100644 index 0000000..41d2cc1 Binary files /dev/null and b/the_online_test_system/login/static/img/01d9485955c34aa8012193a3101e20.gif differ diff --git a/the_online_test_system/login/static/img/1.jpg b/the_online_test_system/login/static/img/1.jpg new file mode 100644 index 0000000..5a46d26 Binary files /dev/null and b/the_online_test_system/login/static/img/1.jpg differ diff --git a/the_online_test_system/login/static/img/1.png b/the_online_test_system/login/static/img/1.png new file mode 100644 index 0000000..d698db7 Binary files /dev/null and b/the_online_test_system/login/static/img/1.png differ diff --git a/the_online_test_system/login/static/img/2.jpg b/the_online_test_system/login/static/img/2.jpg new file mode 100644 index 0000000..014bd50 Binary files /dev/null and b/the_online_test_system/login/static/img/2.jpg differ diff --git a/the_online_test_system/login/static/img/3.jpg b/the_online_test_system/login/static/img/3.jpg new file mode 100644 index 0000000..89ca4cc Binary files /dev/null and b/the_online_test_system/login/static/img/3.jpg differ diff --git a/the_online_test_system/login/static/img/bili1.png b/the_online_test_system/login/static/img/bili1.png new file mode 100644 index 0000000..bcabbc8 Binary files /dev/null and b/the_online_test_system/login/static/img/bili1.png differ diff --git a/the_online_test_system/login/static/img/bilis.png b/the_online_test_system/login/static/img/bilis.png new file mode 100644 index 0000000..2891960 Binary files /dev/null and b/the_online_test_system/login/static/img/bilis.png differ diff --git a/the_online_test_system/login/static/img/rch.png b/the_online_test_system/login/static/img/rch.png new file mode 100644 index 0000000..9690a3b Binary files /dev/null and b/the_online_test_system/login/static/img/rch.png differ diff --git a/the_online_test_system/login/static/img/zc1.jpg b/the_online_test_system/login/static/img/zc1.jpg new file mode 100644 index 0000000..4813bbf Binary files /dev/null and b/the_online_test_system/login/static/img/zc1.jpg differ diff --git a/the_online_test_system/login/static/img/zc2.jpg b/the_online_test_system/login/static/img/zc2.jpg new file mode 100644 index 0000000..55d1236 Binary files /dev/null and b/the_online_test_system/login/static/img/zc2.jpg differ diff --git a/the_online_test_system/login/static/img/zc2.png b/the_online_test_system/login/static/img/zc2.png new file mode 100644 index 0000000..7335d2c Binary files /dev/null and b/the_online_test_system/login/static/img/zc2.png differ diff --git a/the_online_test_system/login/static/img/zc3.png b/the_online_test_system/login/static/img/zc3.png new file mode 100644 index 0000000..7248d24 Binary files /dev/null and b/the_online_test_system/login/static/img/zc3.png differ diff --git a/the_online_test_system/login/static/img/zc4.jpg b/the_online_test_system/login/static/img/zc4.jpg new file mode 100644 index 0000000..c882615 Binary files /dev/null and b/the_online_test_system/login/static/img/zc4.jpg differ diff --git a/the_online_test_system/login/static/img/主页.png b/the_online_test_system/login/static/img/主页.png new file mode 100644 index 0000000..0df6399 Binary files /dev/null and b/the_online_test_system/login/static/img/主页.png differ diff --git a/the_online_test_system/login/static/img/主页1.1.png b/the_online_test_system/login/static/img/主页1.1.png new file mode 100644 index 0000000..9a54e7b Binary files /dev/null and b/the_online_test_system/login/static/img/主页1.1.png differ diff --git a/the_online_test_system/login/static/img/主页1.3.png b/the_online_test_system/login/static/img/主页1.3.png new file mode 100644 index 0000000..c32e3fd Binary files /dev/null and b/the_online_test_system/login/static/img/主页1.3.png differ diff --git a/the_online_test_system/login/static/img/主页1.png b/the_online_test_system/login/static/img/主页1.png new file mode 100644 index 0000000..52915ad Binary files /dev/null and b/the_online_test_system/login/static/img/主页1.png differ diff --git a/the_online_test_system/login/static/img/和煦希望之风2560x1440.jpg b/the_online_test_system/login/static/img/和煦希望之风2560x1440.jpg new file mode 100644 index 0000000..cb58b40 Binary files /dev/null and b/the_online_test_system/login/static/img/和煦希望之风2560x1440.jpg differ diff --git a/the_online_test_system/login/static/img/登录.jpg b/the_online_test_system/login/static/img/登录.jpg new file mode 100644 index 0000000..73119fa Binary files /dev/null and b/the_online_test_system/login/static/img/登录.jpg differ diff --git a/the_online_test_system/login/static/img/虞姬1.jpg b/the_online_test_system/login/static/img/虞姬1.jpg new file mode 100644 index 0000000..c5328b6 Binary files /dev/null and b/the_online_test_system/login/static/img/虞姬1.jpg differ diff --git a/the_online_test_system/login/static/img/首页1.jpg b/the_online_test_system/login/static/img/首页1.jpg new file mode 100644 index 0000000..bb26345 Binary files /dev/null and b/the_online_test_system/login/static/img/首页1.jpg differ diff --git a/the_online_test_system/login/templates/12343.html b/the_online_test_system/login/templates/12343.html new file mode 100644 index 0000000..c52f72a --- /dev/null +++ b/the_online_test_system/login/templates/12343.html @@ -0,0 +1,148 @@ +{% load static %} + + + + + + + 主页 + + + + + + + + +
+ +
+
+ +
+ +
+
+
+ + + 搜索 + +
+
+
+ +
+
+ + +
+
+
+ +
+ + + +
+ +
+
    +
  • 1
  • +
  • 2
  • +
  • 3
  • +
+
+
+
+ + +
+ +
+ +
+ +
+ {% csrf_token %} + + + + + + + + + + + + + + + +

+ 记住密码 +

+ + + + + + +
+ 账号:  +
+ 密码:  +
+ {% if error_msg %}

{{ error_msg }}

{% endif %} +
+ 验证码: + +
+ +
+ + 去注册 + +
+ +
+
+ + +
+ + \ No newline at end of file diff --git a/the_online_test_system/login/templates/login.html b/the_online_test_system/login/templates/login.html new file mode 100644 index 0000000..719413d --- /dev/null +++ b/the_online_test_system/login/templates/login.html @@ -0,0 +1,152 @@ +{% load static %} + + + + + + + 主页 + + + + + + + + +
+ +
+
+ +
+ +
+
+
+ + + 搜索 + +
+
+
+ +
+
+ + +
+
+
+ +
+ + + +
+ +
+
    +
  • 1
  • +
  • 2
  • +
  • 3
  • +
+
+
+
+ + +
+ +
+ +
+ +
+ {% csrf_token %} + + + + + + + + +{# {% if error_msg %}{{ error_msg }}{% endif %}#} + + +{# #} +{# #} +{# #} + + + + + + + + + + +
+ 账号:   +
+ 密码:   +
#} +{# #} +{#
+ 验证码: + +
+{# 记住密码#} + + 记住密码 + + + 去注册 + +
+ +
+ +
+
+ + +
+ + \ No newline at end of file diff --git a/the_online_test_system/login/templates/zhuce.html b/the_online_test_system/login/templates/zhuce.html new file mode 100644 index 0000000..e95ab75 --- /dev/null +++ b/the_online_test_system/login/templates/zhuce.html @@ -0,0 +1,92 @@ + + +{% load static %} + + + + + + 注册页面 + + + +
+ {%csrf_token%} +
+

启航题库

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ {% if error_msg %}

{{ error_msg }}

{% endif %} +
+ + + + + + + + + + + +
+ +
+ +
+ +
+ + +
+ +
+ +
+ +
+ 我同意注册条款和会员加入标准 +
+ 我是会员,立即登录 +
+
+
+ + \ No newline at end of file diff --git a/the_online_test_system/login/tests.py b/the_online_test_system/login/tests.py new file mode 100644 index 0000000..de8bdc0 --- /dev/null +++ b/the_online_test_system/login/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/the_online_test_system/login/urls.py b/the_online_test_system/login/urls.py new file mode 100644 index 0000000..72aa78f --- /dev/null +++ b/the_online_test_system/login/urls.py @@ -0,0 +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'), + +] + diff --git a/the_online_test_system/login/views.py b/the_online_test_system/login/views.py new file mode 100644 index 0000000..7341455 --- /dev/null +++ b/the_online_test_system/login/views.py @@ -0,0 +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("") + + +# 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()) \ No newline at end of file diff --git a/the_online_test_system/manage.py b/the_online_test_system/manage.py new file mode 100644 index 0000000..24c46b2 --- /dev/null +++ b/the_online_test_system/manage.py @@ -0,0 +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() diff --git a/the_online_test_system/student_client/__init__.py b/the_online_test_system/student_client/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/the_online_test_system/student_client/__pycache__/__init__.cpython-38.pyc b/the_online_test_system/student_client/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000..22efc28 Binary files /dev/null and b/the_online_test_system/student_client/__pycache__/__init__.cpython-38.pyc differ diff --git a/the_online_test_system/student_client/__pycache__/admin.cpython-38.pyc b/the_online_test_system/student_client/__pycache__/admin.cpython-38.pyc new file mode 100644 index 0000000..2ff6c4b Binary files /dev/null and b/the_online_test_system/student_client/__pycache__/admin.cpython-38.pyc differ diff --git a/the_online_test_system/student_client/__pycache__/apps.cpython-38.pyc b/the_online_test_system/student_client/__pycache__/apps.cpython-38.pyc new file mode 100644 index 0000000..911d816 Binary files /dev/null and b/the_online_test_system/student_client/__pycache__/apps.cpython-38.pyc differ diff --git a/the_online_test_system/student_client/__pycache__/models.cpython-38.pyc b/the_online_test_system/student_client/__pycache__/models.cpython-38.pyc new file mode 100644 index 0000000..96de1d9 Binary files /dev/null and b/the_online_test_system/student_client/__pycache__/models.cpython-38.pyc differ diff --git a/the_online_test_system/student_client/admin.py b/the_online_test_system/student_client/admin.py new file mode 100644 index 0000000..ea5d68b --- /dev/null +++ b/the_online_test_system/student_client/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/the_online_test_system/student_client/apps.py b/the_online_test_system/student_client/apps.py new file mode 100644 index 0000000..171074f --- /dev/null +++ b/the_online_test_system/student_client/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class StudentClientConfig(AppConfig): + name = 'student_client' diff --git a/the_online_test_system/student_client/migrations/__init__.py b/the_online_test_system/student_client/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/the_online_test_system/student_client/migrations/__pycache__/__init__.cpython-38.pyc b/the_online_test_system/student_client/migrations/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000..907acfa Binary files /dev/null and b/the_online_test_system/student_client/migrations/__pycache__/__init__.cpython-38.pyc differ diff --git a/the_online_test_system/student_client/models.py b/the_online_test_system/student_client/models.py new file mode 100644 index 0000000..fd18c6e --- /dev/null +++ b/the_online_test_system/student_client/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/the_online_test_system/student_client/templates/student_client.html b/the_online_test_system/student_client/templates/student_client.html new file mode 100644 index 0000000..65b28be --- /dev/null +++ b/the_online_test_system/student_client/templates/student_client.html @@ -0,0 +1,100 @@ +{% load static %} + + + + + + + + 教师端口 + + + + + + + + + + + + + + + + + + + +
+ 灯塔测试 +
+ + + + + + + \ No newline at end of file diff --git a/the_online_test_system/student_client/tests.py b/the_online_test_system/student_client/tests.py new file mode 100644 index 0000000..de8bdc0 --- /dev/null +++ b/the_online_test_system/student_client/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/the_online_test_system/student_client/urls.py b/the_online_test_system/student_client/urls.py new file mode 100644 index 0000000..7389497 --- /dev/null +++ b/the_online_test_system/student_client/urls.py @@ -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") + +] \ No newline at end of file diff --git a/the_online_test_system/student_client/views.py b/the_online_test_system/student_client/views.py new file mode 100644 index 0000000..e387e5a --- /dev/null +++ b/the_online_test_system/student_client/views.py @@ -0,0 +1,7 @@ +from django.shortcuts import render + + +def student_client(request): + """学生端口""" + if request.method == "GET": + return render(request, "student_client.html") \ No newline at end of file diff --git a/the_online_test_system/teacher_client/__init__.py b/the_online_test_system/teacher_client/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/the_online_test_system/teacher_client/__pycache__/__init__.cpython-38.pyc b/the_online_test_system/teacher_client/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000..e8f15c7 Binary files /dev/null and b/the_online_test_system/teacher_client/__pycache__/__init__.cpython-38.pyc differ diff --git a/the_online_test_system/teacher_client/__pycache__/admin.cpython-38.pyc b/the_online_test_system/teacher_client/__pycache__/admin.cpython-38.pyc new file mode 100644 index 0000000..b535b5e Binary files /dev/null and b/the_online_test_system/teacher_client/__pycache__/admin.cpython-38.pyc differ diff --git a/the_online_test_system/teacher_client/__pycache__/apps.cpython-38.pyc b/the_online_test_system/teacher_client/__pycache__/apps.cpython-38.pyc new file mode 100644 index 0000000..294c303 Binary files /dev/null and b/the_online_test_system/teacher_client/__pycache__/apps.cpython-38.pyc differ diff --git a/the_online_test_system/teacher_client/__pycache__/models.cpython-38.pyc b/the_online_test_system/teacher_client/__pycache__/models.cpython-38.pyc new file mode 100644 index 0000000..69ba35c Binary files /dev/null and b/the_online_test_system/teacher_client/__pycache__/models.cpython-38.pyc differ diff --git a/the_online_test_system/teacher_client/__pycache__/urls.cpython-38.pyc b/the_online_test_system/teacher_client/__pycache__/urls.cpython-38.pyc new file mode 100644 index 0000000..014b800 Binary files /dev/null and b/the_online_test_system/teacher_client/__pycache__/urls.cpython-38.pyc differ diff --git a/the_online_test_system/teacher_client/__pycache__/views.cpython-38.pyc b/the_online_test_system/teacher_client/__pycache__/views.cpython-38.pyc new file mode 100644 index 0000000..ca67d5e Binary files /dev/null and b/the_online_test_system/teacher_client/__pycache__/views.cpython-38.pyc differ diff --git a/the_online_test_system/teacher_client/admin.py b/the_online_test_system/teacher_client/admin.py new file mode 100644 index 0000000..ea5d68b --- /dev/null +++ b/the_online_test_system/teacher_client/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/the_online_test_system/teacher_client/apps.py b/the_online_test_system/teacher_client/apps.py new file mode 100644 index 0000000..723830c --- /dev/null +++ b/the_online_test_system/teacher_client/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class TeacherClientConfig(AppConfig): + name = 'teacher_client' diff --git a/the_online_test_system/teacher_client/common/__pycache__/createCode.cpython-38.pyc b/the_online_test_system/teacher_client/common/__pycache__/createCode.cpython-38.pyc new file mode 100644 index 0000000..d5a1319 Binary files /dev/null and b/the_online_test_system/teacher_client/common/__pycache__/createCode.cpython-38.pyc differ diff --git a/the_online_test_system/teacher_client/common/createCode.py b/the_online_test_system/teacher_client/common/createCode.py new file mode 100644 index 0000000..2b7eee6 --- /dev/null +++ b/the_online_test_system/teacher_client/common/createCode.py @@ -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 \ No newline at end of file diff --git a/the_online_test_system/teacher_client/middleware/__pycache__/auto.cpython-38.pyc b/the_online_test_system/teacher_client/middleware/__pycache__/auto.cpython-38.pyc new file mode 100644 index 0000000..2596592 Binary files /dev/null and b/the_online_test_system/teacher_client/middleware/__pycache__/auto.cpython-38.pyc differ diff --git a/the_online_test_system/teacher_client/middleware/auto.py b/the_online_test_system/teacher_client/middleware/auto.py new file mode 100644 index 0000000..1641000 --- /dev/null +++ b/the_online_test_system/teacher_client/middleware/auto.py @@ -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('请登录') \ No newline at end of file diff --git a/the_online_test_system/teacher_client/migrations/0001_initial.py b/the_online_test_system/teacher_client/migrations/0001_initial.py new file mode 100644 index 0000000..4c4d680 --- /dev/null +++ b/the_online_test_system/teacher_client/migrations/0001_initial.py @@ -0,0 +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')), + ], + ), + ] diff --git a/the_online_test_system/teacher_client/migrations/0002_auto_20220414_1945.py b/the_online_test_system/teacher_client/migrations/0002_auto_20220414_1945.py new file mode 100644 index 0000000..9be4d5f --- /dev/null +++ b/the_online_test_system/teacher_client/migrations/0002_auto_20220414_1945.py @@ -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', + ), + ] diff --git a/the_online_test_system/teacher_client/migrations/0003_questionbank.py b/the_online_test_system/teacher_client/migrations/0003_questionbank.py new file mode 100644 index 0000000..5446433 --- /dev/null +++ b/the_online_test_system/teacher_client/migrations/0003_questionbank.py @@ -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='所属班级')), + ], + ), + ] diff --git a/the_online_test_system/teacher_client/migrations/0004_auto_20220415_1755.py b/the_online_test_system/teacher_client/migrations/0004_auto_20220415_1755.py new file mode 100644 index 0000000..9b61faf --- /dev/null +++ b/the_online_test_system/teacher_client/migrations/0004_auto_20220415_1755.py @@ -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='答案'), + ), + ] diff --git a/the_online_test_system/teacher_client/migrations/0005_questionbank_que_time.py b/the_online_test_system/teacher_client/migrations/0005_questionbank_que_time.py new file mode 100644 index 0000000..d0e42c2 --- /dev/null +++ b/the_online_test_system/teacher_client/migrations/0005_questionbank_que_time.py @@ -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='存入时间'), + ), + ] diff --git a/the_online_test_system/teacher_client/migrations/0006_testquestionbank.py b/the_online_test_system/teacher_client/migrations/0006_testquestionbank.py new file mode 100644 index 0000000..c849ae4 --- /dev/null +++ b/the_online_test_system/teacher_client/migrations/0006_testquestionbank.py @@ -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='所属班级')), + ], + ), + ] diff --git a/the_online_test_system/teacher_client/migrations/0007_testquestionbank_test_time.py b/the_online_test_system/teacher_client/migrations/0007_testquestionbank_test_time.py new file mode 100644 index 0000000..a3702b1 --- /dev/null +++ b/the_online_test_system/teacher_client/migrations/0007_testquestionbank_test_time.py @@ -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='考试时间'), + ), + ] diff --git a/the_online_test_system/teacher_client/migrations/__init__.py b/the_online_test_system/teacher_client/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/the_online_test_system/teacher_client/migrations/__pycache__/0001_initial.cpython-38.pyc b/the_online_test_system/teacher_client/migrations/__pycache__/0001_initial.cpython-38.pyc new file mode 100644 index 0000000..8505d8a Binary files /dev/null and b/the_online_test_system/teacher_client/migrations/__pycache__/0001_initial.cpython-38.pyc differ diff --git a/the_online_test_system/teacher_client/migrations/__pycache__/0002_auto_20220414_1945.cpython-38.pyc b/the_online_test_system/teacher_client/migrations/__pycache__/0002_auto_20220414_1945.cpython-38.pyc new file mode 100644 index 0000000..e3257ba Binary files /dev/null and b/the_online_test_system/teacher_client/migrations/__pycache__/0002_auto_20220414_1945.cpython-38.pyc differ diff --git a/the_online_test_system/teacher_client/migrations/__pycache__/0003_questionbank.cpython-38.pyc b/the_online_test_system/teacher_client/migrations/__pycache__/0003_questionbank.cpython-38.pyc new file mode 100644 index 0000000..5571914 Binary files /dev/null and b/the_online_test_system/teacher_client/migrations/__pycache__/0003_questionbank.cpython-38.pyc differ diff --git a/the_online_test_system/teacher_client/migrations/__pycache__/0004_auto_20220415_1755.cpython-38.pyc b/the_online_test_system/teacher_client/migrations/__pycache__/0004_auto_20220415_1755.cpython-38.pyc new file mode 100644 index 0000000..2cc0553 Binary files /dev/null and b/the_online_test_system/teacher_client/migrations/__pycache__/0004_auto_20220415_1755.cpython-38.pyc differ diff --git a/the_online_test_system/teacher_client/migrations/__pycache__/0005_questionbank_que_time.cpython-38.pyc b/the_online_test_system/teacher_client/migrations/__pycache__/0005_questionbank_que_time.cpython-38.pyc new file mode 100644 index 0000000..3309f66 Binary files /dev/null and b/the_online_test_system/teacher_client/migrations/__pycache__/0005_questionbank_que_time.cpython-38.pyc differ diff --git a/the_online_test_system/teacher_client/migrations/__pycache__/0006_testquestionbank.cpython-38.pyc b/the_online_test_system/teacher_client/migrations/__pycache__/0006_testquestionbank.cpython-38.pyc new file mode 100644 index 0000000..031e073 Binary files /dev/null and b/the_online_test_system/teacher_client/migrations/__pycache__/0006_testquestionbank.cpython-38.pyc differ diff --git a/the_online_test_system/teacher_client/migrations/__pycache__/0007_testquestionbank_test_time.cpython-38.pyc b/the_online_test_system/teacher_client/migrations/__pycache__/0007_testquestionbank_test_time.cpython-38.pyc new file mode 100644 index 0000000..795f4cc Binary files /dev/null and b/the_online_test_system/teacher_client/migrations/__pycache__/0007_testquestionbank_test_time.cpython-38.pyc differ diff --git a/the_online_test_system/teacher_client/migrations/__pycache__/__init__.cpython-38.pyc b/the_online_test_system/teacher_client/migrations/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000..6d1d5ad Binary files /dev/null and b/the_online_test_system/teacher_client/migrations/__pycache__/__init__.cpython-38.pyc differ diff --git a/the_online_test_system/teacher_client/models.py b/the_online_test_system/teacher_client/models.py new file mode 100644 index 0000000..a08ee1e --- /dev/null +++ b/the_online_test_system/teacher_client/models.py @@ -0,0 +1,45 @@ +from django.db import models + + +# class questionBank(models.Model): +# """用于存储题目数据""" + + +class teacherClass(models.Model): + """记录班级加课码""" + name = models.CharField(max_length=32, verbose_name="姓名", blank=False, null=False) + id_number = models.CharField(max_length=32, verbose_name="学号/教师编号", blank=False, null=False) + classCode = models.CharField(max_length=20, verbose_name="加课码", default='') + classname = models.CharField(max_length=20, verbose_name="课程名", default='') + + +class classTable(models.Model): + """班级表""" + name = models.CharField(max_length=32, verbose_name="姓名", blank=False, null=False) + id_number = models.CharField(max_length=32, verbose_name="学号/教师编号", blank=False, null=False) + phone = models.CharField(max_length=32, verbose_name="手机", unique=True, blank=False, null=False) + classCode = models.CharField(max_length=6, verbose_name="加课码", default='') + + +class questionBank(models.Model): + """用于保存用户上传提交的题目""" + qus_imfomation = models.CharField(max_length=1000, verbose_name="题目信息", blank=False, null=False) + qus_A = models.CharField(max_length=1000, verbose_name="选项A", blank=False, null=False) + qus_B = models.CharField(max_length=1000, verbose_name="选项B", blank=False, null=False) + qus_C = models.CharField(max_length=1000, verbose_name="选项C", blank=False, null=False) + qus_D = models.CharField(max_length=1000, verbose_name="选项D") + qus_ans = models.CharField(max_length=1000, verbose_name="答案", blank=False, null=False) + que_classcode = models.CharField(max_length=1000, verbose_name="所属班级", blank=False, null=False) + que_time = models.CharField(max_length=200, verbose_name="存入时间", default="") + + +class testQuestionBank(models.Model): + """考试信息表""" + qus_imfomation = models.CharField(max_length=1000, verbose_name="题目信息", blank=False, null=False) + qus_A = models.CharField(max_length=1000, verbose_name="选项A", blank=False, null=False) + qus_B = models.CharField(max_length=1000, verbose_name="选项B", blank=False, null=False) + qus_C = models.CharField(max_length=1000, verbose_name="选项C", blank=False, null=False) + qus_D = models.CharField(max_length=1000, verbose_name="选项D") + qus_ans = models.CharField(max_length=1000, verbose_name="答案") + test_code = models.CharField(max_length=1000, verbose_name="所属班级", blank=False, null=False) + test_time = models.CharField(max_length=200, verbose_name="考试时间", default='') \ No newline at end of file diff --git a/the_online_test_system/teacher_client/static/css/css.css b/the_online_test_system/teacher_client/static/css/css.css new file mode 100644 index 0000000..8c7a398 --- /dev/null +++ b/the_online_test_system/teacher_client/static/css/css.css @@ -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; +} diff --git a/the_online_test_system/teacher_client/static/css/henyeqi.css b/the_online_test_system/teacher_client/static/css/henyeqi.css new file mode 100644 index 0000000..ac7e5aa --- /dev/null +++ b/the_online_test_system/teacher_client/static/css/henyeqi.css @@ -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}*/ \ No newline at end of file diff --git a/the_online_test_system/teacher_client/static/css/stud.css b/the_online_test_system/teacher_client/static/css/stud.css new file mode 100644 index 0000000..9f772b0 --- /dev/null +++ b/the_online_test_system/teacher_client/static/css/stud.css @@ -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 ; +} */ \ No newline at end of file diff --git a/the_online_test_system/teacher_client/static/css/teacher.css b/the_online_test_system/teacher_client/static/css/teacher.css new file mode 100644 index 0000000..c82bf2c --- /dev/null +++ b/the_online_test_system/teacher_client/static/css/teacher.css @@ -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; */ +} \ No newline at end of file diff --git a/the_online_test_system/teacher_client/templates/createClass.html b/the_online_test_system/teacher_client/templates/createClass.html new file mode 100644 index 0000000..27c26e8 --- /dev/null +++ b/the_online_test_system/teacher_client/templates/createClass.html @@ -0,0 +1,15 @@ + + + + + Title + + +
+ {% csrf_token %} + 班级名: + +
+ + + \ No newline at end of file diff --git a/the_online_test_system/teacher_client/templates/teacher_client.html b/the_online_test_system/teacher_client/templates/teacher_client.html new file mode 100644 index 0000000..1ef9bd6 --- /dev/null +++ b/the_online_test_system/teacher_client/templates/teacher_client.html @@ -0,0 +1,169 @@ +{% load static %} + + + + + + + + 教师端口 + + + + + + + + + + + + + + + + + + + +
+ 灯塔测试 +
+ +
+
+ +
+ +
+ +
+ + +
+
+{# #} + + + + +
+
+ + + \ No newline at end of file diff --git a/the_online_test_system/teacher_client/templates/test.html b/the_online_test_system/teacher_client/templates/test.html new file mode 100644 index 0000000..22123b0 --- /dev/null +++ b/the_online_test_system/teacher_client/templates/test.html @@ -0,0 +1,110 @@ +{% load static %} + + + + + + Title + + + + + +
+
+
+ {% if single_choice %} + 单选题
+ {% for counter in single_choice %} + {{ forloop.counter }} + {% endfor %} +{% endif %} +{% if multiple_choice %} +
多选题
+ {% for counter in multiple_choice %} + {{ forloop.counter }} + {% endfor %} +{% endif %} +{% if gap_filling %} +
填空题
+ {% for counter in gap_filling %} + {{ forloop.counter }} + {% endfor %} +{% endif %} +
+
+ {% csrf_token %} + + 时间: + + 是否决定发布测试?
+ + {% if TEST_CODE %} + 本场考试的考试码为:{{ TEST_CODE }} + {% endif %} +
+
+ + +
+ +
+
+
+ + + +{# {% for student in student_page.object_list %} #} + {% if single_choice %} + 一、单选

+ {% for single in single_choice %} + +
+ {% endfor %} + {% endif %} + + +{# {% for student in student_page.object_list %} #} + {% if multiple_choice %} +
二、多选

+ {% for multiple in multiple_choice %} + +
+ {% endfor %} + {% endif %} + + +{# {% for student in student_page.object_list %} #} + {% if gap_filling %} +
三、填空题

+ {% for gap in gap_filling%} + +
+ {% endfor %} + {% endif %} + +
+ +
+
+ + + + + \ No newline at end of file diff --git a/the_online_test_system/teacher_client/tests.py b/the_online_test_system/teacher_client/tests.py new file mode 100644 index 0000000..de8bdc0 --- /dev/null +++ b/the_online_test_system/teacher_client/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/the_online_test_system/teacher_client/urls.py b/the_online_test_system/teacher_client/urls.py new file mode 100644 index 0000000..02f3be4 --- /dev/null +++ b/the_online_test_system/teacher_client/urls.py @@ -0,0 +1,20 @@ +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") + + +] \ No newline at end of file diff --git a/the_online_test_system/teacher_client/views.py b/the_online_test_system/teacher_client/views.py new file mode 100644 index 0000000..e699031 --- /dev/null +++ b/the_online_test_system/teacher_client/views.py @@ -0,0 +1,255 @@ +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 + # }) \ No newline at end of file diff --git a/the_online_test_system/the_online_test_system/__init__.py b/the_online_test_system/the_online_test_system/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/the_online_test_system/the_online_test_system/__pycache__/__init__.cpython-38.pyc b/the_online_test_system/the_online_test_system/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000..cb76739 Binary files /dev/null and b/the_online_test_system/the_online_test_system/__pycache__/__init__.cpython-38.pyc differ diff --git a/the_online_test_system/the_online_test_system/__pycache__/settings.cpython-38.pyc b/the_online_test_system/the_online_test_system/__pycache__/settings.cpython-38.pyc new file mode 100644 index 0000000..e29ae7a Binary files /dev/null and b/the_online_test_system/the_online_test_system/__pycache__/settings.cpython-38.pyc differ diff --git a/the_online_test_system/the_online_test_system/__pycache__/urls.cpython-38.pyc b/the_online_test_system/the_online_test_system/__pycache__/urls.cpython-38.pyc new file mode 100644 index 0000000..4ef0105 Binary files /dev/null and b/the_online_test_system/the_online_test_system/__pycache__/urls.cpython-38.pyc differ diff --git a/the_online_test_system/the_online_test_system/__pycache__/wsgi.cpython-38.pyc b/the_online_test_system/the_online_test_system/__pycache__/wsgi.cpython-38.pyc new file mode 100644 index 0000000..145f37f Binary files /dev/null and b/the_online_test_system/the_online_test_system/__pycache__/wsgi.cpython-38.pyc differ diff --git a/the_online_test_system/the_online_test_system/asgi.py b/the_online_test_system/the_online_test_system/asgi.py new file mode 100644 index 0000000..13d4623 --- /dev/null +++ b/the_online_test_system/the_online_test_system/asgi.py @@ -0,0 +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() diff --git a/the_online_test_system/the_online_test_system/settings.py b/the_online_test_system/the_online_test_system/settings.py new file mode 100644 index 0000000..72e7312 --- /dev/null +++ b/the_online_test_system/the_online_test_system/settings.py @@ -0,0 +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', + '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/' + diff --git a/the_online_test_system/the_online_test_system/urls.py b/the_online_test_system/the_online_test_system/urls.py new file mode 100644 index 0000000..88e7398 --- /dev/null +++ b/the_online_test_system/the_online_test_system/urls.py @@ -0,0 +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")), +] + +handler500 = login.views.server_error \ No newline at end of file diff --git a/the_online_test_system/the_online_test_system/wsgi.py b/the_online_test_system/the_online_test_system/wsgi.py new file mode 100644 index 0000000..1db02fd --- /dev/null +++ b/the_online_test_system/the_online_test_system/wsgi.py @@ -0,0 +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() diff --git a/一、在线习题测试系统背景.md b/一、在线习题测试系统背景.md new file mode 100644 index 0000000..e9e245e --- /dev/null +++ b/一、在线习题测试系统背景.md @@ -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、《跟老齐学Python:Django实战(第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、前端设计和后台设计]() + + + + + +​ +