diff --git a/the_online_test_system/login/__pycache__/admin.cpython-38.pyc b/the_online_test_system/login/__pycache__/admin.cpython-38.pyc index 6dd190b..ee0c303 100644 Binary files a/the_online_test_system/login/__pycache__/admin.cpython-38.pyc and b/the_online_test_system/login/__pycache__/admin.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 index 73d5d40..03d801b 100644 Binary files a/the_online_test_system/login/__pycache__/models.cpython-38.pyc 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 index 6ff3c83..bc0aad9 100644 Binary files a/the_online_test_system/login/__pycache__/urls.cpython-38.pyc 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 index 9d79010..990d0a5 100644 Binary files a/the_online_test_system/login/__pycache__/views.cpython-38.pyc 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 index ea5d68b..58b7f5b 100644 --- a/the_online_test_system/login/admin.py +++ b/the_online_test_system/login/admin.py @@ -1,3 +1,11 @@ from django.contrib import admin +from .models import UserInfo -# Register your models here. + +class UserInfoAdmin(admin.ModelAdmin): + list_display = ['identity', 'name', 'id_number', 'phone', 'username', 'password'] + + list_filter = ['identity'] + + +admin.site.register(UserInfo, UserInfoAdmin) \ No newline at end of file diff --git a/the_online_test_system/login/models.py b/the_online_test_system/login/models.py index 7bffcc1..b22e1dc 100644 --- a/the_online_test_system/login/models.py +++ b/the_online_test_system/login/models.py @@ -13,6 +13,16 @@ class UserInfo(models.Model): 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) + class Meta: + + # 表详细备注 + verbose_name = '用户列表' + + # 设置排序 + ordering = ['id'] + + # 表复数形式 + verbose_name_plural = verbose_name diff --git a/the_online_test_system/login/static/css/myhome.css b/the_online_test_system/login/static/css/myhome.css index 7693811..03fc848 100644 --- a/the_online_test_system/login/static/css/myhome.css +++ b/the_online_test_system/login/static/css/myhome.css @@ -125,7 +125,7 @@ header .header_bar .right_entry { /* background-color: pink; */ border-radius: 14px; border-color: greenyellow; - border: width 1px; /*边框透明*/ + border-width: 1px; /*边框透明*/ outline:none; /*点击后没边框*/ font-size: 24px; border-radius: 22px; @@ -178,12 +178,14 @@ header .header_bar .right_entry { .body_right { - position: absolute; + /*position: absolute;*/ + position: fixed; display: block; /* width: 100px; height: 100px; */ top: 70px; right: 0; + z-index: 1; /* background-color: #fff; */ /* background: rgba(249, 246, 246, 0.3); */ font-size: 20px; diff --git a/the_online_test_system/login/static/css/myhome6.css b/the_online_test_system/login/static/css/myhome6.css new file mode 100644 index 0000000..e3ac291 --- /dev/null +++ b/the_online_test_system/login/static/css/myhome6.css @@ -0,0 +1,290 @@ +/*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: 24px; + line-height: 1.6; + /* -webkit-text-size-adjust: 100%; */ + -webkit-tap-highlight-color: transparent; + color: #18191c; + background-color: #f6f7f8; + /* min-width: 1100px; */ +} + +.header-bgimg { + /*font-size: 24px;*/ + 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; + font-size: 18px; + +} +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; + /*position: fixed;*/ + width: auto; + width: 100%; + left: -8px; + padding: 0px; + margin: 0px; + top: 60px; + /*padding: 10px;*/ + /* 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;*/ + width: auto; + left: 39%; + top: 20px; + z-index: 1; + + /* height: 600px; */ + /* background-color: pink; */ +} + +.body_center ul { + /* position: absolute; */ + /* top: -200px; + left: 50px; */ + position: relative; + /*width: 190px;*/ + /*height: 30px;*/ + left: 20px; + top: 10%; + display:inline-block; + +} + +.body_center ul li{ + display: inline-block; + 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;*/ + + position: fixed; + + /* position: relative; */ + /* left: 50%; */ + /*display: inline-block;*/ + display: flex; + z-index: 1; + top: 30%; + left: 38%; + /*top: 30px;*/ + /* width: 100px; + height: 100px; */ + /*top: 70px;*/ + /*right: 50%;*/ + /* background-color: #fff;*/ + background: rgba(249, 246, 246, 0.3); + font-size: 20px; + /* margin: 20px */ +} + +.body_right .sign{ + width: auto; +} +.body table { + width: auto; +} + +.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: 60px;*/ + /*height: 30px;*/ + /*left: 130px;*/ + /*background:rgba(0,0,0, 0)*/ + 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; +} + +.body_right table .add .rmb { + position: relative; + left: -3px; +} + +.body_right table .add input{ + position: relative; + margin: 10px; + width: 15px; + top: -1px; + /*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; + margin-left: 100px; + /*background-color:#aedab5;*/ +} + diff --git a/the_online_test_system/login/static/css/style6.css b/the_online_test_system/login/static/css/style6.css new file mode 100644 index 0000000..f022a27 --- /dev/null +++ b/the_online_test_system/login/static/css/style6.css @@ -0,0 +1,100 @@ +/* ============================================================================= + HTML5 CSS Reset Minified - Eric Meyer + ========================================================================== */ + +html,body,div,span,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,abbr,address,cite,code,del,dfn,em,img,ins,kbd,q,samp,small,strong,sub,sup,var,b,i,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,figcaption,figure,footer,header,hgroup,menu,nav,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;outline:0;font-size:100%;vertical-align:baseline;background: #c49b9b00;} +body{line-height:1} +article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block} +nav ul{list-style:none} +blockquote,q{quotes:none} +blockquote:before,blockquote:after,q:before,q:after{content:none} +a{margin:0;padding:0;font-size:100%;vertical-align:baseline;background:transparent;text-decoration:none} +mark{background-color:#ff9;color:#000;font-style:italic;font-weight:bold} +del{text-decoration:line-through} +abbr[title],dfn[title]{border-bottom:1px dotted;cursor:help} +table{border-collapse:collapse;border-spacing:0} +hr{display:block;height:1px;border:0;border-top:1px solid #ccc;margin:1em 0;padding:0} +input,select{vertical-align:middle} +li{list-style:none} + + +/* ============================================================================= + My CSS + ========================================================================== */ + +/* ---- base ---- */ + +html,body{ + width:100%; + height:100%; + background:#111; +} + +html{ + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} + +body{ + font:normal 75% Arial, Helvetica, sans-serif; +} + +canvas{ + display:block; + /* vertical-align:bottom; */ +} + + +/* ---- stats.js ---- */ + +.count-particles{ + background: #000022; + position: absolute; + top: 48px; + left: 0; + width: 80px; + color: #13E8E9; + font-size: .8em; + text-align: left; + text-indent: 4px; + line-height: 14px; + padding-bottom: 2px; + font-family: Helvetica, Arial, sans-serif; + font-weight: bold; +} + +.js-count-particles{ + font-size: 1.1em; +} + +#stats, +.count-particles{ + /* -webkit-user-select: none; */ + margin-top: 5px; + margin-left: 5px; +} + +#stats{ + border-radius: 3px 3px 0 0; + overflow: hidden; +} + +.count-particles{ + border-radius: 0 0 3px 3px; +} + + +/* ---- particles.js container ---- */ + +#particles-js{ + position: fixed; + /* position: absolute; */ + z-index: 1; + width: 100%; + height: 100%; + /* 全屏背景颜色 */ + background-color: rgb(211, 209, 209); + background-image: url(''); + background-size: cover; + background-position: 50% 50%; + background-repeat: no-repeat; +} diff --git a/the_online_test_system/login/static/css/zhuce.css b/the_online_test_system/login/static/css/zhuce.css index ff28232..077290b 100644 --- a/the_online_test_system/login/static/css/zhuce.css +++ b/the_online_test_system/login/static/css/zhuce.css @@ -1,11 +1,17 @@ body { - background-image: url(img/zc3.png); + /*background-image: url(../img/zc3.png);*/ /* background-repeat: repeat-x; */ - position:relative; - background-position-y: -100px; + /*position:relative;*/ + /*background-position-y: -100px;*/ /* background-position-x: 50px; */ /* top: -200px; */ } +#particles-js { + position: fixed; + left: 0%; + top: 0%; +} + div { position:relative; top: 80px; @@ -13,13 +19,22 @@ div { width: 500px; border: 0ch; border: 4px solid aqua; - background-color: rgba(255,255,255,0.6); + /*background-color: rgba(255,255,255,1);*/ + +} +.home { + position: fixed; + z-index: 1; + background: rgba(249, 246, 246, 0.3); + top: 0%; + bottom: 0px; } div h4 { text-align: center; font-size: 36px; font-style: inherit; - font-family:Georgia, 'Times New Roman', Times, serif + font-family:Georgia, 'Times New Roman', Times, serif; + padding-top:35px; } td { position:relative; diff --git a/the_online_test_system/login/static/js/app2.js b/the_online_test_system/login/static/js/app2.js new file mode 100644 index 0000000..eeda77c --- /dev/null +++ b/the_online_test_system/login/static/js/app2.js @@ -0,0 +1,131 @@ +/* ----------------------------------------------- +/* How to use? : Check the GitHub README +/* ----------------------------------------------- */ + +/* To load a config file (particles.json) you need to host this demo (MAMP/WAMP/local)... */ +/* +particlesJS.load('particles-js', 'particles.json', function() { + console.log('particles.js loaded - callback'); +}); +*/ + +/* Otherwise just put the config content (json): */ +particlesJS('particles-js', +{ + "particles": { + "number": { + "value": 80, + "density": { + "enable": true, + "value_area": 250 + } + }, + "color": { + "value": "#000000" + }, + "shape": { + "type": "circle", + "stroke": { + "width": 0, + "color": "#000000" + }, + "polygon": { + "nb_sides": 5 + }, + "image": { + "src": "img/github.svg", + "width": 100, + "height": 100 + } + }, + "opacity": { + "value": 0.5, + "random": false, + "anim": { + "enable": false, + "speed": 1, + "opacity_min": 0.1, + "sync": false + } + }, + "size": { + "value": 5, + "random": true, + "anim": { + "enable": false, + "speed": 40, + "size_min": 0.1, + "sync": false + } + }, + "line_linked": { + "enable": true, + "distance": 150, + "color": "#000000", + "opacity": 0.4, + "width": 1 + }, + "move": { + "enable": true, + "speed": 6, + "direction": "none", + "random": false, + "straight": false, + "out_mode": "out", + "attract": { + "enable": false, + "rotateX": 600, + "rotateY": 1200 + } + } + }, + "interactivity": { + "detect_on": "canvas", + "events": { + "onhover": { + "enable": true, + "mode": "repulse" + }, + "onclick": { + "enable": true, + "mode": "push" + }, + "resize": true + }, + "modes": { + "grab": { + "distance": 400, + "line_linked": { + "opacity": 1 + } + }, + "bubble": { + "distance": 400, + "size": 40, + "duration": 2, + "opacity": 8, + "speed": 3 + }, + "repulse": { + "distance": 200 + }, + "push": { + "particles_nb": 4 + }, + "remove": { + "particles_nb": 2 + } + } + }, + "retina_detect": true, + "config_demo": { + "hide_card": false, + "background_color": "#b61924", + "background_image": "", + "background_position": "50% 50%", + "background_repeat": "no-repeat", + "background_size": "cover" + } +} + +); diff --git a/the_online_test_system/login/static/js/particles.js b/the_online_test_system/login/static/js/particles.js new file mode 100644 index 0000000..325d834 --- /dev/null +++ b/the_online_test_system/login/static/js/particles.js @@ -0,0 +1,1541 @@ +/* ----------------------------------------------- +/* Author : Vincent Garreau - vincentgarreau.com +/* MIT license: http://opensource.org/licenses/MIT +/* Demo / Generator : vincentgarreau.com/particles.js +/* GitHub : github.com/VincentGarreau/particles.js +/* How to use? : Check the GitHub README +/* v2.0.0 +/* ----------------------------------------------- */ + +var pJS = function(tag_id, params){ + + var canvas_el = document.querySelector('#'+tag_id+' > .particles-js-canvas-el'); + + /* particles.js variables with default values */ + this.pJS = { + canvas: { + el: canvas_el, + w: canvas_el.offsetWidth, + h: canvas_el.offsetHeight + }, + particles: { + number: { + value: 400, + density: { + enable: true, + value_area: 800 + } + }, + color: { + value: '#fff' + }, + shape: { + type: 'circle', + stroke: { + width: 0, + color: '#ff0000' + }, + polygon: { + nb_sides: 5 + }, + image: { + src: '', + width: 100, + height: 100 + } + }, + opacity: { + value: 1, + random: false, + anim: { + enable: false, + speed: 2, + opacity_min: 0, + sync: false + } + }, + size: { + value: 20, + random: false, + anim: { + enable: false, + speed: 20, + size_min: 0, + sync: false + } + }, + line_linked: { + enable: true, + distance: 100, + color: '#fff', + opacity: 1, + width: 1 + }, + move: { + enable: true, + speed: 2, + direction: 'none', + random: false, + straight: false, + out_mode: 'out', + bounce: false, + attract: { + enable: false, + rotateX: 3000, + rotateY: 3000 + } + }, + array: [] + }, + interactivity: { + detect_on: 'canvas', + events: { + onhover: { + enable: true, + mode: 'grab' + }, + onclick: { + enable: true, + mode: 'push' + }, + resize: true + }, + modes: { + grab:{ + distance: 100, + line_linked:{ + opacity: 1 + } + }, + bubble:{ + distance: 200, + size: 80, + duration: 0.4 + }, + repulse:{ + distance: 200, + duration: 0.4 + }, + push:{ + particles_nb: 4 + }, + remove:{ + particles_nb: 2 + } + }, + mouse:{} + }, + retina_detect: false, + fn: { + interact: {}, + modes: {}, + vendors:{} + }, + tmp: {} + }; + + var pJS = this.pJS; + + /* params settings */ + if(params){ + Object.deepExtend(pJS, params); + } + + pJS.tmp.obj = { + size_value: pJS.particles.size.value, + size_anim_speed: pJS.particles.size.anim.speed, + move_speed: pJS.particles.move.speed, + line_linked_distance: pJS.particles.line_linked.distance, + line_linked_width: pJS.particles.line_linked.width, + mode_grab_distance: pJS.interactivity.modes.grab.distance, + mode_bubble_distance: pJS.interactivity.modes.bubble.distance, + mode_bubble_size: pJS.interactivity.modes.bubble.size, + mode_repulse_distance: pJS.interactivity.modes.repulse.distance + }; + + + pJS.fn.retinaInit = function(){ + + if(pJS.retina_detect && window.devicePixelRatio > 1){ + pJS.canvas.pxratio = window.devicePixelRatio; + pJS.tmp.retina = true; + } + else{ + pJS.canvas.pxratio = 1; + pJS.tmp.retina = false; + } + + pJS.canvas.w = pJS.canvas.el.offsetWidth * pJS.canvas.pxratio; + pJS.canvas.h = pJS.canvas.el.offsetHeight * pJS.canvas.pxratio; + + pJS.particles.size.value = pJS.tmp.obj.size_value * pJS.canvas.pxratio; + pJS.particles.size.anim.speed = pJS.tmp.obj.size_anim_speed * pJS.canvas.pxratio; + pJS.particles.move.speed = pJS.tmp.obj.move_speed * pJS.canvas.pxratio; + pJS.particles.line_linked.distance = pJS.tmp.obj.line_linked_distance * pJS.canvas.pxratio; + pJS.interactivity.modes.grab.distance = pJS.tmp.obj.mode_grab_distance * pJS.canvas.pxratio; + pJS.interactivity.modes.bubble.distance = pJS.tmp.obj.mode_bubble_distance * pJS.canvas.pxratio; + pJS.particles.line_linked.width = pJS.tmp.obj.line_linked_width * pJS.canvas.pxratio; + pJS.interactivity.modes.bubble.size = pJS.tmp.obj.mode_bubble_size * pJS.canvas.pxratio; + pJS.interactivity.modes.repulse.distance = pJS.tmp.obj.mode_repulse_distance * pJS.canvas.pxratio; + + }; + + + + /* ---------- pJS functions - canvas ------------ */ + + pJS.fn.canvasInit = function(){ + pJS.canvas.ctx = pJS.canvas.el.getContext('2d'); + }; + + pJS.fn.canvasSize = function(){ + + pJS.canvas.el.width = pJS.canvas.w; + pJS.canvas.el.height = pJS.canvas.h; + + if(pJS && pJS.interactivity.events.resize){ + + window.addEventListener('resize', function(){ + + pJS.canvas.w = pJS.canvas.el.offsetWidth; + pJS.canvas.h = pJS.canvas.el.offsetHeight; + + /* resize canvas */ + if(pJS.tmp.retina){ + pJS.canvas.w *= pJS.canvas.pxratio; + pJS.canvas.h *= pJS.canvas.pxratio; + } + + pJS.canvas.el.width = pJS.canvas.w; + pJS.canvas.el.height = pJS.canvas.h; + + /* repaint canvas on anim disabled */ + if(!pJS.particles.move.enable){ + pJS.fn.particlesEmpty(); + pJS.fn.particlesCreate(); + pJS.fn.particlesDraw(); + pJS.fn.vendors.densityAutoParticles(); + } + + /* density particles enabled */ + pJS.fn.vendors.densityAutoParticles(); + + }); + + } + + }; + + + pJS.fn.canvasPaint = function(){ + pJS.canvas.ctx.fillRect(0, 0, pJS.canvas.w, pJS.canvas.h); + }; + + pJS.fn.canvasClear = function(){ + pJS.canvas.ctx.clearRect(0, 0, pJS.canvas.w, pJS.canvas.h); + }; + + + /* --------- pJS functions - particles ----------- */ + + pJS.fn.particle = function(color, opacity, position){ + + /* size */ + this.radius = (pJS.particles.size.random ? Math.random() : 1) * pJS.particles.size.value; + if(pJS.particles.size.anim.enable){ + this.size_status = false; + this.vs = pJS.particles.size.anim.speed / 100; + if(!pJS.particles.size.anim.sync){ + this.vs = this.vs * Math.random(); + } + } + + /* position */ + this.x = position ? position.x : Math.random() * pJS.canvas.w; + this.y = position ? position.y : Math.random() * pJS.canvas.h; + + /* check position - into the canvas */ + if(this.x > pJS.canvas.w - this.radius*2) this.x = this.x - this.radius; + else if(this.x < this.radius*2) this.x = this.x + this.radius; + if(this.y > pJS.canvas.h - this.radius*2) this.y = this.y - this.radius; + else if(this.y < this.radius*2) this.y = this.y + this.radius; + + /* check position - avoid overlap */ + if(pJS.particles.move.bounce){ + pJS.fn.vendors.checkOverlap(this, position); + } + + /* color */ + this.color = {}; + if(typeof(color.value) == 'object'){ + + if(color.value instanceof Array){ + var color_selected = color.value[Math.floor(Math.random() * pJS.particles.color.value.length)]; + this.color.rgb = hexToRgb(color_selected); + }else{ + if(color.value.r != undefined && color.value.g != undefined && color.value.b != undefined){ + this.color.rgb = { + r: color.value.r, + g: color.value.g, + b: color.value.b + } + } + if(color.value.h != undefined && color.value.s != undefined && color.value.l != undefined){ + this.color.hsl = { + h: color.value.h, + s: color.value.s, + l: color.value.l + } + } + } + + } + else if(color.value == 'random'){ + this.color.rgb = { + r: (Math.floor(Math.random() * (255 - 0 + 1)) + 0), + g: (Math.floor(Math.random() * (255 - 0 + 1)) + 0), + b: (Math.floor(Math.random() * (255 - 0 + 1)) + 0) + } + } + else if(typeof(color.value) == 'string'){ + this.color = color; + this.color.rgb = hexToRgb(this.color.value); + } + + /* opacity */ + this.opacity = (pJS.particles.opacity.random ? Math.random() : 1) * pJS.particles.opacity.value; + if(pJS.particles.opacity.anim.enable){ + this.opacity_status = false; + this.vo = pJS.particles.opacity.anim.speed / 100; + if(!pJS.particles.opacity.anim.sync){ + this.vo = this.vo * Math.random(); + } + } + + /* animation - velocity for speed */ + var velbase = {} + switch(pJS.particles.move.direction){ + case 'top': + velbase = { x:0, y:-1 }; + break; + case 'top-right': + velbase = { x:0.5, y:-0.5 }; + break; + case 'right': + velbase = { x:1, y:-0 }; + break; + case 'bottom-right': + velbase = { x:0.5, y:0.5 }; + break; + case 'bottom': + velbase = { x:0, y:1 }; + break; + case 'bottom-left': + velbase = { x:-0.5, y:1 }; + break; + case 'left': + velbase = { x:-1, y:0 }; + break; + case 'top-left': + velbase = { x:-0.5, y:-0.5 }; + break; + default: + velbase = { x:0, y:0 }; + break; + } + + if(pJS.particles.move.straight){ + this.vx = velbase.x; + this.vy = velbase.y; + if(pJS.particles.move.random){ + this.vx = this.vx * (Math.random()); + this.vy = this.vy * (Math.random()); + } + }else{ + this.vx = velbase.x + Math.random()-0.5; + this.vy = velbase.y + Math.random()-0.5; + } + + // var theta = 2.0 * Math.PI * Math.random(); + // this.vx = Math.cos(theta); + // this.vy = Math.sin(theta); + + this.vx_i = this.vx; + this.vy_i = this.vy; + + + + /* if shape is image */ + + var shape_type = pJS.particles.shape.type; + if(typeof(shape_type) == 'object'){ + if(shape_type instanceof Array){ + var shape_selected = shape_type[Math.floor(Math.random() * shape_type.length)]; + this.shape = shape_selected; + } + }else{ + this.shape = shape_type; + } + + if(this.shape == 'image'){ + var sh = pJS.particles.shape; + this.img = { + src: sh.image.src, + ratio: sh.image.width / sh.image.height + } + if(!this.img.ratio) this.img.ratio = 1; + if(pJS.tmp.img_type == 'svg' && pJS.tmp.source_svg != undefined){ + pJS.fn.vendors.createSvgImg(this); + if(pJS.tmp.pushing){ + this.img.loaded = false; + } + } + } + + + + }; + + + pJS.fn.particle.prototype.draw = function() { + + var p = this; + + if(p.radius_bubble != undefined){ + var radius = p.radius_bubble; + }else{ + var radius = p.radius; + } + + if(p.opacity_bubble != undefined){ + var opacity = p.opacity_bubble; + }else{ + var opacity = p.opacity; + } + + if(p.color.rgb){ + var color_value = 'rgba('+p.color.rgb.r+','+p.color.rgb.g+','+p.color.rgb.b+','+opacity+')'; + }else{ + var color_value = 'hsla('+p.color.hsl.h+','+p.color.hsl.s+'%,'+p.color.hsl.l+'%,'+opacity+')'; + } + + pJS.canvas.ctx.fillStyle = color_value; + pJS.canvas.ctx.beginPath(); + + switch(p.shape){ + + case 'circle': + pJS.canvas.ctx.arc(p.x, p.y, radius, 0, Math.PI * 2, false); + break; + + case 'edge': + pJS.canvas.ctx.rect(p.x-radius, p.y-radius, radius*2, radius*2); + break; + + case 'triangle': + pJS.fn.vendors.drawShape(pJS.canvas.ctx, p.x-radius, p.y+radius / 1.66, radius*2, 3, 2); + break; + + case 'polygon': + pJS.fn.vendors.drawShape( + pJS.canvas.ctx, + p.x - radius / (pJS.particles.shape.polygon.nb_sides/3.5), // startX + p.y - radius / (2.66/3.5), // startY + radius*2.66 / (pJS.particles.shape.polygon.nb_sides/3), // sideLength + pJS.particles.shape.polygon.nb_sides, // sideCountNumerator + 1 // sideCountDenominator + ); + break; + + case 'star': + pJS.fn.vendors.drawShape( + pJS.canvas.ctx, + p.x - radius*2 / (pJS.particles.shape.polygon.nb_sides/4), // startX + p.y - radius / (2*2.66/3.5), // startY + radius*2*2.66 / (pJS.particles.shape.polygon.nb_sides/3), // sideLength + pJS.particles.shape.polygon.nb_sides, // sideCountNumerator + 2 // sideCountDenominator + ); + break; + + case 'image': + + function draw(){ + pJS.canvas.ctx.drawImage( + img_obj, + p.x-radius, + p.y-radius, + radius*2, + radius*2 / p.img.ratio + ); + } + + if(pJS.tmp.img_type == 'svg'){ + var img_obj = p.img.obj; + }else{ + var img_obj = pJS.tmp.img_obj; + } + + if(img_obj){ + draw(); + } + + break; + + } + + pJS.canvas.ctx.closePath(); + + if(pJS.particles.shape.stroke.width > 0){ + pJS.canvas.ctx.strokeStyle = pJS.particles.shape.stroke.color; + pJS.canvas.ctx.lineWidth = pJS.particles.shape.stroke.width; + pJS.canvas.ctx.stroke(); + } + + pJS.canvas.ctx.fill(); + + }; + + + pJS.fn.particlesCreate = function(){ + for(var i = 0; i < pJS.particles.number.value; i++) { + pJS.particles.array.push(new pJS.fn.particle(pJS.particles.color, pJS.particles.opacity.value)); + } + }; + + pJS.fn.particlesUpdate = function(){ + + for(var i = 0; i < pJS.particles.array.length; i++){ + + /* the particle */ + var p = pJS.particles.array[i]; + + // var d = ( dx = pJS.interactivity.mouse.click_pos_x - p.x ) * dx + ( dy = pJS.interactivity.mouse.click_pos_y - p.y ) * dy; + // var f = -BANG_SIZE / d; + // if ( d < BANG_SIZE ) { + // var t = Math.atan2( dy, dx ); + // p.vx = f * Math.cos(t); + // p.vy = f * Math.sin(t); + // } + + /* move the particle */ + if(pJS.particles.move.enable){ + var ms = pJS.particles.move.speed/2; + p.x += p.vx * ms; + p.y += p.vy * ms; + } + + /* change opacity status */ + if(pJS.particles.opacity.anim.enable) { + if(p.opacity_status == true) { + if(p.opacity >= pJS.particles.opacity.value) p.opacity_status = false; + p.opacity += p.vo; + }else { + if(p.opacity <= pJS.particles.opacity.anim.opacity_min) p.opacity_status = true; + p.opacity -= p.vo; + } + if(p.opacity < 0) p.opacity = 0; + } + + /* change size */ + if(pJS.particles.size.anim.enable){ + if(p.size_status == true){ + if(p.radius >= pJS.particles.size.value) p.size_status = false; + p.radius += p.vs; + }else{ + if(p.radius <= pJS.particles.size.anim.size_min) p.size_status = true; + p.radius -= p.vs; + } + if(p.radius < 0) p.radius = 0; + } + + /* change particle position if it is out of canvas */ + if(pJS.particles.move.out_mode == 'bounce'){ + var new_pos = { + x_left: p.radius, + x_right: pJS.canvas.w, + y_top: p.radius, + y_bottom: pJS.canvas.h + } + }else{ + var new_pos = { + x_left: -p.radius, + x_right: pJS.canvas.w + p.radius, + y_top: -p.radius, + y_bottom: pJS.canvas.h + p.radius + } + } + + if(p.x - p.radius > pJS.canvas.w){ + p.x = new_pos.x_left; + p.y = Math.random() * pJS.canvas.h; + } + else if(p.x + p.radius < 0){ + p.x = new_pos.x_right; + p.y = Math.random() * pJS.canvas.h; + } + if(p.y - p.radius > pJS.canvas.h){ + p.y = new_pos.y_top; + p.x = Math.random() * pJS.canvas.w; + } + else if(p.y + p.radius < 0){ + p.y = new_pos.y_bottom; + p.x = Math.random() * pJS.canvas.w; + } + + /* out of canvas modes */ + switch(pJS.particles.move.out_mode){ + case 'bounce': + if (p.x + p.radius > pJS.canvas.w) p.vx = -p.vx; + else if (p.x - p.radius < 0) p.vx = -p.vx; + if (p.y + p.radius > pJS.canvas.h) p.vy = -p.vy; + else if (p.y - p.radius < 0) p.vy = -p.vy; + break; + } + + /* events */ + if(isInArray('grab', pJS.interactivity.events.onhover.mode)){ + pJS.fn.modes.grabParticle(p); + } + + if(isInArray('bubble', pJS.interactivity.events.onhover.mode) || isInArray('bubble', pJS.interactivity.events.onclick.mode)){ + pJS.fn.modes.bubbleParticle(p); + } + + if(isInArray('repulse', pJS.interactivity.events.onhover.mode) || isInArray('repulse', pJS.interactivity.events.onclick.mode)){ + pJS.fn.modes.repulseParticle(p); + } + + /* interaction auto between particles */ + if(pJS.particles.line_linked.enable || pJS.particles.move.attract.enable){ + for(var j = i + 1; j < pJS.particles.array.length; j++){ + var p2 = pJS.particles.array[j]; + + /* link particles */ + if(pJS.particles.line_linked.enable){ + pJS.fn.interact.linkParticles(p,p2); + } + + /* attract particles */ + if(pJS.particles.move.attract.enable){ + pJS.fn.interact.attractParticles(p,p2); + } + + /* bounce particles */ + if(pJS.particles.move.bounce){ + pJS.fn.interact.bounceParticles(p,p2); + } + + } + } + + + } + + }; + + pJS.fn.particlesDraw = function(){ + + /* clear canvas */ + pJS.canvas.ctx.clearRect(0, 0, pJS.canvas.w, pJS.canvas.h); + + /* update each particles param */ + pJS.fn.particlesUpdate(); + + /* draw each particle */ + for(var i = 0; i < pJS.particles.array.length; i++){ + var p = pJS.particles.array[i]; + p.draw(); + } + + }; + + pJS.fn.particlesEmpty = function(){ + pJS.particles.array = []; + }; + + pJS.fn.particlesRefresh = function(){ + + /* init all */ + cancelRequestAnimFrame(pJS.fn.checkAnimFrame); + cancelRequestAnimFrame(pJS.fn.drawAnimFrame); + pJS.tmp.source_svg = undefined; + pJS.tmp.img_obj = undefined; + pJS.tmp.count_svg = 0; + pJS.fn.particlesEmpty(); + pJS.fn.canvasClear(); + + /* restart */ + pJS.fn.vendors.start(); + + }; + + + /* ---------- pJS functions - particles interaction ------------ */ + + pJS.fn.interact.linkParticles = function(p1, p2){ + + var dx = p1.x - p2.x, + dy = p1.y - p2.y, + dist = Math.sqrt(dx*dx + dy*dy); + + /* draw a line between p1 and p2 if the distance between them is under the config distance */ + if(dist <= pJS.particles.line_linked.distance){ + + var opacity_line = pJS.particles.line_linked.opacity - (dist / (1/pJS.particles.line_linked.opacity)) / pJS.particles.line_linked.distance; + + if(opacity_line > 0){ + + /* style */ + var color_line = pJS.particles.line_linked.color_rgb_line; + pJS.canvas.ctx.strokeStyle = 'rgba('+color_line.r+','+color_line.g+','+color_line.b+','+opacity_line+')'; + pJS.canvas.ctx.lineWidth = pJS.particles.line_linked.width; + //pJS.canvas.ctx.lineCap = 'round'; /* performance issue */ + + /* path */ + pJS.canvas.ctx.beginPath(); + pJS.canvas.ctx.moveTo(p1.x, p1.y); + pJS.canvas.ctx.lineTo(p2.x, p2.y); + pJS.canvas.ctx.stroke(); + pJS.canvas.ctx.closePath(); + + } + + } + + }; + + + pJS.fn.interact.attractParticles = function(p1, p2){ + + /* condensed particles */ + var dx = p1.x - p2.x, + dy = p1.y - p2.y, + dist = Math.sqrt(dx*dx + dy*dy); + + if(dist <= pJS.particles.line_linked.distance){ + + var ax = dx/(pJS.particles.move.attract.rotateX*1000), + ay = dy/(pJS.particles.move.attract.rotateY*1000); + + p1.vx -= ax; + p1.vy -= ay; + + p2.vx += ax; + p2.vy += ay; + + } + + + } + + + pJS.fn.interact.bounceParticles = function(p1, p2){ + + var dx = p1.x - p2.x, + dy = p1.y - p2.y, + dist = Math.sqrt(dx*dx + dy*dy), + dist_p = p1.radius+p2.radius; + + if(dist <= dist_p){ + p1.vx = -p1.vx; + p1.vy = -p1.vy; + + p2.vx = -p2.vx; + p2.vy = -p2.vy; + } + + } + + + /* ---------- pJS functions - modes events ------------ */ + + pJS.fn.modes.pushParticles = function(nb, pos){ + + pJS.tmp.pushing = true; + + for(var i = 0; i < nb; i++){ + pJS.particles.array.push( + new pJS.fn.particle( + pJS.particles.color, + pJS.particles.opacity.value, + { + 'x': pos ? pos.pos_x : Math.random() * pJS.canvas.w, + 'y': pos ? pos.pos_y : Math.random() * pJS.canvas.h + } + ) + ) + if(i == nb-1){ + if(!pJS.particles.move.enable){ + pJS.fn.particlesDraw(); + } + pJS.tmp.pushing = false; + } + } + + }; + + + pJS.fn.modes.removeParticles = function(nb){ + + pJS.particles.array.splice(0, nb); + if(!pJS.particles.move.enable){ + pJS.fn.particlesDraw(); + } + + }; + + + pJS.fn.modes.bubbleParticle = function(p){ + + /* on hover event */ + if(pJS.interactivity.events.onhover.enable && isInArray('bubble', pJS.interactivity.events.onhover.mode)){ + + var dx_mouse = p.x - pJS.interactivity.mouse.pos_x, + dy_mouse = p.y - pJS.interactivity.mouse.pos_y, + dist_mouse = Math.sqrt(dx_mouse*dx_mouse + dy_mouse*dy_mouse), + ratio = 1 - dist_mouse / pJS.interactivity.modes.bubble.distance; + + function init(){ + p.opacity_bubble = p.opacity; + p.radius_bubble = p.radius; + } + + /* mousemove - check ratio */ + if(dist_mouse <= pJS.interactivity.modes.bubble.distance){ + + if(ratio >= 0 && pJS.interactivity.status == 'mousemove'){ + + /* size */ + if(pJS.interactivity.modes.bubble.size != pJS.particles.size.value){ + + if(pJS.interactivity.modes.bubble.size > pJS.particles.size.value){ + var size = p.radius + (pJS.interactivity.modes.bubble.size*ratio); + if(size >= 0){ + p.radius_bubble = size; + } + }else{ + var dif = p.radius - pJS.interactivity.modes.bubble.size, + size = p.radius - (dif*ratio); + if(size > 0){ + p.radius_bubble = size; + }else{ + p.radius_bubble = 0; + } + } + + } + + /* opacity */ + if(pJS.interactivity.modes.bubble.opacity != pJS.particles.opacity.value){ + + if(pJS.interactivity.modes.bubble.opacity > pJS.particles.opacity.value){ + var opacity = pJS.interactivity.modes.bubble.opacity*ratio; + if(opacity > p.opacity && opacity <= pJS.interactivity.modes.bubble.opacity){ + p.opacity_bubble = opacity; + } + }else{ + var opacity = p.opacity - (pJS.particles.opacity.value-pJS.interactivity.modes.bubble.opacity)*ratio; + if(opacity < p.opacity && opacity >= pJS.interactivity.modes.bubble.opacity){ + p.opacity_bubble = opacity; + } + } + + } + + } + + }else{ + init(); + } + + + /* mouseleave */ + if(pJS.interactivity.status == 'mouseleave'){ + init(); + } + + } + + /* on click event */ + else if(pJS.interactivity.events.onclick.enable && isInArray('bubble', pJS.interactivity.events.onclick.mode)){ + + + if(pJS.tmp.bubble_clicking){ + var dx_mouse = p.x - pJS.interactivity.mouse.click_pos_x, + dy_mouse = p.y - pJS.interactivity.mouse.click_pos_y, + dist_mouse = Math.sqrt(dx_mouse*dx_mouse + dy_mouse*dy_mouse), + time_spent = (new Date().getTime() - pJS.interactivity.mouse.click_time)/1000; + + if(time_spent > pJS.interactivity.modes.bubble.duration){ + pJS.tmp.bubble_duration_end = true; + } + + if(time_spent > pJS.interactivity.modes.bubble.duration*2){ + pJS.tmp.bubble_clicking = false; + pJS.tmp.bubble_duration_end = false; + } + } + + + function process(bubble_param, particles_param, p_obj_bubble, p_obj, id){ + + if(bubble_param != particles_param){ + + if(!pJS.tmp.bubble_duration_end){ + if(dist_mouse <= pJS.interactivity.modes.bubble.distance){ + if(p_obj_bubble != undefined) var obj = p_obj_bubble; + else var obj = p_obj; + if(obj != bubble_param){ + var value = p_obj - (time_spent * (p_obj - bubble_param) / pJS.interactivity.modes.bubble.duration); + if(id == 'size') p.radius_bubble = value; + if(id == 'opacity') p.opacity_bubble = value; + } + }else{ + if(id == 'size') p.radius_bubble = undefined; + if(id == 'opacity') p.opacity_bubble = undefined; + } + }else{ + if(p_obj_bubble != undefined){ + var value_tmp = p_obj - (time_spent * (p_obj - bubble_param) / pJS.interactivity.modes.bubble.duration), + dif = bubble_param - value_tmp; + value = bubble_param + dif; + if(id == 'size') p.radius_bubble = value; + if(id == 'opacity') p.opacity_bubble = value; + } + } + + } + + } + + if(pJS.tmp.bubble_clicking){ + /* size */ + process(pJS.interactivity.modes.bubble.size, pJS.particles.size.value, p.radius_bubble, p.radius, 'size'); + /* opacity */ + process(pJS.interactivity.modes.bubble.opacity, pJS.particles.opacity.value, p.opacity_bubble, p.opacity, 'opacity'); + } + + } + + }; + + + pJS.fn.modes.repulseParticle = function(p){ + + if(pJS.interactivity.events.onhover.enable && isInArray('repulse', pJS.interactivity.events.onhover.mode) && pJS.interactivity.status == 'mousemove') { + + var dx_mouse = p.x - pJS.interactivity.mouse.pos_x, + dy_mouse = p.y - pJS.interactivity.mouse.pos_y, + dist_mouse = Math.sqrt(dx_mouse*dx_mouse + dy_mouse*dy_mouse); + + var normVec = {x: dx_mouse/dist_mouse, y: dy_mouse/dist_mouse}, + repulseRadius = pJS.interactivity.modes.repulse.distance, + velocity = 100, + repulseFactor = clamp((1/repulseRadius)*(-1*Math.pow(dist_mouse/repulseRadius,2)+1)*repulseRadius*velocity, 0, 50); + + var pos = { + x: p.x + normVec.x * repulseFactor, + y: p.y + normVec.y * repulseFactor + } + + if(pJS.particles.move.out_mode == 'bounce'){ + if(pos.x - p.radius > 0 && pos.x + p.radius < pJS.canvas.w) p.x = pos.x; + if(pos.y - p.radius > 0 && pos.y + p.radius < pJS.canvas.h) p.y = pos.y; + }else{ + p.x = pos.x; + p.y = pos.y; + } + + } + + + else if(pJS.interactivity.events.onclick.enable && isInArray('repulse', pJS.interactivity.events.onclick.mode)) { + + if(!pJS.tmp.repulse_finish){ + pJS.tmp.repulse_count++; + if(pJS.tmp.repulse_count == pJS.particles.array.length){ + pJS.tmp.repulse_finish = true; + } + } + + if(pJS.tmp.repulse_clicking){ + + var repulseRadius = Math.pow(pJS.interactivity.modes.repulse.distance/6, 3); + + var dx = pJS.interactivity.mouse.click_pos_x - p.x, + dy = pJS.interactivity.mouse.click_pos_y - p.y, + d = dx*dx + dy*dy; + + var force = -repulseRadius / d * 1; + + function process(){ + + var f = Math.atan2(dy,dx); + p.vx = force * Math.cos(f); + p.vy = force * Math.sin(f); + + if(pJS.particles.move.out_mode == 'bounce'){ + var pos = { + x: p.x + p.vx, + y: p.y + p.vy + } + if (pos.x + p.radius > pJS.canvas.w) p.vx = -p.vx; + else if (pos.x - p.radius < 0) p.vx = -p.vx; + if (pos.y + p.radius > pJS.canvas.h) p.vy = -p.vy; + else if (pos.y - p.radius < 0) p.vy = -p.vy; + } + + } + + // default + if(d <= repulseRadius){ + process(); + } + + // bang - slow motion mode + // if(!pJS.tmp.repulse_finish){ + // if(d <= repulseRadius){ + // process(); + // } + // }else{ + // process(); + // } + + + }else{ + + if(pJS.tmp.repulse_clicking == false){ + + p.vx = p.vx_i; + p.vy = p.vy_i; + + } + + } + + } + + } + + + pJS.fn.modes.grabParticle = function(p){ + + if(pJS.interactivity.events.onhover.enable && pJS.interactivity.status == 'mousemove'){ + + var dx_mouse = p.x - pJS.interactivity.mouse.pos_x, + dy_mouse = p.y - pJS.interactivity.mouse.pos_y, + dist_mouse = Math.sqrt(dx_mouse*dx_mouse + dy_mouse*dy_mouse); + + /* draw a line between the cursor and the particle if the distance between them is under the config distance */ + if(dist_mouse <= pJS.interactivity.modes.grab.distance){ + + var opacity_line = pJS.interactivity.modes.grab.line_linked.opacity - (dist_mouse / (1/pJS.interactivity.modes.grab.line_linked.opacity)) / pJS.interactivity.modes.grab.distance; + + if(opacity_line > 0){ + + /* style */ + var color_line = pJS.particles.line_linked.color_rgb_line; + pJS.canvas.ctx.strokeStyle = 'rgba('+color_line.r+','+color_line.g+','+color_line.b+','+opacity_line+')'; + pJS.canvas.ctx.lineWidth = pJS.particles.line_linked.width; + //pJS.canvas.ctx.lineCap = 'round'; /* performance issue */ + + /* path */ + pJS.canvas.ctx.beginPath(); + pJS.canvas.ctx.moveTo(p.x, p.y); + pJS.canvas.ctx.lineTo(pJS.interactivity.mouse.pos_x, pJS.interactivity.mouse.pos_y); + pJS.canvas.ctx.stroke(); + pJS.canvas.ctx.closePath(); + + } + + } + + } + + }; + + + + /* ---------- pJS functions - vendors ------------ */ + + pJS.fn.vendors.eventsListeners = function(){ + + /* events target element */ + if(pJS.interactivity.detect_on == 'window'){ + pJS.interactivity.el = window; + }else{ + pJS.interactivity.el = pJS.canvas.el; + } + + + /* detect mouse pos - on hover / click event */ + if(pJS.interactivity.events.onhover.enable || pJS.interactivity.events.onclick.enable){ + + /* el on mousemove */ + pJS.interactivity.el.addEventListener('mousemove', function(e){ + + if(pJS.interactivity.el == window){ + var pos_x = e.clientX, + pos_y = e.clientY; + } + else{ + var pos_x = e.offsetX || e.clientX, + pos_y = e.offsetY || e.clientY; + } + + pJS.interactivity.mouse.pos_x = pos_x; + pJS.interactivity.mouse.pos_y = pos_y; + + if(pJS.tmp.retina){ + pJS.interactivity.mouse.pos_x *= pJS.canvas.pxratio; + pJS.interactivity.mouse.pos_y *= pJS.canvas.pxratio; + } + + pJS.interactivity.status = 'mousemove'; + + }); + + /* el on onmouseleave */ + pJS.interactivity.el.addEventListener('mouseleave', function(e){ + + pJS.interactivity.mouse.pos_x = null; + pJS.interactivity.mouse.pos_y = null; + pJS.interactivity.status = 'mouseleave'; + + }); + + } + + /* on click event */ + if(pJS.interactivity.events.onclick.enable){ + + pJS.interactivity.el.addEventListener('click', function(){ + + pJS.interactivity.mouse.click_pos_x = pJS.interactivity.mouse.pos_x; + pJS.interactivity.mouse.click_pos_y = pJS.interactivity.mouse.pos_y; + pJS.interactivity.mouse.click_time = new Date().getTime(); + + if(pJS.interactivity.events.onclick.enable){ + + switch(pJS.interactivity.events.onclick.mode){ + + case 'push': + if(pJS.particles.move.enable){ + pJS.fn.modes.pushParticles(pJS.interactivity.modes.push.particles_nb, pJS.interactivity.mouse); + }else{ + if(pJS.interactivity.modes.push.particles_nb == 1){ + pJS.fn.modes.pushParticles(pJS.interactivity.modes.push.particles_nb, pJS.interactivity.mouse); + } + else if(pJS.interactivity.modes.push.particles_nb > 1){ + pJS.fn.modes.pushParticles(pJS.interactivity.modes.push.particles_nb); + } + } + break; + + case 'remove': + pJS.fn.modes.removeParticles(pJS.interactivity.modes.remove.particles_nb); + break; + + case 'bubble': + pJS.tmp.bubble_clicking = true; + break; + + case 'repulse': + pJS.tmp.repulse_clicking = true; + pJS.tmp.repulse_count = 0; + pJS.tmp.repulse_finish = false; + setTimeout(function(){ + pJS.tmp.repulse_clicking = false; + }, pJS.interactivity.modes.repulse.duration*1000) + break; + + } + + } + + }); + + } + + + }; + + pJS.fn.vendors.densityAutoParticles = function(){ + + if(pJS.particles.number.density.enable){ + + /* calc area */ + var area = pJS.canvas.el.width * pJS.canvas.el.height / 1000; + if(pJS.tmp.retina){ + area = area/(pJS.canvas.pxratio*2); + } + + /* calc number of particles based on density area */ + var nb_particles = area * pJS.particles.number.value / pJS.particles.number.density.value_area; + + /* add or remove X particles */ + var missing_particles = pJS.particles.array.length - nb_particles; + if(missing_particles < 0) pJS.fn.modes.pushParticles(Math.abs(missing_particles)); + else pJS.fn.modes.removeParticles(missing_particles); + + } + + }; + + + pJS.fn.vendors.checkOverlap = function(p1, position){ + for(var i = 0; i < pJS.particles.array.length; i++){ + var p2 = pJS.particles.array[i]; + + var dx = p1.x - p2.x, + dy = p1.y - p2.y, + dist = Math.sqrt(dx*dx + dy*dy); + + if(dist <= p1.radius + p2.radius){ + p1.x = position ? position.x : Math.random() * pJS.canvas.w; + p1.y = position ? position.y : Math.random() * pJS.canvas.h; + pJS.fn.vendors.checkOverlap(p1); + } + } + }; + + + pJS.fn.vendors.createSvgImg = function(p){ + + /* set color to svg element */ + var svgXml = pJS.tmp.source_svg, + rgbHex = /#([0-9A-F]{3,6})/gi, + coloredSvgXml = svgXml.replace(rgbHex, function (m, r, g, b) { + if(p.color.rgb){ + var color_value = 'rgba('+p.color.rgb.r+','+p.color.rgb.g+','+p.color.rgb.b+','+p.opacity+')'; + }else{ + var color_value = 'hsla('+p.color.hsl.h+','+p.color.hsl.s+'%,'+p.color.hsl.l+'%,'+p.opacity+')'; + } + return color_value; + }); + + /* prepare to create img with colored svg */ + var svg = new Blob([coloredSvgXml], {type: 'image/svg+xml;charset=utf-8'}), + DOMURL = window.URL || window.webkitURL || window, + url = DOMURL.createObjectURL(svg); + + /* create particle img obj */ + var img = new Image(); + img.addEventListener('load', function(){ + p.img.obj = img; + p.img.loaded = true; + DOMURL.revokeObjectURL(url); + pJS.tmp.count_svg++; + }); + img.src = url; + + }; + + + pJS.fn.vendors.destroypJS = function(){ + cancelAnimationFrame(pJS.fn.drawAnimFrame); + canvas_el.remove(); + pJSDom = null; + }; + + + pJS.fn.vendors.drawShape = function(c, startX, startY, sideLength, sideCountNumerator, sideCountDenominator){ + + // By Programming Thomas - https://programmingthomas.wordpress.com/2013/04/03/n-sided-shapes/ + var sideCount = sideCountNumerator * sideCountDenominator; + var decimalSides = sideCountNumerator / sideCountDenominator; + var interiorAngleDegrees = (180 * (decimalSides - 2)) / decimalSides; + var interiorAngle = Math.PI - Math.PI * interiorAngleDegrees / 180; // convert to radians + c.save(); + c.beginPath(); + c.translate(startX, startY); + c.moveTo(0,0); + for (var i = 0; i < sideCount; i++) { + c.lineTo(sideLength,0); + c.translate(sideLength,0); + c.rotate(interiorAngle); + } + //c.stroke(); + c.fill(); + c.restore(); + + }; + + pJS.fn.vendors.exportImg = function(){ + window.open(pJS.canvas.el.toDataURL('image/png'), '_blank'); + }; + + + pJS.fn.vendors.loadImg = function(type){ + + pJS.tmp.img_error = undefined; + + if(pJS.particles.shape.image.src != ''){ + + if(type == 'svg'){ + + var xhr = new XMLHttpRequest(); + xhr.open('GET', pJS.particles.shape.image.src); + xhr.onreadystatechange = function (data) { + if(xhr.readyState == 4){ + if(xhr.status == 200){ + pJS.tmp.source_svg = data.currentTarget.response; + pJS.fn.vendors.checkBeforeDraw(); + }else{ + console.log('Error pJS - Image not found'); + pJS.tmp.img_error = true; + } + } + } + xhr.send(); + + }else{ + + var img = new Image(); + img.addEventListener('load', function(){ + pJS.tmp.img_obj = img; + pJS.fn.vendors.checkBeforeDraw(); + }); + img.src = pJS.particles.shape.image.src; + + } + + }else{ + console.log('Error pJS - No image.src'); + pJS.tmp.img_error = true; + } + + }; + + + pJS.fn.vendors.draw = function(){ + + if(pJS.particles.shape.type == 'image'){ + + if(pJS.tmp.img_type == 'svg'){ + + if(pJS.tmp.count_svg >= pJS.particles.number.value){ + pJS.fn.particlesDraw(); + if(!pJS.particles.move.enable) cancelRequestAnimFrame(pJS.fn.drawAnimFrame); + else pJS.fn.drawAnimFrame = requestAnimFrame(pJS.fn.vendors.draw); + }else{ + //console.log('still loading...'); + if(!pJS.tmp.img_error) pJS.fn.drawAnimFrame = requestAnimFrame(pJS.fn.vendors.draw); + } + + }else{ + + if(pJS.tmp.img_obj != undefined){ + pJS.fn.particlesDraw(); + if(!pJS.particles.move.enable) cancelRequestAnimFrame(pJS.fn.drawAnimFrame); + else pJS.fn.drawAnimFrame = requestAnimFrame(pJS.fn.vendors.draw); + }else{ + if(!pJS.tmp.img_error) pJS.fn.drawAnimFrame = requestAnimFrame(pJS.fn.vendors.draw); + } + + } + + }else{ + pJS.fn.particlesDraw(); + if(!pJS.particles.move.enable) cancelRequestAnimFrame(pJS.fn.drawAnimFrame); + else pJS.fn.drawAnimFrame = requestAnimFrame(pJS.fn.vendors.draw); + } + + }; + + + pJS.fn.vendors.checkBeforeDraw = function(){ + + // if shape is image + if(pJS.particles.shape.type == 'image'){ + + if(pJS.tmp.img_type == 'svg' && pJS.tmp.source_svg == undefined){ + pJS.tmp.checkAnimFrame = requestAnimFrame(check); + }else{ + //console.log('images loaded! cancel check'); + cancelRequestAnimFrame(pJS.tmp.checkAnimFrame); + if(!pJS.tmp.img_error){ + pJS.fn.vendors.init(); + pJS.fn.vendors.draw(); + } + + } + + }else{ + pJS.fn.vendors.init(); + pJS.fn.vendors.draw(); + } + + }; + + + pJS.fn.vendors.init = function(){ + + /* init canvas + particles */ + pJS.fn.retinaInit(); + pJS.fn.canvasInit(); + pJS.fn.canvasSize(); + pJS.fn.canvasPaint(); + pJS.fn.particlesCreate(); + pJS.fn.vendors.densityAutoParticles(); + + /* particles.line_linked - convert hex colors to rgb */ + pJS.particles.line_linked.color_rgb_line = hexToRgb(pJS.particles.line_linked.color); + + }; + + + pJS.fn.vendors.start = function(){ + + if(isInArray('image', pJS.particles.shape.type)){ + pJS.tmp.img_type = pJS.particles.shape.image.src.substr(pJS.particles.shape.image.src.length - 3); + pJS.fn.vendors.loadImg(pJS.tmp.img_type); + }else{ + pJS.fn.vendors.checkBeforeDraw(); + } + + }; + + + + + /* ---------- pJS - start ------------ */ + + + pJS.fn.vendors.eventsListeners(); + + pJS.fn.vendors.start(); + + + +}; + +/* ---------- global functions - vendors ------------ */ + +Object.deepExtend = function(destination, source) { + for (var property in source) { + if (source[property] && source[property].constructor && + source[property].constructor === Object) { + destination[property] = destination[property] || {}; + arguments.callee(destination[property], source[property]); + } else { + destination[property] = source[property]; + } + } + return destination; +}; + +window.requestAnimFrame = (function(){ + return window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + window.oRequestAnimationFrame || + window.msRequestAnimationFrame || + function(callback){ + window.setTimeout(callback, 1000 / 60); + }; +})(); + +window.cancelRequestAnimFrame = ( function() { + return window.cancelAnimationFrame || + window.webkitCancelRequestAnimationFrame || + window.mozCancelRequestAnimationFrame || + window.oCancelRequestAnimationFrame || + window.msCancelRequestAnimationFrame || + clearTimeout +} )(); + +function hexToRgb(hex){ + // By Tim Down - http://stackoverflow.com/a/5624139/3493650 + // Expand shorthand form (e.g. "03F") to full form (e.g. "0033FF") + var shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i; + hex = hex.replace(shorthandRegex, function(m, r, g, b) { + return r + r + g + g + b + b; + }); + var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex); + return result ? { + r: parseInt(result[1], 16), + g: parseInt(result[2], 16), + b: parseInt(result[3], 16) + } : null; +}; + +function clamp(number, min, max) { + return Math.min(Math.max(number, min), max); +}; + +function isInArray(value, array) { + return array.indexOf(value) > -1; +} + + +/* ---------- particles.js functions - start ------------ */ + +window.pJSDom = []; + +window.particlesJS = function(tag_id, params){ + + //console.log(params); + + /* no string id? so it's object params, and set the id with default id */ + if(typeof(tag_id) != 'string'){ + params = tag_id; + tag_id = 'particles-js'; + } + + /* no id? set the id to default id */ + if(!tag_id){ + tag_id = 'particles-js'; + } + + /* pJS elements */ + var pJS_tag = document.getElementById(tag_id), + pJS_canvas_class = 'particles-js-canvas-el', + exist_canvas = pJS_tag.getElementsByClassName(pJS_canvas_class); + + /* remove canvas if exists into the pJS target tag */ + if(exist_canvas.length){ + while(exist_canvas.length > 0){ + pJS_tag.removeChild(exist_canvas[0]); + } + } + + /* create canvas element */ + var canvas_el = document.createElement('canvas'); + canvas_el.className = pJS_canvas_class; + + /* set size canvas */ + canvas_el.style.width = "100%"; + canvas_el.style.height = "100%"; + + /* append canvas */ + var canvas = document.getElementById(tag_id).appendChild(canvas_el); + + /* launch particle.js */ + if(canvas != null){ + pJSDom.push(new pJS(tag_id, params)); + } + +}; + +window.particlesJS.load = function(tag_id, path_config_json, callback){ + + /* load json config */ + var xhr = new XMLHttpRequest(); + xhr.open('GET', path_config_json); + xhr.onreadystatechange = function (data) { + if(xhr.readyState == 4){ + if(xhr.status == 200){ + var params = JSON.parse(data.currentTarget.response); + window.particlesJS(tag_id, params); + if(callback) callback(); + }else{ + console.log('Error pJS - XMLHttpRequest status: '+xhr.status); + console.log('Error pJS - File config not found'); + } + } + }; + xhr.send(); + +}; \ No newline at end of file diff --git a/the_online_test_system/login/static/js/particles.min.js b/the_online_test_system/login/static/js/particles.min.js new file mode 100644 index 0000000..b3d46d1 --- /dev/null +++ b/the_online_test_system/login/static/js/particles.min.js @@ -0,0 +1,9 @@ +/* ----------------------------------------------- +/* Author : Vincent Garreau - vincentgarreau.com +/* MIT license: http://opensource.org/licenses/MIT +/* Demo / Generator : vincentgarreau.com/particles.js +/* GitHub : github.com/VincentGarreau/particles.js +/* How to use? : Check the GitHub README +/* v2.0.0 +/* ----------------------------------------------- */ +function hexToRgb(e){var a=/^#?([a-f\d])([a-f\d])([a-f\d])$/i;e=e.replace(a,function(e,a,t,i){return a+a+t+t+i+i});var t=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);return t?{r:parseInt(t[1],16),g:parseInt(t[2],16),b:parseInt(t[3],16)}:null}function clamp(e,a,t){return Math.min(Math.max(e,a),t)}function isInArray(e,a){return a.indexOf(e)>-1}var pJS=function(e,a){var t=document.querySelector("#"+e+" > .particles-js-canvas-el");this.pJS={canvas:{el:t,w:t.offsetWidth,h:t.offsetHeight},particles:{number:{value:400,density:{enable:!0,value_area:800}},color:{value:"#fff"},shape:{type:"circle",stroke:{width:0,color:"#ff0000"},polygon:{nb_sides:5},image:{src:"",width:100,height:100}},opacity:{value:1,random:!1,anim:{enable:!1,speed:2,opacity_min:0,sync:!1}},size:{value:20,random:!1,anim:{enable:!1,speed:20,size_min:0,sync:!1}},line_linked:{enable:!0,distance:100,color:"#fff",opacity:1,width:1},move:{enable:!0,speed:2,direction:"none",random:!1,straight:!1,out_mode:"out",bounce:!1,attract:{enable:!1,rotateX:3e3,rotateY:3e3}},array:[]},interactivity:{detect_on:"canvas",events:{onhover:{enable:!0,mode:"grab"},onclick:{enable:!0,mode:"push"},resize:!0},modes:{grab:{distance:100,line_linked:{opacity:1}},bubble:{distance:200,size:80,duration:.4},repulse:{distance:200,duration:.4},push:{particles_nb:4},remove:{particles_nb:2}},mouse:{}},retina_detect:!1,fn:{interact:{},modes:{},vendors:{}},tmp:{}};var i=this.pJS;a&&Object.deepExtend(i,a),i.tmp.obj={size_value:i.particles.size.value,size_anim_speed:i.particles.size.anim.speed,move_speed:i.particles.move.speed,line_linked_distance:i.particles.line_linked.distance,line_linked_width:i.particles.line_linked.width,mode_grab_distance:i.interactivity.modes.grab.distance,mode_bubble_distance:i.interactivity.modes.bubble.distance,mode_bubble_size:i.interactivity.modes.bubble.size,mode_repulse_distance:i.interactivity.modes.repulse.distance},i.fn.retinaInit=function(){i.retina_detect&&window.devicePixelRatio>1?(i.canvas.pxratio=window.devicePixelRatio,i.tmp.retina=!0):(i.canvas.pxratio=1,i.tmp.retina=!1),i.canvas.w=i.canvas.el.offsetWidth*i.canvas.pxratio,i.canvas.h=i.canvas.el.offsetHeight*i.canvas.pxratio,i.particles.size.value=i.tmp.obj.size_value*i.canvas.pxratio,i.particles.size.anim.speed=i.tmp.obj.size_anim_speed*i.canvas.pxratio,i.particles.move.speed=i.tmp.obj.move_speed*i.canvas.pxratio,i.particles.line_linked.distance=i.tmp.obj.line_linked_distance*i.canvas.pxratio,i.interactivity.modes.grab.distance=i.tmp.obj.mode_grab_distance*i.canvas.pxratio,i.interactivity.modes.bubble.distance=i.tmp.obj.mode_bubble_distance*i.canvas.pxratio,i.particles.line_linked.width=i.tmp.obj.line_linked_width*i.canvas.pxratio,i.interactivity.modes.bubble.size=i.tmp.obj.mode_bubble_size*i.canvas.pxratio,i.interactivity.modes.repulse.distance=i.tmp.obj.mode_repulse_distance*i.canvas.pxratio},i.fn.canvasInit=function(){i.canvas.ctx=i.canvas.el.getContext("2d")},i.fn.canvasSize=function(){i.canvas.el.width=i.canvas.w,i.canvas.el.height=i.canvas.h,i&&i.interactivity.events.resize&&window.addEventListener("resize",function(){i.canvas.w=i.canvas.el.offsetWidth,i.canvas.h=i.canvas.el.offsetHeight,i.tmp.retina&&(i.canvas.w*=i.canvas.pxratio,i.canvas.h*=i.canvas.pxratio),i.canvas.el.width=i.canvas.w,i.canvas.el.height=i.canvas.h,i.particles.move.enable||(i.fn.particlesEmpty(),i.fn.particlesCreate(),i.fn.particlesDraw(),i.fn.vendors.densityAutoParticles()),i.fn.vendors.densityAutoParticles()})},i.fn.canvasPaint=function(){i.canvas.ctx.fillRect(0,0,i.canvas.w,i.canvas.h)},i.fn.canvasClear=function(){i.canvas.ctx.clearRect(0,0,i.canvas.w,i.canvas.h)},i.fn.particle=function(e,a,t){if(this.radius=(i.particles.size.random?Math.random():1)*i.particles.size.value,i.particles.size.anim.enable&&(this.size_status=!1,this.vs=i.particles.size.anim.speed/100,i.particles.size.anim.sync||(this.vs=this.vs*Math.random())),this.x=t?t.x:Math.random()*i.canvas.w,this.y=t?t.y:Math.random()*i.canvas.h,this.x>i.canvas.w-2*this.radius?this.x=this.x-this.radius:this.x<2*this.radius&&(this.x=this.x+this.radius),this.y>i.canvas.h-2*this.radius?this.y=this.y-this.radius:this.y<2*this.radius&&(this.y=this.y+this.radius),i.particles.move.bounce&&i.fn.vendors.checkOverlap(this,t),this.color={},"object"==typeof e.value)if(e.value instanceof Array){var s=e.value[Math.floor(Math.random()*i.particles.color.value.length)];this.color.rgb=hexToRgb(s)}else void 0!=e.value.r&&void 0!=e.value.g&&void 0!=e.value.b&&(this.color.rgb={r:e.value.r,g:e.value.g,b:e.value.b}),void 0!=e.value.h&&void 0!=e.value.s&&void 0!=e.value.l&&(this.color.hsl={h:e.value.h,s:e.value.s,l:e.value.l});else"random"==e.value?this.color.rgb={r:Math.floor(256*Math.random())+0,g:Math.floor(256*Math.random())+0,b:Math.floor(256*Math.random())+0}:"string"==typeof e.value&&(this.color=e,this.color.rgb=hexToRgb(this.color.value));this.opacity=(i.particles.opacity.random?Math.random():1)*i.particles.opacity.value,i.particles.opacity.anim.enable&&(this.opacity_status=!1,this.vo=i.particles.opacity.anim.speed/100,i.particles.opacity.anim.sync||(this.vo=this.vo*Math.random()));var n={};switch(i.particles.move.direction){case"top":n={x:0,y:-1};break;case"top-right":n={x:.5,y:-.5};break;case"right":n={x:1,y:-0};break;case"bottom-right":n={x:.5,y:.5};break;case"bottom":n={x:0,y:1};break;case"bottom-left":n={x:-.5,y:1};break;case"left":n={x:-1,y:0};break;case"top-left":n={x:-.5,y:-.5};break;default:n={x:0,y:0}}i.particles.move.straight?(this.vx=n.x,this.vy=n.y,i.particles.move.random&&(this.vx=this.vx*Math.random(),this.vy=this.vy*Math.random())):(this.vx=n.x+Math.random()-.5,this.vy=n.y+Math.random()-.5),this.vx_i=this.vx,this.vy_i=this.vy;var r=i.particles.shape.type;if("object"==typeof r){if(r instanceof Array){var c=r[Math.floor(Math.random()*r.length)];this.shape=c}}else this.shape=r;if("image"==this.shape){var o=i.particles.shape;this.img={src:o.image.src,ratio:o.image.width/o.image.height},this.img.ratio||(this.img.ratio=1),"svg"==i.tmp.img_type&&void 0!=i.tmp.source_svg&&(i.fn.vendors.createSvgImg(this),i.tmp.pushing&&(this.img.loaded=!1))}},i.fn.particle.prototype.draw=function(){function e(){i.canvas.ctx.drawImage(r,a.x-t,a.y-t,2*t,2*t/a.img.ratio)}var a=this;if(void 0!=a.radius_bubble)var t=a.radius_bubble;else var t=a.radius;if(void 0!=a.opacity_bubble)var s=a.opacity_bubble;else var s=a.opacity;if(a.color.rgb)var n="rgba("+a.color.rgb.r+","+a.color.rgb.g+","+a.color.rgb.b+","+s+")";else var n="hsla("+a.color.hsl.h+","+a.color.hsl.s+"%,"+a.color.hsl.l+"%,"+s+")";switch(i.canvas.ctx.fillStyle=n,i.canvas.ctx.beginPath(),a.shape){case"circle":i.canvas.ctx.arc(a.x,a.y,t,0,2*Math.PI,!1);break;case"edge":i.canvas.ctx.rect(a.x-t,a.y-t,2*t,2*t);break;case"triangle":i.fn.vendors.drawShape(i.canvas.ctx,a.x-t,a.y+t/1.66,2*t,3,2);break;case"polygon":i.fn.vendors.drawShape(i.canvas.ctx,a.x-t/(i.particles.shape.polygon.nb_sides/3.5),a.y-t/.76,2.66*t/(i.particles.shape.polygon.nb_sides/3),i.particles.shape.polygon.nb_sides,1);break;case"star":i.fn.vendors.drawShape(i.canvas.ctx,a.x-2*t/(i.particles.shape.polygon.nb_sides/4),a.y-t/1.52,2*t*2.66/(i.particles.shape.polygon.nb_sides/3),i.particles.shape.polygon.nb_sides,2);break;case"image":if("svg"==i.tmp.img_type)var r=a.img.obj;else var r=i.tmp.img_obj;r&&e()}i.canvas.ctx.closePath(),i.particles.shape.stroke.width>0&&(i.canvas.ctx.strokeStyle=i.particles.shape.stroke.color,i.canvas.ctx.lineWidth=i.particles.shape.stroke.width,i.canvas.ctx.stroke()),i.canvas.ctx.fill()},i.fn.particlesCreate=function(){for(var e=0;e=i.particles.opacity.value&&(a.opacity_status=!1),a.opacity+=a.vo):(a.opacity<=i.particles.opacity.anim.opacity_min&&(a.opacity_status=!0),a.opacity-=a.vo),a.opacity<0&&(a.opacity=0)),i.particles.size.anim.enable&&(1==a.size_status?(a.radius>=i.particles.size.value&&(a.size_status=!1),a.radius+=a.vs):(a.radius<=i.particles.size.anim.size_min&&(a.size_status=!0),a.radius-=a.vs),a.radius<0&&(a.radius=0)),"bounce"==i.particles.move.out_mode)var s={x_left:a.radius,x_right:i.canvas.w,y_top:a.radius,y_bottom:i.canvas.h};else var s={x_left:-a.radius,x_right:i.canvas.w+a.radius,y_top:-a.radius,y_bottom:i.canvas.h+a.radius};switch(a.x-a.radius>i.canvas.w?(a.x=s.x_left,a.y=Math.random()*i.canvas.h):a.x+a.radius<0&&(a.x=s.x_right,a.y=Math.random()*i.canvas.h),a.y-a.radius>i.canvas.h?(a.y=s.y_top,a.x=Math.random()*i.canvas.w):a.y+a.radius<0&&(a.y=s.y_bottom,a.x=Math.random()*i.canvas.w),i.particles.move.out_mode){case"bounce":a.x+a.radius>i.canvas.w?a.vx=-a.vx:a.x-a.radius<0&&(a.vx=-a.vx),a.y+a.radius>i.canvas.h?a.vy=-a.vy:a.y-a.radius<0&&(a.vy=-a.vy)}if(isInArray("grab",i.interactivity.events.onhover.mode)&&i.fn.modes.grabParticle(a),(isInArray("bubble",i.interactivity.events.onhover.mode)||isInArray("bubble",i.interactivity.events.onclick.mode))&&i.fn.modes.bubbleParticle(a),(isInArray("repulse",i.interactivity.events.onhover.mode)||isInArray("repulse",i.interactivity.events.onclick.mode))&&i.fn.modes.repulseParticle(a),i.particles.line_linked.enable||i.particles.move.attract.enable)for(var n=e+1;n0){var c=i.particles.line_linked.color_rgb_line;i.canvas.ctx.strokeStyle="rgba("+c.r+","+c.g+","+c.b+","+r+")",i.canvas.ctx.lineWidth=i.particles.line_linked.width,i.canvas.ctx.beginPath(),i.canvas.ctx.moveTo(e.x,e.y),i.canvas.ctx.lineTo(a.x,a.y),i.canvas.ctx.stroke(),i.canvas.ctx.closePath()}}},i.fn.interact.attractParticles=function(e,a){var t=e.x-a.x,s=e.y-a.y,n=Math.sqrt(t*t+s*s);if(n<=i.particles.line_linked.distance){var r=t/(1e3*i.particles.move.attract.rotateX),c=s/(1e3*i.particles.move.attract.rotateY);e.vx-=r,e.vy-=c,a.vx+=r,a.vy+=c}},i.fn.interact.bounceParticles=function(e,a){var t=e.x-a.x,i=e.y-a.y,s=Math.sqrt(t*t+i*i),n=e.radius+a.radius;n>=s&&(e.vx=-e.vx,e.vy=-e.vy,a.vx=-a.vx,a.vy=-a.vy)},i.fn.modes.pushParticles=function(e,a){i.tmp.pushing=!0;for(var t=0;e>t;t++)i.particles.array.push(new i.fn.particle(i.particles.color,i.particles.opacity.value,{x:a?a.pos_x:Math.random()*i.canvas.w,y:a?a.pos_y:Math.random()*i.canvas.h})),t==e-1&&(i.particles.move.enable||i.fn.particlesDraw(),i.tmp.pushing=!1)},i.fn.modes.removeParticles=function(e){i.particles.array.splice(0,e),i.particles.move.enable||i.fn.particlesDraw()},i.fn.modes.bubbleParticle=function(e){function a(){e.opacity_bubble=e.opacity,e.radius_bubble=e.radius}function t(a,t,s,n,c){if(a!=t)if(i.tmp.bubble_duration_end){if(void 0!=s){var o=n-p*(n-a)/i.interactivity.modes.bubble.duration,l=a-o;d=a+l,"size"==c&&(e.radius_bubble=d),"opacity"==c&&(e.opacity_bubble=d)}}else if(r<=i.interactivity.modes.bubble.distance){if(void 0!=s)var v=s;else var v=n;if(v!=a){var d=n-p*(n-a)/i.interactivity.modes.bubble.duration;"size"==c&&(e.radius_bubble=d),"opacity"==c&&(e.opacity_bubble=d)}}else"size"==c&&(e.radius_bubble=void 0),"opacity"==c&&(e.opacity_bubble=void 0)}if(i.interactivity.events.onhover.enable&&isInArray("bubble",i.interactivity.events.onhover.mode)){var s=e.x-i.interactivity.mouse.pos_x,n=e.y-i.interactivity.mouse.pos_y,r=Math.sqrt(s*s+n*n),c=1-r/i.interactivity.modes.bubble.distance;if(r<=i.interactivity.modes.bubble.distance){if(c>=0&&"mousemove"==i.interactivity.status){if(i.interactivity.modes.bubble.size!=i.particles.size.value)if(i.interactivity.modes.bubble.size>i.particles.size.value){var o=e.radius+i.interactivity.modes.bubble.size*c;o>=0&&(e.radius_bubble=o)}else{var l=e.radius-i.interactivity.modes.bubble.size,o=e.radius-l*c;o>0?e.radius_bubble=o:e.radius_bubble=0}if(i.interactivity.modes.bubble.opacity!=i.particles.opacity.value)if(i.interactivity.modes.bubble.opacity>i.particles.opacity.value){var v=i.interactivity.modes.bubble.opacity*c;v>e.opacity&&v<=i.interactivity.modes.bubble.opacity&&(e.opacity_bubble=v)}else{var v=e.opacity-(i.particles.opacity.value-i.interactivity.modes.bubble.opacity)*c;v=i.interactivity.modes.bubble.opacity&&(e.opacity_bubble=v)}}}else a();"mouseleave"==i.interactivity.status&&a()}else if(i.interactivity.events.onclick.enable&&isInArray("bubble",i.interactivity.events.onclick.mode)){if(i.tmp.bubble_clicking){var s=e.x-i.interactivity.mouse.click_pos_x,n=e.y-i.interactivity.mouse.click_pos_y,r=Math.sqrt(s*s+n*n),p=((new Date).getTime()-i.interactivity.mouse.click_time)/1e3;p>i.interactivity.modes.bubble.duration&&(i.tmp.bubble_duration_end=!0),p>2*i.interactivity.modes.bubble.duration&&(i.tmp.bubble_clicking=!1,i.tmp.bubble_duration_end=!1)}i.tmp.bubble_clicking&&(t(i.interactivity.modes.bubble.size,i.particles.size.value,e.radius_bubble,e.radius,"size"),t(i.interactivity.modes.bubble.opacity,i.particles.opacity.value,e.opacity_bubble,e.opacity,"opacity"))}},i.fn.modes.repulseParticle=function(e){function a(){var a=Math.atan2(d,p);if(e.vx=u*Math.cos(a),e.vy=u*Math.sin(a),"bounce"==i.particles.move.out_mode){var t={x:e.x+e.vx,y:e.y+e.vy};t.x+e.radius>i.canvas.w?e.vx=-e.vx:t.x-e.radius<0&&(e.vx=-e.vx),t.y+e.radius>i.canvas.h?e.vy=-e.vy:t.y-e.radius<0&&(e.vy=-e.vy)}}if(i.interactivity.events.onhover.enable&&isInArray("repulse",i.interactivity.events.onhover.mode)&&"mousemove"==i.interactivity.status){var t=e.x-i.interactivity.mouse.pos_x,s=e.y-i.interactivity.mouse.pos_y,n=Math.sqrt(t*t+s*s),r={x:t/n,y:s/n},c=i.interactivity.modes.repulse.distance,o=100,l=clamp(1/c*(-1*Math.pow(n/c,2)+1)*c*o,0,50),v={x:e.x+r.x*l,y:e.y+r.y*l};"bounce"==i.particles.move.out_mode?(v.x-e.radius>0&&v.x+e.radius0&&v.y+e.radius=m&&a()}else 0==i.tmp.repulse_clicking&&(e.vx=e.vx_i,e.vy=e.vy_i)},i.fn.modes.grabParticle=function(e){if(i.interactivity.events.onhover.enable&&"mousemove"==i.interactivity.status){var a=e.x-i.interactivity.mouse.pos_x,t=e.y-i.interactivity.mouse.pos_y,s=Math.sqrt(a*a+t*t);if(s<=i.interactivity.modes.grab.distance){var n=i.interactivity.modes.grab.line_linked.opacity-s/(1/i.interactivity.modes.grab.line_linked.opacity)/i.interactivity.modes.grab.distance;if(n>0){var r=i.particles.line_linked.color_rgb_line;i.canvas.ctx.strokeStyle="rgba("+r.r+","+r.g+","+r.b+","+n+")",i.canvas.ctx.lineWidth=i.particles.line_linked.width,i.canvas.ctx.beginPath(),i.canvas.ctx.moveTo(e.x,e.y),i.canvas.ctx.lineTo(i.interactivity.mouse.pos_x,i.interactivity.mouse.pos_y),i.canvas.ctx.stroke(),i.canvas.ctx.closePath()}}}},i.fn.vendors.eventsListeners=function(){"window"==i.interactivity.detect_on?i.interactivity.el=window:i.interactivity.el=i.canvas.el,(i.interactivity.events.onhover.enable||i.interactivity.events.onclick.enable)&&(i.interactivity.el.addEventListener("mousemove",function(e){if(i.interactivity.el==window)var a=e.clientX,t=e.clientY;else var a=e.offsetX||e.clientX,t=e.offsetY||e.clientY;i.interactivity.mouse.pos_x=a,i.interactivity.mouse.pos_y=t,i.tmp.retina&&(i.interactivity.mouse.pos_x*=i.canvas.pxratio,i.interactivity.mouse.pos_y*=i.canvas.pxratio),i.interactivity.status="mousemove"}),i.interactivity.el.addEventListener("mouseleave",function(e){i.interactivity.mouse.pos_x=null,i.interactivity.mouse.pos_y=null,i.interactivity.status="mouseleave"})),i.interactivity.events.onclick.enable&&i.interactivity.el.addEventListener("click",function(){if(i.interactivity.mouse.click_pos_x=i.interactivity.mouse.pos_x,i.interactivity.mouse.click_pos_y=i.interactivity.mouse.pos_y,i.interactivity.mouse.click_time=(new Date).getTime(),i.interactivity.events.onclick.enable)switch(i.interactivity.events.onclick.mode){case"push":i.particles.move.enable?i.fn.modes.pushParticles(i.interactivity.modes.push.particles_nb,i.interactivity.mouse):1==i.interactivity.modes.push.particles_nb?i.fn.modes.pushParticles(i.interactivity.modes.push.particles_nb,i.interactivity.mouse):i.interactivity.modes.push.particles_nb>1&&i.fn.modes.pushParticles(i.interactivity.modes.push.particles_nb);break;case"remove":i.fn.modes.removeParticles(i.interactivity.modes.remove.particles_nb);break;case"bubble":i.tmp.bubble_clicking=!0;break;case"repulse":i.tmp.repulse_clicking=!0,i.tmp.repulse_count=0,i.tmp.repulse_finish=!1,setTimeout(function(){i.tmp.repulse_clicking=!1},1e3*i.interactivity.modes.repulse.duration)}})},i.fn.vendors.densityAutoParticles=function(){if(i.particles.number.density.enable){var e=i.canvas.el.width*i.canvas.el.height/1e3;i.tmp.retina&&(e/=2*i.canvas.pxratio);var a=e*i.particles.number.value/i.particles.number.density.value_area,t=i.particles.array.length-a;0>t?i.fn.modes.pushParticles(Math.abs(t)):i.fn.modes.removeParticles(t)}},i.fn.vendors.checkOverlap=function(e,a){for(var t=0;tv;v++)e.lineTo(i,0),e.translate(i,0),e.rotate(l);e.fill(),e.restore()},i.fn.vendors.exportImg=function(){window.open(i.canvas.el.toDataURL("image/png"),"_blank")},i.fn.vendors.loadImg=function(e){if(i.tmp.img_error=void 0,""!=i.particles.shape.image.src)if("svg"==e){var a=new XMLHttpRequest;a.open("GET",i.particles.shape.image.src),a.onreadystatechange=function(e){4==a.readyState&&(200==a.status?(i.tmp.source_svg=e.currentTarget.response,i.fn.vendors.checkBeforeDraw()):(console.log("Error pJS - Image not found"),i.tmp.img_error=!0))},a.send()}else{var t=new Image;t.addEventListener("load",function(){i.tmp.img_obj=t,i.fn.vendors.checkBeforeDraw()}),t.src=i.particles.shape.image.src}else console.log("Error pJS - No image.src"),i.tmp.img_error=!0},i.fn.vendors.draw=function(){"image"==i.particles.shape.type?"svg"==i.tmp.img_type?i.tmp.count_svg>=i.particles.number.value?(i.fn.particlesDraw(),i.particles.move.enable?i.fn.drawAnimFrame=requestAnimFrame(i.fn.vendors.draw):cancelRequestAnimFrame(i.fn.drawAnimFrame)):i.tmp.img_error||(i.fn.drawAnimFrame=requestAnimFrame(i.fn.vendors.draw)):void 0!=i.tmp.img_obj?(i.fn.particlesDraw(),i.particles.move.enable?i.fn.drawAnimFrame=requestAnimFrame(i.fn.vendors.draw):cancelRequestAnimFrame(i.fn.drawAnimFrame)):i.tmp.img_error||(i.fn.drawAnimFrame=requestAnimFrame(i.fn.vendors.draw)):(i.fn.particlesDraw(),i.particles.move.enable?i.fn.drawAnimFrame=requestAnimFrame(i.fn.vendors.draw):cancelRequestAnimFrame(i.fn.drawAnimFrame))},i.fn.vendors.checkBeforeDraw=function(){"image"==i.particles.shape.type?"svg"==i.tmp.img_type&&void 0==i.tmp.source_svg?i.tmp.checkAnimFrame=requestAnimFrame(check):(cancelRequestAnimFrame(i.tmp.checkAnimFrame),i.tmp.img_error||(i.fn.vendors.init(),i.fn.vendors.draw())):(i.fn.vendors.init(),i.fn.vendors.draw())},i.fn.vendors.init=function(){i.fn.retinaInit(),i.fn.canvasInit(),i.fn.canvasSize(),i.fn.canvasPaint(),i.fn.particlesCreate(),i.fn.vendors.densityAutoParticles(),i.particles.line_linked.color_rgb_line=hexToRgb(i.particles.line_linked.color)},i.fn.vendors.start=function(){isInArray("image",i.particles.shape.type)?(i.tmp.img_type=i.particles.shape.image.src.substr(i.particles.shape.image.src.length-3),i.fn.vendors.loadImg(i.tmp.img_type)):i.fn.vendors.checkBeforeDraw()},i.fn.vendors.eventsListeners(),i.fn.vendors.start()};Object.deepExtend=function(e,a){for(var t in a)a[t]&&a[t].constructor&&a[t].constructor===Object?(e[t]=e[t]||{},arguments.callee(e[t],a[t])):e[t]=a[t];return e},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(e){window.setTimeout(e,1e3/60)}}(),window.cancelRequestAnimFrame=function(){return window.cancelAnimationFrame||window.webkitCancelRequestAnimationFrame||window.mozCancelRequestAnimationFrame||window.oCancelRequestAnimationFrame||window.msCancelRequestAnimationFrame||clearTimeout}(),window.pJSDom=[],window.particlesJS=function(e,a){"string"!=typeof e&&(a=e,e="particles-js"),e||(e="particles-js");var t=document.getElementById(e),i="particles-js-canvas-el",s=t.getElementsByClassName(i);if(s.length)for(;s.length>0;)t.removeChild(s[0]);var n=document.createElement("canvas");n.className=i,n.style.width="100%",n.style.height="100%";var r=document.getElementById(e).appendChild(n);null!=r&&pJSDom.push(new pJS(e,a))},window.particlesJS.load=function(e,a,t){var i=new XMLHttpRequest;i.open("GET",a),i.onreadystatechange=function(a){if(4==i.readyState)if(200==i.status){var s=JSON.parse(a.currentTarget.response);window.particlesJS(e,s),t&&t()}else console.log("Error pJS - XMLHttpRequest status: "+i.status),console.log("Error pJS - File config not found")},i.send()}; \ No newline at end of file diff --git a/the_online_test_system/login/templates/laba.html b/the_online_test_system/login/templates/laba.html new file mode 100644 index 0000000..2b93762 --- /dev/null +++ b/the_online_test_system/login/templates/laba.html @@ -0,0 +1,149 @@ +{% load static %} + + + + + ll + + + + + + +{# #} + + + + + +
+ + + + + + + + + +
+ +
+
+ +
+ +
+
+
+ + + 搜索 + +
+
+
+ +
+
+ +
+
+
    +
  • +
  • +
  • +
  • +
