From 7b8079f4beb7fdd5d39ff3bd1379832889536440 Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Thu, 10 Sep 2015 09:16:51 +0800 Subject: [PATCH 1/7] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=88=86=E4=BA=AB?= =?UTF-8?q?=E6=97=B6=E7=94=A8=E6=88=B7=E5=90=8D=E6=98=BE=E7=A4=BA=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- template/src/oj/problem/my_submission.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/template/src/oj/problem/my_submission.html b/template/src/oj/problem/my_submission.html index cb7df85..634c789 100644 --- a/template/src/oj/problem/my_submission.html +++ b/template/src/oj/problem/my_submission.html @@ -71,7 +71,7 @@ {% endif %} {% endifequal %} From fbeb745530afaa2054ae15510e4d3fa95c48c839 Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Thu, 10 Sep 2015 15:35:27 +0800 Subject: [PATCH 2/7] =?UTF-8?q?=E6=AF=94=E8=B5=9B=E6=8E=92=E5=90=8D?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E6=8F=90=E7=A4=BA=E9=94=99=E8=AF=AF=E7=9A=84?= =?UTF-8?q?=E6=AC=A1=E6=95=B0=E5=92=8C=20AC=20=E7=9A=84=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0007_contestsubmission_ac_time.py | 19 +++++++++++++++++++ contest/models.py | 2 ++ contest/views.py | 4 ++-- mq/scripts/info.py | 11 ++++++----- utils/templatetags/submission.py | 10 ++++++++-- 5 files changed, 37 insertions(+), 9 deletions(-) create mode 100644 contest/migrations/0007_contestsubmission_ac_time.py diff --git a/contest/migrations/0007_contestsubmission_ac_time.py b/contest/migrations/0007_contestsubmission_ac_time.py new file mode 100644 index 0000000..d7bc904 --- /dev/null +++ b/contest/migrations/0007_contestsubmission_ac_time.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('contest', '0006_merge'), + ] + + operations = [ + migrations.AddField( + model_name='contestsubmission', + name='ac_time', + field=models.IntegerField(default=0), + ), + ] diff --git a/contest/models.py b/contest/models.py index 338e3b1..be80f9e 100644 --- a/contest/models.py +++ b/contest/models.py @@ -84,6 +84,8 @@ class ContestSubmission(models.Model): total_submission_number = models.IntegerField(default=1) # 这道题是 AC 还是没过 ac = models.BooleanField() + # ac 用时 + ac_time = models.IntegerField(default=0) # 总的时间,用于acm 类型的,也需要保存罚时 total_time = models.IntegerField(default=0) diff --git a/contest/views.py b/contest/views.py index e68b81f..d897b4d 100644 --- a/contest/views.py +++ b/contest/views.py @@ -402,8 +402,8 @@ def _cmp(x, y): def contest_rank_page(request, contest_id): contest = Contest.objects.get(id=contest_id) contest_problems = ContestProblem.objects.filter(contest=contest).order_by("sort_index") - result = ContestSubmission.objects.filter(contest=contest).values("user_id").annotate( - total_submit=Sum("total_submission_number")) + result = ContestSubmission.objects.filter(contest=contest).values("user_id").\ + annotate(total_submit=Sum("total_submission_number")) for i in range(0, len(result)): # 这个人所有的提交 submissions = ContestSubmission.objects.filter(user_id=result[i]["user_id"], contest_id=contest_id) diff --git a/mq/scripts/info.py b/mq/scripts/info.py index 119845c..a3e13b9 100644 --- a/mq/scripts/info.py +++ b/mq/scripts/info.py @@ -60,11 +60,12 @@ class MessageQueue(object): # 避免这道题已经 ac 了,但是又重新提交了一遍 if not contest_submission.ac: # 这种情况是这个题目前处于错误状态,就使用已经存储了的罚时加上这道题的实际用时 - logger.debug(contest.start_time) - logger.debug(submission.create_time) - logger.debug((submission.create_time - contest.start_time).total_seconds()) - logger.debug(int((submission.create_time - contest.start_time).total_seconds() / 60)) - contest_submission.total_time += int((submission.create_time - contest.start_time).total_seconds() / 60) + # logger.debug(contest.start_time) + # logger.debug(submission.create_time) + # logger.debug((submission.create_time - contest.start_time).total_seconds()) + # logger.debug(int((submission.create_time - contest.start_time).total_seconds() / 60)) + contest_submission.ac_time = int((submission.create_time - contest.start_time).total_seconds() / 60) + contest_submission.total_time += contest_submission.ac_time # 标记为已经通过 contest_submission.ac = True # contest problem ac 计数器加1 diff --git a/utils/templatetags/submission.py b/utils/templatetags/submission.py index b1f43d2..2e73417 100644 --- a/utils/templatetags/submission.py +++ b/utils/templatetags/submission.py @@ -33,8 +33,14 @@ def get_contest_submission_problem_detail(contest_problem, my_submission): if contest_problem.id in my_submission: submission = my_submission[contest_problem.id] if submission.ac: - return u"\n 时间: " + str(submission.total_time) + u" min" - return "" + # 只提交了一次就AC + if submission.total_submission_number == 1: + return str(submission.ac_time) + " min" + else: + return "20 min × " + str(submission.total_submission_number - 1) + " WA + " + str(submission.ac_time) + " min" + return str(submission.total_submission_number) + " WA" + else: + return "" def get_submission_problem_result_class(contest_problem, my_submission): From 12b6eae6e85460625a26c75acbc010906cf4578f Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Thu, 10 Sep 2015 15:59:48 +0800 Subject: [PATCH 3/7] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E5=AF=86=E7=A0=81=E7=9A=84=E9=AA=8C=E8=AF=81=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- account/serializers.py | 1 + account/views.py | 4 ++++ oj/urls.py | 1 + static/src/js/app/oj/account/change_password.js | 12 +++++++++++- template/src/oj/account/change_password.html | 8 +++++++- utils/captcha/views.py | 8 ++++++++ 6 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 utils/captcha/views.py diff --git a/account/serializers.py b/account/serializers.py index 179d28d..4cda3ae 100644 --- a/account/serializers.py +++ b/account/serializers.py @@ -27,6 +27,7 @@ class UserRegisterSerializer(serializers.Serializer): class UserChangePasswordSerializer(serializers.Serializer): old_password = serializers.CharField() new_password = serializers.CharField(max_length=30, min_length=6) + captcha = serializers.CharField(max_length=4, min_length=4) class UserSerializer(serializers.ModelSerializer): diff --git a/account/views.py b/account/views.py index 1da8967..1304ded 100644 --- a/account/views.py +++ b/account/views.py @@ -7,6 +7,7 @@ from django.db.models import Q from rest_framework.views import APIView from utils.shortcuts import serializer_invalid_response, error_response, success_response, paginate +from utils.captcha import Captcha from .decorators import login_required from .models import User @@ -79,6 +80,9 @@ class UserChangePasswordAPIView(APIView): serializer = UserChangePasswordSerializer(data=request.data) if serializer.is_valid(): data = serializer.data + captcha = Captcha(request) + if not captcha.check(data["captcha"]): + return error_response(u"验证码错误") username = request.user.username user = auth.authenticate(username=username, password=data["old_password"]) if user: diff --git a/oj/urls.py b/oj/urls.py index a5582d2..8d6e819 100644 --- a/oj/urls.py +++ b/oj/urls.py @@ -112,4 +112,5 @@ urlpatterns = [ url(r'^help/$', TemplateView.as_view(template_name="utils/help.html"), name="help_page"), url(r'^api/submission/share/$', SubmissionShareAPIView.as_view(), name="submission_share_api"), + url(r'^captcha/$', "utils.captcha.views.show_captcha", name="show_captcha"), ] diff --git a/static/src/js/app/oj/account/change_password.js b/static/src/js/app/oj/account/change_password.js index 608114f..a66505d 100644 --- a/static/src/js/app/oj/account/change_password.js +++ b/static/src/js/app/oj/account/change_password.js @@ -1,13 +1,22 @@ require(["jquery", "bsAlert", "csrfToken", "validator"], function ($, bsAlert, csrfTokenHeader) { + function refresh_captcha(){ + this.src = "/captcha/?" + Math.random(); + $("#captcha")[0].value = ""; + } + $("#captcha-img").click(function(){ + refresh_captcha(); + }); + $('form').validator().on('submit', function (e) { e.preventDefault(); var newPassword = $("#new_password ").val(); var password = $("#password").val(); + var captcha = $("#captcha").val(); $.ajax({ beforeSend: csrfTokenHeader, url: "/api/change_password/", - data: {new_password: newPassword, old_password: password}, + data: {new_password: newPassword, old_password: password, captcha: captcha}, dataType: "json", method: "post", success: function (data) { @@ -15,6 +24,7 @@ require(["jquery", "bsAlert", "csrfToken", "validator"], function ($, bsAlert, c window.location.href = "/login/"; } else { + refresh_captcha(); bsAlert(data.data); } } diff --git a/template/src/oj/account/change_password.html b/template/src/oj/account/change_password.html index dad9d14..d8099f5 100644 --- a/template/src/oj/account/change_password.html +++ b/template/src/oj/account/change_password.html @@ -17,7 +17,13 @@
qRl6bPCofrbz6S!7T8>Fw!W{D#*rV+gPMnce{wX>FZ5lL|P;;je?5?VpXHMhz&Aq$Ma(~E%B-kdSxym*d*d7m5Ft_Y*w_ox-FWSW4# zunX+N8!Q7XG6U>DE$f`C@CAGU`WTLTP`7Q@&P^_tuVxuw@KT%&P%Cc5hbyRVZ6(D7 zb6$~(Ad{xJ6@BnWywA4U;GVs?HfwB%R{yHMm*S*J?G4Q9kgolB(hPl5*m|m`Hj!%5 z=KQAZJ`J|NiNXv%J6JzJUTEN}S#9!Ek*8af;Q2dYZ=;8nf<83v{>b@J{|OuiL)SRL zCUk>b-w8Qzbj-lPCae)}33>k`+x(HT+Cu*)$+}UrtRV%;0$~R#uLo(gdlLeK+xc58 z?VX&RFIRP`L=77$sNV=R^&E&b1!m-sc$;<%@0Vq0R@G-w)ZSx{(%i^#(m<3+q8|OZ#tO#5ch$NHVg7~fl0>LM`PV)^S|-??PLJc z2g?Yy51=p3A~&?}^D|~vh5p}xe1YT00T>UyKjkkoQM{}jrOSq+jmU4QvTTZxHKqWW zndg;%MOy+E>(rXJP)qbgbda37^j1;R=1SNbO2WJ{i+vL1ABp9(1pCPudO8#Q`-PuE zL*6m DD1%W=cdhYVSC}qBb+k?JBxENs=@Al%z`<)uTLQ9T8#phtBZ%bqbz_v&^OLv zTM+eogY#s*9oLe4w D(HqwMh`js&GO4ZYW<-|U&}h^nQo9P{_r 71&SL zeZtd8lRck=Zl4H#cEt8x+t3S|L9db#zCf+J5pulI9c{e|LME_IxSL*RNmVPS!bb!j zAJzeyWje_GHpRf+kq(Aaf~+I-frb517cC0K&6ETM)vKeV8ZinAGr|s(D{lD9HHR=K zcp5q(@a*X`6=qI)`k|)- ak1nuy>H__rhHq2dzA@hP>k& zl5aI7u`OTN*0bZ>8vEO$b#!R$u+95fKG@GIkQH9A9gUb1gkheaE*n-v-rKR}{q| Gw~BT6o$$^9O^Eg(zPUNj2zX!DX(E|mH*jpHux-cl zy-p-m=!Z5GZ6w-ghsOOOXnk-V(?#L=VMXUm(pEEphy8@F*Jkh8uuTKzwY)}CUBzSh zt+srOppmrd!-$XDZNwy5cM7QPPgWl<>d;L^S))J$Xj!0zK10=lE@DFzY#UyWG+K5x zNv~NC^8@Gpox46%B+wJ 7Ut7hFQ6y@wRUIR?<%0LYna_$=8}h26scA+_&>D ZtMtJKE#S!$@BKs7x_=F!0j z*bbe^Qr$<)|9fNud!~Vrw#M7N2dk-3LnQ?p6l^1&hL7_x)T*q88f6a!4WQ;Cue)`J zP5h!+p}A$K(@o6ll;CAG@Ye!o?>Rfk^7>~KyyR;NTlE7)totuTZ~7VSFvV>7g<`k< zDjIL|zNn3dDQNgCGJ2`W!zB^eF>bAaV;?l;?c(6>NEduQ|E?dd(^g#1*|~|B4+KJw zr^p5f{F~~g(BP=mG&E){4T&yjL$Ph&mmRT!dIT+?7KRyQmkY77W~eQyrkZIse}El- z`!~};$L=bMwX#l7U&q|@HTGq245KW6@a`OG&a~;y@S{(Ht#`wa(E&1ljo@q3OP`Q+ z>9-WM;Sj}cKSJ?4k5R&|;}oCYj){G|zfi;RxDS7zz?8bAuWAtSeAe$$g+XYJnBMR9 zP~hJMt)++;us Oy<=Id^OuM^`vB>ICpHl~HaQERA=brCf;Os5Rb5folM6}Et! zTC~p719>vQkp_AVQd4>j&NWutLR?}s;+=ZL9?K*N%zt){xNpSLy1_?#)+e$Sc~Aa; z0vCNnQ6C A zt$UHTy9z#=7Qku51IFG?1N@y$@+#4o&ujDjKN*k#-2>mullOO)0Y&K`D{Lv%HT1)r zP(}6YDGS*FcKpRRXrSM4HPx$Y^BG3?nwP*=P@Ut_W#z+bZm@PnY1J9lnGGh2oV|qN zcb~|Y 6BO6L7QBLSN88%~U1p zg6oJGP8&05hzrKF)RO>mFh$NaVxvzW#(pz2dqO_$aln`H9{KHQ+Wz}x+H~p?)%*B2 z;{Anm{GIxc{Sng^kV&p3_sXrnpX2^T-e=kvOU_P%N$+7ID{_C*WJ84=SVu9A`iH#- z{O@iD*s-^N4~ (xvd{1D#nUA{J{mcLN$>-E=lcROFdys|06S331B#~uY&2k# z0r8r2Ap>|m$o!r?R!c9x7e()Wm?*w;W?N_=_VpjBqHg_F6zMNV4HEC4Gt)An*ne7D zKfLY+uvQ57HqJI{yeV?lyA%(eWqeuYkNfTnUC6_J#~+tV#`}48e?USysolaL``Jdz z!xGp>MLkE;rfsJX>ufB-Vp=FE&UZS09P&q6iuqfDtb>>bu#cxT=K6NNF3C5`fENCv zSgyklXtM)Y?oWOpfR=Ahp%uBQv~+7Sy}C4-m<|R#riGtKNysHYT* mG`4*+!Q0#N*8+I zDstO;G5=3`%(mvaw8#PgD{ck8>}<0f`3^br^LalJw%*d?e+lf*Ub{&HzWRe=c>Z@A z`F_WJADyJ|3G?8WSHmXjQV9QNp4lO;y>H(!QmH3BVE!LVm7KHiP5`_sP?j$EpZ)&z zl#kPZ@MZTU1DGDty<1VRx2LcJ*$x;08-TH9{%8E{jr&VBCQ;7JAc_uDu^#vw>k>6w z*Ss`+vbuJYa>k5xi8A`FGy4To%;G(;`C+dE=dSxs(HY>*pG8OiESb%3rx9Gs+GjN8 zeL8`M(EZ?jwPq51@x?K5?K#iwe!$q |AO{fb%aA-_!bg zDh>qJX+d#Ye-`}Bw*4EwUJ&@4ymCY60j7yN^0^)F+k6MN>OuM{CfMX0y8$+k^R?@| zN|!EOqwBCM+O%CL_B}Y=Z^NH$4OP`h3YG;y_74_w0QLp;3V!=OY(U`8Iw0%~3ib-X z98V#90sTg(=;;>&1 7j-(HhMH4_bp6X^CMheC&SaHR%+&gE*`Ff%$xsXiUj zb%@}7#yAag{Lju_5%{nA?c)9MKCTnD IQNY`yv;$)ZouGG-3axBM<9R=cI`>kEx&EZ*?v6jx0n X4nVC8Yo9UswqM7+r|2APze_i6QLit4zd!zG8rb#=1=Vi}`~wTg{}ChB z3jDwP@;J#A{|^7NzR|h|1AnWC12OM&Y`0(Nl6%Gi9p`?I+l+rR%P=x4yr^Ag8~%15 zfSuoO_q}pwD$RHy8f({8$R`dN#^7TB{^vBnF)G-Ah5#?c!JwvHC?0W|Sm4$M{Qt*Q z8~#223I5OlAsw^we18LN^FQeS&Rv!W{Er+tM}Fq%|APE4nE!EpFJsU1{|3nO7#O+Y zzUP1W_{+VhZ6_Q4Q|I2<{ );P|8P>P|{~Z6GZQ4r%yZ3Yp z)p>8Q1V p~u>9}8{~z!_{D@&Ar<1RTnp`V(&&NL|_Idi_kBf8- zGNyH#f5ZMCM^!3yfZsuhJb-4x|HJeDw#Mh~8++RvkokXj0sq4X@a&tRx1awx_yd>@ zmTgU;7MUj0qtPE|Rj+}T*G>JeKX1SCnpn$$+?8z3<&T*9maqXi&bRL5MZu%vzdv*T z@}K>G^FJUztvCFCwe#>F1D!vfHf}s1u0MC~9-CeGk9~fHZ3r*746*K?b2>Q}jAefx z>$~?Y`vv~d>!^{bU%vk57!bz*iu!--eDC ={7FAwGpVH=&O8uKt&F!1=w% zSqi~Ao?`**|K0c#bii@y0lCjM;M+(3ESb-j^}fCF9AMLbDKMik@_zh8T+ZeL8bt#K zt`hhkI&_ADLuNie9gr9QtL6vaPk8>^pY!~NlraA5sQY<)Fnq^Jx_V^w^+ZmviiS@x z&?3ZtmP5WfVtu=9wgHBZ3c-3K^(EvBrYE2#Woh_uJ*ETS|KP;ysm;jG34d~~umgD> znDfI~diC%HVqb7Rrgm(L`wbZo{?sdo|7wu?)4;~-@BwOdlj*b1jtCl KnnBk z{m%u)A_uG)eE(R#nU@2``JJ5mS<={VVf@!p|A>VYstBc|XgT#ArV_E9W!sYPi9OQ; z<3D1ImDiM9!aCJ-w9){-xCegM0`mThumkp)Emn$paV2Qrgz)>+_$Syijj#;Z@FNA* zX-+=y0~go gpB{POG2RiBF3+Yq$ocLS{LVj; z`$G1^|Jy!jGV%a4)VQ&dSoY6f99b;c&-kx$z#r>W)A7EFQiDI _s8`nK`2$N9>%Xm>KpY_Y^^If+3?rR;AYuXi^K1bd4Sf6EN!q*jDES(v{R2HP z7VAexz~>i7ktP!@U$~rxXTC~ZEU*7VzPI^)SoWvrGllP`YhM+Oe5!El?{+fZaUb*l zz`?=n1Nf_9N?LMh@&hv=vR`t_6HoGbk2XOn%`r c7gw{uuL!BexCPr2znYdqzsgnq!4R@IPT+!?>)C+BXnrXHOw@>qV}bUb1h5T zhu_5kg)E_7OKr1E{u%OhZw0sNNzn_o0l%X{Cx~3o;^NNdf%n<3!1F*q1L`)Q9vjzg z(8E6Cd@vCgVE-R%f|BceTP_jPlDcXX@;#K4VQ58D+HIs0hyEnGMYMh4K^mE~{=R8o zC~W>d;crls3i+_!Ueu|liXNYC67k)8Vh*{_=kWah9mIiBWAq#g{ rffU@f4@J#eE%NvUrko?h*do8v)>u#E=?dm|mKiu6yJ9a{ zdyOPNwSoMr`wEN_qZDFojS+eJ>Z%b~zu5-4VFQsL#5BP9fsTzawm18J8^60Er$FwO zOa{~jVw$Su(~bs4EvF$-Yw4MeJL$XKC+X^?8?@uyLo_ORJ@yxm-|aGjW4^t^UPu0C zP0aZ{scADMjh*64Z+{RkFfA_rEc>6C3;&-MIjMdDlbP?In?9qov48&kV2wZ5W2%95 z^yiZGSW9JSMnRswWWsxP%&}<{(svy4`Ik`i+qo38>@$(y8@uK!G1p_CZ|vG{guV|Q zjCgriEHGD5SoI|2Vq{>gjGWqcRS~b7;CxD6XV12}wu%oa+~Tn|s1fY XN z){R^$_7dORuL_wVgD*i-HHduRR|+wBQJfX;|5M2+R+B !dVR!a zwD!gCX>8htV#@&LdCn7RA2f*~l+noJk|R!Sps90%Xwmw_5@F9YvUE!_wQJ?a>qal2 zhC)r$IL#mH(zda2?K*KwSo@V@@zPR<;HkoA*4_FdWd`=4%%s|cd=av!b>!#cM}C%I z^79WSb7(aAC)cKcy3NTFnLvKX`SL>!c92If#mQO z;MJEYyL)$v^wUuwVk;K-*RkFj{yP= o> zsReHaYVqDLd64kYao#rLI5-mPdO! -mHNX7RV3!T zHlG=f<8wXt(5Yjm>FY1|)5tb6sIf7d>iTx3RM^Gw>QstVB~Xkq9xVyE_jR$RzJrLp za{e9HT=Dm?V7(mAoozX^eTU0w$;xrU2k_g8gEVYxBz5ee6tR^y9c?vOnlwQ^Z4V=j zKpxH5CqilJvr+WIo3XTTZ4xcngdD49E&2KP9FyVtEnKrHR-GbZH7pPMM=SzAuLKRO z!5V Q>qHpl+w zyc$ahp<2%WI0Tz7Dz%ia4@4~;_6KS$O67qRL! fB%Y*y|~fodfsMQEs3uVC7?b1vc&m*~p1)3o=8 zslc*kvF&}nFZTD&emO?O{ZT{Y9O7*4n8~mvB%jwx;|B88CDc<71^=I_1Kwtt$TD+8 z!a8A3F<76h{uMFwyUSGm4d>dmGrfTI)j5>v)rZX0_0*s~)=&Un#y)$rfxiB3v%r7X zC+~>;gU0FTv1ulH{%y$I4N3RZwLI1=2c{qn$LlZz?Jymnepjn@Dy+#;P;wmX1GS8N z Y~&ExdTi4FAo*)M40 ze>&2#Z8h#n12)`KY0 K&Q(IKFI`( A*n~bOX|_@i8>}+i N?=~n4AI$x^{(3rU=U!@R z9%{oMvVUUcRyzCJC4tp~aeIr2zfDH44B`CwAWsW*>uM1^%`$z(_F8o6j1B*TN0(!N zvN-05ZArIZUlBu3&NK`EEXx?q)9%zm1w7z$$jnBqsx7EpgZd?o4K<9keddt2H3jbx zmQ&qiJ&hh`rI!}PgBGFtabGOY?fQqY=KET*p$5%g7*7+YMNrQk0hAo6 #8KgSIYwQ;vTtPH{PWZ4f;J@&)7ZBhF(KCjkeI~V;AWra)MqS{GSrx z&vBP5*pXrKNUE1^p!YTv*i(mpTPJAh@Na8x%U>nMU&sQ?w_ZkGKIi6)$T3h$tl#&8 z?ALagY^zOZuU&&0Cd#}THR{QzNtUyU{QFEGOH3N-6KXJ5S5Tvx2I|<>kNWiuph1I! z5Vs7Z?x5jzElpH61?#2E8s_zzkn?9l4W`Xl|DA;~H2?YMpA|U1Ue-R~eXgZ%Fe?-X z(+o|8?q~n$*z^tb>$hhGRtul_f(C^bNB$SK5z-7T#CnL=mnH~4U$!lYzB%}kxF+k^ zRXgi|1`24Sq}V&2Z`U8ZKCgXSBl&3jNHgU1{JK?K$AoK`_`UKU3RtjD)G*;XC2{a! z#eVP&av>nETJ<7Jd@V9r!pYBsd9D$4Lrp BTS8vj(d zkfn_OuKmN{tG`NDuAZhXpLV;ajpc~(y|!5vusxR=h1yk7b#1jtnfJl-hMBn(z4@>$ zuEG9F(emQlcK_whqqcmA75gaW{r_Nn%tsWn <@VRi{iz!?6kqYZhPBviXx`JO%~)!pk8Dz ztnn 4jfC%neQ1-KZlhDb{zd0bUZ%;-x52MgQXR0C8kq1N z2Ke^IJRU0iBRr@2=&O<7|1)&%&!1@ho|d%i0q6kc{ROKMsb;*641Q6t_ZQo2KIZ*d zJ1EA^`z48GIh-5Zt{-v% Gy{z!w^@QFKA#`>{@y^=Sx~T_3L8!fQtItc`nHHGy=U$RI7%b<}R?&0MD~`eL0kN z?;rk;=K(xdn>r_o!h94oqHllN`0Wu2dS)9b!29M`Kc%=_#Io&pmh_wR*|4S=vj1jk zcw{z@-i;gAZ$F4-crWLJcvtn{_wcrWFW~nWO#<}_dnI2E6vzKp6#IhyTF8{g;SVxW zVz`#30W0R$<=bogW8P<-Kl`N^iVs#(a6lyO`Fy{yS>}Fph|F_8ve|t1o6`pUAM@TP zh-t P)06nmPtg6LUhlU$_9%!gIZQ?_W!8 z11D0Tr JA0Tja0|C6J)`wpaZU<$?<`b&ILHWzJfCS5EDdBl~r$q-%Uj+Q92qhFo<4! zGY Lv0ab57sKkS7{(^*U8ZNn}vTTbIF&q>BL1k zfwk wUHK6#H@NP+KuO_7^_p=9uVd(^Yxwavw zDlcQb^vq7pT2{lm5FQ2S3q9kAtZWI*Jvl6*Iq2a1K(*#ffLwnoN*zlXsExvFV><^w zBYgcl*Y6kcj%d8i`6Ep&Ly2R`L2_T@Y$<4HzhQL#+*w+;ZZB1KZHpYvrl<*@f&89m zK???V&ihb8HlUW0N+EbVSci82gU7kg`vvAzQC|r4-(4%!7WF?pToaHpg4kO~B!vy1 zB684J=EuTzi{m-G$XT=deE2(WZqGSw+_s~3G4j^JC(Nb5+RezU))U@eco6G0dX5`1 z%&mKCA^HoA&7;&oU2uNio-68{#^D`)IhZ4CMty@rsB>~LKyIKAWdLI8K@_I6Qm8Tn z+W`~^%=tZ@{2o6=m2j%;T$5(cwygo$zyB~PmA#My+5xp;+aM>jg?J|jzu$#1ty(z^ zG!cXR-iW*wDc%WKrE)sn|4|p1Hxa+F)s$|7e8HZmH`IwVRl-E=AxlU!g>)Gt_&EBl ztrUZLl(8$npxD*>ZQtlezmrRmbKa-0(a+fAJk~>+Q429pp*n N>$C3Jxl`x`ypz=p{%-^3Lk;kr j8XF-(TuSty;e &fK2V{aXRKCzo~fD)-?Dk2jrlPq%VfOkpf}E`jrfN*VtCGFDQ m+9b_@L1uKS+c+#VNnVOs}a%k8(F%e8}s7io69?YZGa*ALp) zf%+px _F?r8w{Me~;3?cL!`MqvnkZ-XpWnrURhsIj0}|UI(?n&Y! sGD$_a3tR%6A=sG~|_X?t7q0^M|TxtXQkZ zd|s*YIC}BLJwgU--+mCaAfEya6v&5?uL)v0v8@l$x?5THe}(l{KB&ij*ZV6!`0tJY z=apx5>E?_zC6n Pc^UpLnq^TIm@))?`A243eQ)_j2m+^ao70|u<5jhlWX>p!dq z?OwSh=6yPfG5fE jY*xGwFtud1V83?HhQ|%vegEaFkgdR zDD#{^6)W*Nzmn^FuK8NswGrMCk99;U%`Vj34dQ&Z@=xg*0rna22eGpN$mZo(t8 i)`W6R84c<@vMj-S zpnroua!S{hZ4AzMWEhpD@4?IOD1QX-o;hjb2Wy@1KILHOgPdTEc0b<7eu-@ZgNGUQ z8?E5!NU<(h;g*1Uu5kiut$PTLn}E4iyuTgvv!BoBgA^Eh81;*Or~=tndgsIo&Fop$}0Hf zXCWrj0=R1smvZXTyjAIc*avurV$w{9CCS;gW&5B1z=VPwSGez6&_Bn0ew}^Z=P>sj zE|7b>eg*s4M7KTe@cYC3dxz_bzgNBB_qX_XdO@Er=x}+W8-;EcCt~GQq0eE5tMh@w zg?^6ni}Z8u(Jy-bIftj=>z{MDd-3<~)h}{?x%cSj6#08a`%;nn|689GUBL$fT+qSR zEo06E#~nAMyZ5hT EU$lR2Vveul@uL0n6LSg;&@U6ELj5BZ9La-dm-FBHwH>cN z)!C6eiO@GW9-r+}xbNX2MLHh$agk&W{afg3CKT+rmEv5ee 青岛大学在线评测平台 - 首页 +