+
+ +
+ +
+ {% csrf_token %} + + + + + + + + + + + + + + + + + + + +
+ 账号:   +
+ 密码:   +
+ 验证码: + +
+{# 记住密码#} + + 记住密码 + + 注册 + + +
+ +
+ +
+
+ + +
+ + \ 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 index 719413d..b9a0e15 100644 --- a/the_online_test_system/login/templates/login.html +++ b/the_online_test_system/login/templates/login.html @@ -110,14 +110,7 @@ 密码:   -{# {% if error_msg %}{{ error_msg }}{% endif %}#} - -{# #} -{# #} -{# #} -{# #} -{# #} 验证码: diff --git a/the_online_test_system/login/templates/zhuce.html b/the_online_test_system/login/templates/zhuce.html index e95ab75..905f4e1 100644 --- a/the_online_test_system/login/templates/zhuce.html +++ b/the_online_test_system/login/templates/zhuce.html @@ -8,24 +8,43 @@ 注册页面 + + + +
+ + + + + + + +
{%csrf_token%} -
-

启航题库

+
+

灯塔测试

- - -
- 我是会员,立即登录 + 我是会员,立即登录
diff --git a/the_online_test_system/login/urls.py b/the_online_test_system/login/urls.py index 72aa78f..1a84414 100644 --- a/the_online_test_system/login/urls.py +++ b/the_online_test_system/login/urls.py @@ -9,6 +9,8 @@ urlpatterns = [ path('register/', views.register), + path('home/', views.home, name='home'), + path('login/', views.login, name='login'), path('dologin/', views.dologin, name='dologin'), diff --git a/the_online_test_system/login/views.py b/the_online_test_system/login/views.py index 7341455..356ab77 100644 --- a/the_online_test_system/login/views.py +++ b/the_online_test_system/login/views.py @@ -8,7 +8,7 @@ from login.common import captcha def home(request): - return render(request, 'home.html') + return render(request, 'laba.html') def register(request): @@ -48,37 +48,14 @@ def server_error(request): 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}) + return render(request, 'laba.html', {'username': username, 'pwd': password}) else: - return render(request, 'login.html') + return render(request, 'laba.html') def dologin(request): @@ -93,9 +70,8 @@ def dologin(request): password = request.POST.get('password') rember = request.POST.get('rember') response = HttpResponse() - - temp_RawQuerySet = UserInfo.objects.raw('select * from login_userinfo') - + selectStr = "select * from login_userinfo" + temp_RawQuerySet = UserInfo.objects.raw(selectStr) for temp in temp_RawQuerySet: if temp.username == username and temp.password == password: # ## 存入基本信息到session ## # @@ -103,6 +79,7 @@ def dologin(request): request.session['password'] = password request.session['id_number'] = temp.id_number request.session['name'] = temp.name + request.session['phone'] = temp.phone if rember == 'rember': # 勾选了记住用户名和密码 # 将用户名和密码保存到cookie中 @@ -123,10 +100,10 @@ def dologin(request): response.delete_cookie('username') response.delete_cookie('pwd') error_msg = '用户名或密码错误' - return render(request, 'login.html', {'error_msg1': error_msg}) + return render(request, 'laba.html', {'error_msg1': error_msg}) else: error_msg = '验证码错误' - return render(request, 'login.html', {'error_msg': error_msg}) + return render(request, 'laba.html', {'error_msg': error_msg}) def logout(request): diff --git a/the_online_test_system/student_client/__pycache__/urls.cpython-38.pyc b/the_online_test_system/student_client/__pycache__/urls.cpython-38.pyc new file mode 100644 index 0000000..0bce80e Binary files /dev/null and b/the_online_test_system/student_client/__pycache__/urls.cpython-38.pyc differ diff --git a/the_online_test_system/student_client/__pycache__/views.cpython-38.pyc b/the_online_test_system/student_client/__pycache__/views.cpython-38.pyc new file mode 100644 index 0000000..f598d59 Binary files /dev/null and b/the_online_test_system/student_client/__pycache__/views.cpython-38.pyc differ diff --git a/the_online_test_system/student_client/bbsister.py b/the_online_test_system/student_client/bbsister.py new file mode 100644 index 0000000..189608b --- /dev/null +++ b/the_online_test_system/student_client/bbsister.py @@ -0,0 +1,30 @@ +N = 13 +DAY = 13 +NOW_DAY = 0 +COUNTER = 0 +TEAM = ["A", "B", "C", "D", "E", + "F", "G", "H", "I", "J", + "K", "L"] +NO_CONTEST = [] +DAILY_SCHEDULE = [] + + +def NContest(N): + """判断哪个队伍不需要比赛""" + global COUNTER + NO_CONTEST.append(TEAM[COUNTER]) + if COUNTER+1 == N: + return False + else: + COUNTER += 1 + + +def arrangement(N): + """比赛安排""" + NContest(N) + NO_CONTEST[::-1] + + +if __name__ == '__main__': + a = [1, 2, 3, 4] + print(a[::-1]) \ No newline at end of file diff --git a/the_online_test_system/student_client/common/Ssearch.py b/the_online_test_system/student_client/common/Ssearch.py new file mode 100644 index 0000000..9c4f94d --- /dev/null +++ b/the_online_test_system/student_client/common/Ssearch.py @@ -0,0 +1,37 @@ +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] \ No newline at end of file diff --git a/the_online_test_system/student_client/common/__pycache__/Ssearch.cpython-38.pyc b/the_online_test_system/student_client/common/__pycache__/Ssearch.cpython-38.pyc new file mode 100644 index 0000000..66c6ae7 Binary files /dev/null and b/the_online_test_system/student_client/common/__pycache__/Ssearch.cpython-38.pyc differ diff --git a/the_online_test_system/student_client/static/css/button.css b/the_online_test_system/student_client/static/css/button.css new file mode 100644 index 0000000..195ab24 --- /dev/null +++ b/the_online_test_system/student_client/static/css/button.css @@ -0,0 +1,50 @@ +button { + position: relative; + position: absolute; + bottom: -30px; + padding: 20px; + width: 250px; + height: 35px; + padding: 1.3em 3em; + font-size: 17px; + font-weight: bold; + letter-spacing: 10px; + /* vertical-align:middle; + text-align: center; */ + line-height: 35px; + /* font-weight: bold; */ + /* text-transform: uppercase; */ + letter-spacing: 2.5px; + font-weight: 4px; + color: #000; + background-color: #fff; + border: none; + /* border-bottom-width: 1px; */ + border-style: solid; + border-width: 1px; + border-radius: 45px; + box-shadow: 0px 8px 15px rgba(0, 0, 0, 0.1); + transition: all 0.3s ease 0s; + cursor: pointer; + outline: none; + } + + button:hover { + background-color: #2EE59D; + box-shadow: 0px 15px 20px rgba(46, 229, 157, 0.4); + color: #fff; + transform: translateY(-7px); + } + + button:active { + transform: translateY(-1px); + } +button span { + position: relative; + top: -25px; + height: 35px; + line-height: 50px; +} +.but { + height: 30px; +} \ No newline at end of file diff --git a/the_online_test_system/teacher_client/static/css/css.css b/the_online_test_system/student_client/static/css/css.css similarity index 100% rename from the_online_test_system/teacher_client/static/css/css.css rename to the_online_test_system/student_client/static/css/css.css diff --git a/the_online_test_system/student_client/static/css/henyeqi.css b/the_online_test_system/student_client/static/css/henyeqi.css new file mode 100644 index 0000000..ac7e5aa --- /dev/null +++ b/the_online_test_system/student_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/student_client/static/css/stud.css b/the_online_test_system/student_client/static/css/stud.css new file mode 100644 index 0000000..c4bd9a8 --- /dev/null +++ b/the_online_test_system/student_client/static/css/stud.css @@ -0,0 +1,166 @@ +*{ + margin: 0px; + padding: 0px; +} +body { + /* 全局字体大小 */ + font-size: 18px; + +} +.head { + position: fixed; + width: 100%; + z-index: 100; +} +.page { + display: inline-block; + /*position: fixed;*/ + display: block; + position: fixed; + width: 340px; + left: 8px; + top: 10%; + /* 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; +} + +.target-fix { + position: relative; + top: -80px; + display: block; + height: 0; + /*overflow: hidden;*/ +} +.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(241, 221, 221); + 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; */ + top: 80px; + 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: 400px; + border-style: solid; + border-color: white; + border-bottom-color:black ; + /* 点击后无边框 */ + outline:none; + font-size: 15px; +} +/* .write:hover{ + border-style: solid; + border-color: white; + border-bottom-color:black ; +} */ + +.count-time { + position: fixed; + display:flex; + top: 10px; + width: 300px; + /* left: 1000px; */ +} +.count-time .time1 { + position: fixed; + display:flex; + top: 30px; + line-height:atou; + left: 1220px; + /* left: 20px; */ + z-index: 1px; + background-color: rgba(251,251,251,0); +} +.count-time .imga { + display: flex; + position: fixed; + /* background-image: url(./img/旋转_橙.gif); */ + width: 300px; + left: 1200px; + object-fit: cover; + /* background-color:rgba(red, , , alpha); */ +} + + +.count-time .imga:hover { + + content: url(../img/旋转_2.gif); + +} \ No newline at end of file diff --git a/the_online_test_system/student_client/static/css/stud3.css b/the_online_test_system/student_client/static/css/stud3.css new file mode 100644 index 0000000..a0e7ff6 --- /dev/null +++ b/the_online_test_system/student_client/static/css/stud3.css @@ -0,0 +1,171 @@ +*{ + margin: 0px; + padding: 0px; +} +body { + /* 全局字体大小 */ + font-size: 18px; + /*top: 50px;*/ +} +.head { + position: fixed; + width: 100%; + z-index: 100; +} +.page { + display: inline-block; + /*position: fixed;*/ + display: block; + position: fixed; + width: 340px; + left: 8px; + top: 10%; + /* 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; +} + +.target-fix { + position: relative; + top: -80px; + display: block; + height: 0; + /*overflow: hidden;*/ +} +.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(241,241,241);*/ +/*rgb(246, 224, 224)*/ + background-color:rgb(241,241,241); + border-style: solid; + border-width: 1px; + border-color: aquamarine; + color: black; +} +.page a:hover { + /* 鼠标移动到时的改变颜色 */ + background-color: gray; + /*#5096f5*/ +} + +.line { + + display: inline-block; + position: relative; + top: 10%; + position: fixed; + + left: 368px; + width: 6px; + height: 600px; + border-radius: 6px; + background-color:rgb(129, 122, 122); +} +.test { + display: inline-block; + position: relative; + /*position: absolute;*/ + top: 80px; + /* position: fixed; */ + left: 408px; + height: auto; +} +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: 16px; +} +/* .write:hover{ + border-style: solid; + border-color: white; + border-bottom-color:black ; +} */ + +.count-time { + position: fixed; + display:flex; + top: 7%; + width: 300px; + /* left: 1000px; */ +} +.count-time .time1 { + position: fixed; + display:flex; + top: 10.3%; + line-height: atou; + left: 1220px; + /* left: 20px; */ + z-index: 1px; + background-color: rgba(251,251,251,0); +} +.count-time .imga { + display: flex; + position: fixed; + /* background-image: url(./img/旋转_橙.gif); */ + width: 300px; + left: 1200px; + object-fit: cover; + /* background-color:rgba(red, , , alpha); */ +} + + +.count-time .imga:hover { + + content: url(../img/旋转_2.gif); + +} diff --git a/the_online_test_system/student_client/static/css/teacher.css b/the_online_test_system/student_client/static/css/teacher.css new file mode 100644 index 0000000..c82bf2c --- /dev/null +++ b/the_online_test_system/student_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/student_client/static/img/头哥.png b/the_online_test_system/student_client/static/img/头哥.png new file mode 100644 index 0000000..af644cb Binary files /dev/null and b/the_online_test_system/student_client/static/img/头哥.png differ diff --git a/the_online_test_system/student_client/static/img/旋转_2.gif b/the_online_test_system/student_client/static/img/旋转_2.gif new file mode 100644 index 0000000..382a38d Binary files /dev/null and b/the_online_test_system/student_client/static/img/旋转_2.gif differ diff --git a/the_online_test_system/student_client/static/img/旋转_橙.gif b/the_online_test_system/student_client/static/img/旋转_橙.gif new file mode 100644 index 0000000..f1324c5 Binary files /dev/null and b/the_online_test_system/student_client/static/img/旋转_橙.gif differ diff --git a/the_online_test_system/student_client/static/img/旋转_白.gif b/the_online_test_system/student_client/static/img/旋转_白.gif new file mode 100644 index 0000000..805d39c Binary files /dev/null and b/the_online_test_system/student_client/static/img/旋转_白.gif differ diff --git a/the_online_test_system/student_client/templates/student_client.html b/the_online_test_system/student_client/templates/student_client.html index 65b28be..074060b 100644 --- a/the_online_test_system/student_client/templates/student_client.html +++ b/the_online_test_system/student_client/templates/student_client.html @@ -25,6 +25,33 @@ + + - + - +
- 灯塔测试 + 灯塔测试
diff --git a/the_online_test_system/student_client/templates/test1.html b/the_online_test_system/student_client/templates/test1.html new file mode 100644 index 0000000..fffcde6 --- /dev/null +++ b/the_online_test_system/student_client/templates/test1.html @@ -0,0 +1,237 @@ +{% 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 %} + + + +{# {% 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 %} + +
+ {% if now_time %} +
+ +
考试还剩余:
+
+ {% endif %} +{# #} +{# #} +
+ +
+ + +
+
+
+ + + \ No newline at end of file diff --git a/the_online_test_system/student_client/templates/test2.html b/the_online_test_system/student_client/templates/test2.html new file mode 100644 index 0000000..aeeeec1 --- /dev/null +++ b/the_online_test_system/student_client/templates/test2.html @@ -0,0 +1,213 @@ +{% 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 %} + + + +{# {% 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 %} + +
+ {% if now_time %} +
+ +
考试还剩余:
+
+ {% endif %} + + + + +
+
+ + + + \ No newline at end of file diff --git a/the_online_test_system/student_client/urls.py b/the_online_test_system/student_client/urls.py index 7389497..342a463 100644 --- a/the_online_test_system/student_client/urls.py +++ b/the_online_test_system/student_client/urls.py @@ -6,6 +6,15 @@ app_name = 'student_client' urlpatterns = [ - path("student_client/", views.student_client, name = "student_client") + path('admin/', admin.site.urls), + path("student_client/", views.student_client, name="student_client"), + + path("join_class/", views.join_class, name="join_class"), + + path("test_join/", views.test_join, name="test_join"), + + path("test_client/", views.test_client, name="test_client"), + + path("panti/", views.panti, name="panti"), ] \ 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 index e387e5a..4697038 100644 --- a/the_online_test_system/student_client/views.py +++ b/the_online_test_system/student_client/views.py @@ -1,7 +1,266 @@ -from django.shortcuts import render +from django.shortcuts import render, redirect, HttpResponse +from .common import Ssearch +from teacher_client import models +import time + +total_number = 0 # 总题目数 +ans = [] +single_choice_number = 0 # 单选题题目数 +multiple_choice_number = 0 # 多选题题目数 +gap_filling_number = 0 # 填空题题目数 +single_choice_ans = [] # 单选题标准答案 +multiple_choice_ans = [] # 多选题标准答案 +gap_filling_ans = [] # 填空题标准答案 +right_num = 0 # 正确的题目数量 +wrong_num = 0 # 错误的题目数量 +single_choice = [] # 单选题 +multiple_choice = [] # 多选题 +gap_filling = [] # 填空题 +time_flag = 0 +now_time = 0 +test_time = 0 # 考试时间 +single_choiceT = [] +multiple_choiceT = [] +gap_fillingT = [] def student_client(request): """学生端口""" if request.method == "GET": - return render(request, "student_client.html") \ No newline at end of file + username = request.session.get('username') + password = request.session.get('password') + if username and password: + StudentID = request.session.get('id_number') + StudentName = request.session.get('classcode') + code = [] + Ccode = models.questionBank.objects.raw("select id, classcode from teacher_client_teacherclass") + for temp in Ccode: + code.append(temp.classcode) + selectTcode = "select id, test_code from teacher_client_testquestionbank" + temp_RawQuerySetT = models.teacherClass.objects.raw(selectTcode) + ttcode = [] + for temp in temp_RawQuerySetT: + ttcode.append(temp.test_code) + return render(request, "student_client.html", {"username": username, "code": code, "test_code": ttcode}) + else: + return redirect("http://127.0.0.1:8000/") + + +def join_class(request): + Ccode = request.POST.get("Ccode") + selectCcode = "select id, classcode from teacher_client_teacherclass where classcode = " + '\"'+ Ccode + '\"' + temp_RawQuerySetC = models.teacherClass.objects.raw(selectCcode) + if temp_RawQuerySetC: + flag = True + StudentID = request.session.get('id_number') + StudentPhone = request.session.get('phone') + name = request.session.get('name') + username = request.session.get('username') + models.classTable.objects.create(name=name, id_number=StudentID, phone=StudentPhone, classCode=Ccode) + return render(request, "student_client.html", {"username": username, "flag": flag}) + else: + username = request.session.get('username') + flag = False + return render(request, "student_client.html", {"username": username, "flag": flag}) + + +def test_join(request): + """加入测试""" + if request.method == "GET": + username = request.session.get('username') + password = request.session.get('password') + if username and password: + StudentID= request.session.get('id_number') + StudentName = request.session.get('classcode') + else: + return redirect("http://127.0.0.1:8000/") + + test_code = request.POST.get("testcode") + selectTcode = "select id, test_code from teacher_client_testquestionbank" + temp_RawQuerySetT = models.teacherClass.objects.raw(selectTcode) + ttcode = [] + for temp in temp_RawQuerySetT: + ttcode.append(temp.test_code) + if test_code in ttcode: + request.session['test_code'] = test_code + return redirect("student_client:test_client") + else: + username = request.session.get('username') + return render(request, "student_client.html", {"username": username}) + + +def test_client(request): + """考试页面""" + + if request.method == "GET": + test_code = request.session.get("test_code") + questionSelect = "select id, qus_imfomation, " \ + "qus_A, qus_B, qus_C, qus_D, " \ + "qus_ans," \ + "test_time " \ + "from teacher_client_testquestionbank " \ + "where test_code = " + str(test_code) + temp_RawQuerySetquestion = models.questionBank.objects.raw(questionSelect) + global ans, single_choice_ans, multiple_choice_ans, gap_filling_ans + global single_choice, multiple_choice, gap_filling, test_time + global single_choiceT, multiple_choiceT, gap_fillingT + single_choiceT = [] + multiple_choiceT = [] + gap_fillingT = [] + for temp in temp_RawQuerySetquestion: + temp_testtime = temp.test_time + test_time = temp_testtime + if temp.qus_ans is None: + gap_filling.append(temp) + gap_fillingT.append(temp) + gap_filling_ans.append(temp.qus_A) + elif len(temp.qus_ans) == 1: + single_choice.append(temp) + single_choiceT.append(temp) + single_choice_ans.append(temp.qus_ans) + else: + multiple_choice.append(temp) + multiple_choiceT.append(temp) + multiple_choice_ans.append(temp.qus_ans) + global total_number, single_choice_number, multiple_choice_number, gap_filling_number + 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) + + global time_flag, now_time + if ":" in test_time: + ttime = test_time.split(":") + else: + ttime = test_time.split(":") + + hour = int(ttime[0]) + min = int(ttime[1]) + second = hour * 60 * 60 + min * 60 + if time_flag == 0: + now_time = time.time() + second + time_flag = 1 + username = request.session.get("username") + return render(request, "test1.html", {"total_num": total_number, + "total_list": total_list, + "single_choice": single_choiceT, + "multiple_choice": multiple_choiceT, + "gap_filling": gap_fillingT, + "test_time": temp_testtime, + 'now_time': now_time, + "single_choice_number": single_choice_number, + "multiple_choice_number": multiple_choice_number, + "gap_filling_number": gap_filling_number, + "username": username + }) + else: + single_choice_answer = [] # 用户输入的单选题答案 + multiple_choice_answer = [] # 用户输入的多选题答案 + gap_filling_answer = [] # 用户输入的填空题答案 + for temp in range(total_number): + pass + # 获取前端传递的单选题答案 + for temp in range(1, single_choice_number + 1): + single_str = "choose" + str(temp) + temp_single_choice_answer = request.POST.get(single_str) + single_choice_answer.append(temp_single_choice_answer) + # 获取前端传递的多选题答案 + for temp in range(1, multiple_choice_number + 1): + multiple_str = "chooseA" + str(temp) + temp_multiple_choice_answer = request.POST.getlist(multiple_str) + multiple_choice_answer.append(temp_multiple_choice_answer) + # 获取前端传递的填空题答案 + for temp in range(1, gap_filling_number + 1): + gap_filling_str = "chooseB" + str(temp) + temp_gap_filling_answer = request.POST.getlist(gap_filling_str) + gap_filling_answer.append(temp_gap_filling_answer) + + # 开始判题 + global wrong_num, right_num + wrong_num = 0 + right_num = 0 # 初始化 + # 判断单选题 ans:标准答案 answer:用户答案 + for ans, answer in zip(single_choice_ans, single_choice_answer): + if answer == ans: + right_num += 1 + else: + wrong_num += 1 + # 判断多选题 ans:标准答案 answer:用户答案 + for ans, answer in zip(multiple_choice_ans, multiple_choice_answer): + answer_str = "" + for temp_answer in answer: + answer_str += temp_answer + if answer_str == ans: + right_num += 1 + else: + wrong_num += 1 + # 判断填空题 ans:标准答案 answer:用户答案 + for ans, answer in zip(gap_filling_ans, gap_filling_answer): + ans_str = ans.split(";") + print("ans_str", ans_str) + print("用户答案", answer) + if answer[0] in ans_str: + right_num += 1 + else: + wrong_num += 1 + username = request.session.get("username") + return render(request, "test2.html", {"single_choice": single_choiceT, + "multiple_choice": multiple_choiceT, + "gap_filling": gap_fillingT, + "right_num": right_num, + "wrong_num": wrong_num, + "username": username, + }) + + +def panti(request): + single_choice_answer = [] # 用户输入的单选题答案 + multiple_choice_answer = [] # 用户输入的多选题答案 + gap_filling_answer = [] # 用户输入的填空题答案 + for temp in range(total_number): + pass + # 获取前端传递的单选题答案 + for temp in range(1, single_choice_number+1): + single_str = "choose" + str(temp) + temp_single_choice_answer = request.POST.get(single_str) + single_choice_answer.append(temp_single_choice_answer) + # 获取前端传递的多选题答案 + for temp in range(1, multiple_choice_number+1): + multiple_str = "chooseA" + str(temp) + temp_multiple_choice_answer = request.POST.getlist(multiple_str) + multiple_choice_answer.append(temp_multiple_choice_answer) + # 获取前端传递的填空题答案 + for temp in range(1, gap_filling_number+1): + gap_filling_str = "chooseB" + str(temp) + temp_gap_filling_answer = request.POST.getlist(gap_filling_str) + gap_filling_answer.append(temp_gap_filling_answer) + + # 开始判题 + global wrong_num, right_num + wrong_num = 0 + right_num = 0 # 初始化 + # 判断单选题 ans:标准答案 answer:用户答案 + for ans, answer in zip(single_choice_ans, single_choice_answer): + if answer == ans: + right_num += 1 + else: + wrong_num += 1 + # 判断多选题 ans:标准答案 answer:用户答案 + for ans, answer in zip(multiple_choice_ans, multiple_choice_answer): + answer_str = "" + for temp_answer in answer: + answer_str += temp_answer + if answer_str == ans: + right_num += 1 + else: + wrong_num += 1 + # 判断填空题 ans:标准答案 answer:用户答案 + for ans, answer in zip(gap_filling_ans, gap_filling_answer): + ans_str = ans.split(";") + print("ans_str", ans_str) + print("用户答案", answer) + if answer[0] in ans_str: + right_num += 1 + else: + wrong_num += 1 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 index b535b5e..721ece8 100644 Binary files a/the_online_test_system/teacher_client/__pycache__/admin.cpython-38.pyc and b/the_online_test_system/teacher_client/__pycache__/admin.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 index 69ba35c..1d1ee0f 100644 Binary files a/the_online_test_system/teacher_client/__pycache__/models.cpython-38.pyc and b/the_online_test_system/teacher_client/__pycache__/models.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 index ca67d5e..9d59a6d 100644 Binary files a/the_online_test_system/teacher_client/__pycache__/views.cpython-38.pyc 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 index ea5d68b..03d890e 100644 --- a/the_online_test_system/teacher_client/admin.py +++ b/the_online_test_system/teacher_client/admin.py @@ -1,3 +1,31 @@ from django.contrib import admin +from .models import classTable, teacherClass, questionBank, testQuestionBank -# Register your models here. + +class classTableAdmin(admin.ModelAdmin): + list_display = ['name', 'id_number', 'phone', 'classCode'] + + list_filter = ['classCode'] + + +class teacherClassAdmin(admin.ModelAdmin): + list_display = ['name', 'id_number', 'classCode', 'classname'] + + list_filter = ['name'] + + +class questionBankAdmin(admin.ModelAdmin): + list_display = ['qus_imfomation', 'qus_A', 'qus_D', 'qus_C', 'qus_D', 'qus_ans', 'que_classcode', 'que_time'] + + +class testQuestionBankAdmin(admin.ModelAdmin): + list_display = ['qus_imfomation', 'qus_A', 'qus_D', 'qus_C', 'qus_D', 'qus_ans', 'test_code', 'test_time'] + + +admin.site.register(classTable, classTableAdmin) + +admin.site.register(teacherClass, teacherClassAdmin) + +admin.site.register(questionBank, questionBankAdmin) + +admin.site.register(testQuestionBank, testQuestionBankAdmin) \ No newline at end of file diff --git a/the_online_test_system/teacher_client/models.py b/the_online_test_system/teacher_client/models.py index a08ee1e..e2cc74a 100644 --- a/the_online_test_system/teacher_client/models.py +++ b/the_online_test_system/teacher_client/models.py @@ -1,10 +1,6 @@ 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) @@ -12,6 +8,16 @@ class teacherClass(models.Model): classCode = models.CharField(max_length=20, verbose_name="加课码", default='') classname = models.CharField(max_length=20, verbose_name="课程名", default='') + class Meta: + # 表详细备注 + verbose_name = '教师班级' + + # 设置排序 + ordering = ['id'] + + # 表复数形式 + verbose_name_plural = verbose_name + class classTable(models.Model): """班级表""" @@ -21,6 +27,17 @@ class classTable(models.Model): classCode = models.CharField(max_length=6, verbose_name="加课码", default='') + class Meta: + # 表详细备注 + verbose_name = '班级表' + + # 设置排序 + ordering = ['id'] + + # 表复数形式 + verbose_name_plural = verbose_name + + class questionBank(models.Model): """用于保存用户上传提交的题目""" qus_imfomation = models.CharField(max_length=1000, verbose_name="题目信息", blank=False, null=False) @@ -32,6 +49,16 @@ class questionBank(models.Model): que_classcode = models.CharField(max_length=1000, verbose_name="所属班级", blank=False, null=False) que_time = models.CharField(max_length=200, verbose_name="存入时间", default="") + class Meta: + # 表详细备注 + verbose_name = '题库' + + # 设置排序 + ordering = ['id'] + + # 表复数形式 + verbose_name_plural = verbose_name + class testQuestionBank(models.Model): """考试信息表""" @@ -42,4 +69,14 @@ class testQuestionBank(models.Model): 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 + test_time = models.CharField(max_length=200, verbose_name="考试时间", default='') + + class Meta: + # 表详细备注 + verbose_name = '测试详细信息' + + # 设置排序 + ordering = ['id'] + + # 表复数形式 + verbose_name_plural = verbose_name \ No newline at end of file diff --git a/the_online_test_system/teacher_client/static/css/css1.css b/the_online_test_system/teacher_client/static/css/css1.css new file mode 100644 index 0000000..bb4b9a2 --- /dev/null +++ b/the_online_test_system/teacher_client/static/css/css1.css @@ -0,0 +1,58 @@ +*{ + padding: 0; + margin: 0; + font-size: 20px; +} + +.page { + display: block; + position: relative; + top: 100px; + /*top: 400px;*/ + /*left: 90px;*/ +} +.all{ + /*width: 100%;*/ + /* width: 100px; */ + height: 100vh; + display: flex; + left: 60px; + /* justify-content: center; */ + flex-wrap: wrap; +} +/*偷懒才用的id*/ +#inputs input{ + display: inline-block; + position: relative; + width: 100px; + height: 50px; + background-color: white; + margin: 10px; + left: 90px; + /*top: 100px;*/ +} +.info { + position: relative; + left: 200px; + width: 600px; +} +/*#table{*/ +/* position: relative;*/ +/* !*top: 100px;*!*/ +/* left: 90px;*/ +/* !*left: -60px;*!*/ +/* display: inline-block;*/ +/* width: 600px;*/ +/* !*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/stud.css b/the_online_test_system/teacher_client/static/css/stud1.css similarity index 75% rename from the_online_test_system/teacher_client/static/css/stud.css rename to the_online_test_system/teacher_client/static/css/stud1.css index 9f772b0..320a255 100644 --- a/the_online_test_system/teacher_client/static/css/stud.css +++ b/the_online_test_system/teacher_client/static/css/stud1.css @@ -5,7 +5,12 @@ body { /* 全局字体大小 */ font-size: 18px; - + /*top: 50px;*/ +} +.head { + position: fixed; + width: 100%; + z-index: 100; } .page { display: inline-block; @@ -14,13 +19,13 @@ body { position: fixed; width: 340px; left: 8px; - top: 5px; + top: 10%; /* width: auto; */ height: auto; /*border-style:solid;*/ /*border-width: 2px;*/ /*border-color:aqua;*/ - padding-top: 5px; + /*padding-top: 5px;*/ padding: 5px; /* background-color: red; */ } @@ -50,7 +55,13 @@ body { border-color:aqua; } - +.target-fix { + position: relative; + top: -80px; + display: block; + height: 0; + /*overflow: hidden;*/ +} .page a { display: inline-block; text-decoration: none; @@ -60,14 +71,18 @@ body { width: 50px; height: 50px; margin: 5px; - background-color: rgb(246, 224, 224); + /*background-color: rgb(241,241,241);*/ +/*rgb(246, 224, 224)*/ + background-color:rgb(241,241,241); border-style: solid; border-width: 1px; - border-color: aquamarine + border-color: aquamarine; + color: black; } .page a:hover { /* 鼠标移动到时的改变颜色 */ - background-color: #5096f5; + background-color: gray; + /*#5096f5*/ } .line { @@ -84,11 +99,11 @@ body { .test { display: inline-block; position: relative; + /*position: absolute;*/ + top: 80px; /* position: fixed; */ left: 408px; height: auto; - /* height: 1000px; */ - /* background-color: pink;*/ } ul { list-style-type:armenian; @@ -117,4 +132,6 @@ li { 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 index c82bf2c..fb280cf 100644 --- a/the_online_test_system/teacher_client/static/css/teacher.css +++ b/the_online_test_system/teacher_client/static/css/teacher.css @@ -4,13 +4,21 @@ font-size: 14px; } +.head .af { + position: relative; + left: 100px; + font-size: 24px; + display: inline-block; + border-width: 1px; +} nav { margin: 0; padding: 0; font-size: 14px; } .img { - width: 1488px; + /*width: 1000px;*/ + width: auto; margin: 0; padding: 0; position: relative; diff --git a/the_online_test_system/teacher_client/static/img/头哥.png b/the_online_test_system/teacher_client/static/img/头哥.png new file mode 100644 index 0000000..af644cb Binary files /dev/null and b/the_online_test_system/teacher_client/static/img/头哥.png differ diff --git a/the_online_test_system/teacher_client/templates/111.html b/the_online_test_system/teacher_client/templates/111.html new file mode 100644 index 0000000..7be9237 --- /dev/null +++ b/the_online_test_system/teacher_client/templates/111.html @@ -0,0 +1,260 @@ +{% load static %} + + + + + + + + 教师端口 + + + + + + + + + + + + + + + + + + + + +
+ 灯塔测试 +
+ + +
+
+
    + {% for tempC,tempc in classcode1 %} +
  • + + + +
    + + + + + + + + {% for tempS in student%} + {% if tempS.classcode == tempC %} + + + + + + + {% endif %} + {% endfor %} +
    #学号姓名联系方式
    {{ forloop.counter }}{{ tempS.id_number }}{{ tempS.name }}{{ tempS.phone }}
    + 加课码: {{ tempC }} + +
    +
  • + {% endfor %} +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/the_online_test_system/teacher_client/templates/222.html b/the_online_test_system/teacher_client/templates/222.html new file mode 100644 index 0000000..1b3ab65 --- /dev/null +++ b/the_online_test_system/teacher_client/templates/222.html @@ -0,0 +1,220 @@ +{% load static %} + + + + + + + + +{# #} + CSS实现Tab切换效果 + + + + +{# #} +{# #} +{# #} +{# #} +{# #} +{# #} + + + + + + + + + + + +{#
#} +{# 灯塔测试#} +{#
#} + + + + +
+
+
    + {% for tempC,tempc in classcode1 %} +
  • + + + +
    + + + + + + + + {% for tempS in student%} + {% if tempS.classcode == tempC %} + + + + + + + {% endif %} + {% endfor %} +
    #学号姓名联系方式
    {{ forloop.counter }}{{ tempS.id_number }}{{ tempS.name }}{{ tempS.phone }}
    +
    +
  • + {% endfor %} +
+
+
+ + + + + + \ 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 index 1ef9bd6..62ad6ef 100644 --- a/the_online_test_system/teacher_client/templates/teacher_client.html +++ b/the_online_test_system/teacher_client/templates/teacher_client.html @@ -7,7 +7,7 @@ 教师端口 - +
- 灯塔测试 + 灯塔测试
- +{#
#} +{#
姓名
#} +{#
学号
#} +{#
联系方式
#} +{#
#}
+
@@ -111,12 +116,14 @@
diff --git a/the_online_test_system/teacher_client/templates/teacher_client1.html b/the_online_test_system/teacher_client/templates/teacher_client1.html new file mode 100644 index 0000000..7c5874b --- /dev/null +++ b/the_online_test_system/teacher_client/templates/teacher_client1.html @@ -0,0 +1,45 @@ +{% load static %} + + + + + + Title + + + + + +
+
+
+ {% for temp in classcode %} + {% if temp_RawQuerySetClass.classcode == temp %} + {{ temp_RawQuerySetStudent.name }} + {% endif %} + {% endfor %} +
+ +
+ + +
+ +
+
+ + + + + + + +{# {% if temp_RawQuerySetStudent.classcode = %}#} +{# {% endif %}#} +
姓名学号联系方式操作
+
+ +
+ + + \ 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 index 22123b0..cc3fbe4 100644 --- a/the_online_test_system/teacher_client/templates/test.html +++ b/the_online_test_system/teacher_client/templates/test.html @@ -6,12 +6,102 @@ Title - + + + + + + + + + + + + + -
-
+{##} + +
+ + + + + + +
+ +{#内容页开始#} +
{% if single_choice %} 单选题
@@ -32,25 +122,27 @@ {% endfor %} {% endif %}
+
{% csrf_token %} 时间: 是否决定发布测试?
- + {% if TEST_CODE %} 本场考试的考试码为:{{ TEST_CODE }} {% endif %}
-
+
-
-
+ +
+ @@ -58,7 +150,8 @@ {% if single_choice %} 一、单选

{% for single in single_choice %} -
    + +
    • @@ -74,7 +167,8 @@ {% if multiple_choice %}
      二、多选

      {% for multiple in multiple_choice %} -
        + +
        • @@ -90,7 +184,8 @@ {% if gap_filling %}
          三、填空题

          {% for gap in gap_filling%} -
            + +
            • diff --git a/the_online_test_system/teacher_client/views.py b/the_online_test_system/teacher_client/views.py index e699031..f3d1f6f 100644 --- a/the_online_test_system/teacher_client/views.py +++ b/the_online_test_system/teacher_client/views.py @@ -18,7 +18,6 @@ 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: @@ -45,6 +44,9 @@ def teacher_client(request): str1 = str1 + "'" + temp + "'" + "," str1 = str1.strip(',') str1 += ')' + print("str1: ", str1) + if str1 == "()": + return render(request, '111.html',{"username": username}) select_teacher_client_classtable = 'select id, name, id_number, phone, classcode ' \ 'from teacher_client_classtable ' \ 'where classcode in ' + str1 @@ -53,19 +55,21 @@ def teacher_client(request): Sname = [] Sno = [] Sphone = [] + Sclasscode = [] for ss in temp_RawQuerySetStudent: Sname.append(ss.name) Sno.append(ss.id_number) Sphone.append(ss.phone) + Sclasscode.append(ss.classcode) 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, + res.append([Sname[i], Sno[i], Sphone[i], Sclasscode[i]]) + classcode1 = zip(classcode, classname) + return render(request, '111.html', + {'classname': classname, 'res': res, 'classcode': classcode, "student": temp_RawQuerySetStudent, 'username': username, - "class": temp_RawQuerySetClass}, ) + "class": temp_RawQuerySetClass, "classcode1": classcode1},) else: return redirect("http://127.0.0.1:8000/") @@ -188,16 +192,12 @@ def test_release(request): 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) - + username = request.session.get("username") return render(request, "test.html", {"total_num": total_number, "total_list": total_list, "single_choice": single_choice, @@ -207,7 +207,8 @@ def test_release(request): "TEST_CODE": TEST_CODE, "single_choice_number": single_choice_number, "multiple_choice_number": multiple_choice_number, - "gap_filling_number": gap_filling_number + "gap_filling_number": gap_filling_number, + "username": username, }) # 从前端获取一个考试时间 # @@ -235,21 +236,4 @@ def test_release(request): 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 + return redirect("teacher_client:teacher_client") 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 index e29ae7a..ccba421 100644 Binary files a/the_online_test_system/the_online_test_system/__pycache__/settings.cpython-38.pyc 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 index 4ef0105..a49b3dc 100644 Binary files a/the_online_test_system/the_online_test_system/__pycache__/urls.cpython-38.pyc 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/settings.py b/the_online_test_system/the_online_test_system/settings.py index 72e7312..26166ff 100644 --- a/the_online_test_system/the_online_test_system/settings.py +++ b/the_online_test_system/the_online_test_system/settings.py @@ -38,8 +38,9 @@ INSTALLED_APPS = [ 'django.contrib.messages', 'django.contrib.staticfiles', 'login.apps.LoginConfig', + 'student_client.apps.StudentClientConfig', 'teacher_client.apps.TeacherClientConfig', - 'student_client.apps.StudentClientConfig' + ] MIDDLEWARE = [ diff --git a/the_online_test_system/the_online_test_system/urls.py b/the_online_test_system/the_online_test_system/urls.py index 88e7398..fd0bd27 100644 --- a/the_online_test_system/the_online_test_system/urls.py +++ b/the_online_test_system/the_online_test_system/urls.py @@ -30,6 +30,9 @@ urlpatterns = [ # 教师端口 path('', include("teacher_client.urls")), + + # 学生端口 + path('', include("student_client.urls")) ] handler500 = login.views.server_error \ No newline at end of file