一个php开辟的中学成绩经管体系

    添加时间:2013-6-1 点击量:

    写在前面


           博客好久没更新了,比来看了MSRA牛人刘未鹏的博客(www.mindhacks.cn),深有感觉,感触感染进修到了很多器材,关于算法进修,思维办法,职业成长等等,是以看了好几篇他的博客之后我就做了两件事



    1. 将我之前所有项目代码都上传到github上

    2. 持续对峙写博客


    正好这个礼拜受某中学委托用php写了一个成绩经管体系,是以就把体系开辟过程记录下来,当做是一个总结,也和各位园友交换一下,共同进步进步。


    因为本人今朝还只是在校学生,是以常识经验必定存在很大不足,文章内容也不免疏漏粗浅,如有偏颇的处所大师多多懂得。交换进步才是终极目标,感谢!


    成绩经管体系的角色及功能



    1. 1.       经管员


    1.1 导入用户信息(包含学生和教师)


    1.2.1 挂号测验(包含全县统考、全校统考、班级测验)


    1.2.2 查询测验信息


    1.3 导入成绩


    1.4 批改暗码


    1.5 用户查找



    1. 2.       教师


    2.1    查看本班所有学生成绩(包含各科分数、总分、排名)


    2.2    批改暗码



    1. 3.       学生


    3.1    查看本身的所有测验成绩


    3.2    批改暗码


          


    具体用的技巧


    后台说话:Php


           前台说话及框架:html+javascript+jquery


           安排办事器:linux+nginx



    开辟过程



    1. 1.       数据库设计


    数据库中有3个表:grades(分数表)、users(用户表)、exams(测验表)


    users表顶用户ID是Grades表中userid的外键


    exams表中测验id是grades中examid的外键


     



    1. 2.       登录


    登录界面



           登录界面是在网上找到的一个用jquery建造的很都雅的登录界面,这里供给下地址:


    http://www.veryhuo.com/down/html/55826.html


     


    登录逻辑


    若是用户登录成功读取用户的用户类型(经管员,教师,学生),当然为了避免sql诸如,将用户输入都做了特别字符过滤处理惩罚,并将用户的用户名、用户类型、用户ID等信息读入¥_session中,然后分别导向不合的页面(admin.php、teacher.php、student.php),在这些页面里也对session从头进行验证,避免未授权用户直接接见该页面。用户点击退出后就把session里的一些变量置空。



          



    1. 3.       用户界面



    经管员导入用户信息和成绩信息都用php-reader这款第三方插件来读取上传的excel信息,这里也供给这款插件地址:http://code.google.com/p/php-reader/


    这款插件供给了一些很便利的办法来获取excel文件的数据,甚至可以读取一些如单位格边框色彩等附加信息,然则要重视的是这款插件只能读取.xls文件,不克不及读取.xlxs文件。


    其他教师和学生界面的功能都只是简单的查表返回成果,没有什么错杂的功能。


    一些具体的功能也到细节实现中去细说吧。下面上一张用户操纵的界面图


     




    1. 4.       应用逻辑


     



    1. 经管员导入用户信息(包含学生和教师)

    2. 经管员挂号测验信息,体系获取测验ID并返回给经管员(为了区分导入grades表的成绩数据须要给每次测验分派一个ID )

    3. 经管员导入成绩表(有一列是第二步获取的测验ID)

    4. 教师和学生登录查询成绩


    (关于测验经管这里之所以要让经管员获取一个测验ID是因为我愁闷经管员录入测验成绩的时辰有漏录的景象,为了让体系知道后面补录的成绩是前一次录的此次成绩,就须要一个测验ID来把他们接洽起来,是以引入了这个获取测验ID的看似烦复的步调)


    一些细节实现




    1. 1.       教师界面查询本班所有学生成绩


    因为我将所有学生成绩都放在同一张表grades里,而这张表里每笔记录都是一个学生某次测验的记录,是以要将这个教员班上学生有关的测验的成绩都查询出来并且每次测验遵守名次排序,是以必定涉及到多表查询的题目,而因为成绩字段斗劲多,也培养了我最长的SQL(¥exam_id是之前查询出来的该教师班级所有学生参与的测验ID号):



    SELECT t1.sx,t1.yw,t1.yy,t1.wl,t1.hx,t1.sw,t1.ls,t1.zz,t1.dl,
    

    coalesce(t1.sx,0+coalesce(t1.yw,0+coalesce(t1.yy,0+coalesce(wl,0

    +coalesce(hx,0+coalesce(sw,0+coalesce(ls,0+coalesce(dl,0+coalesce(zz,0))

    as sumscore,t2.realname FROM myphpcj.grades as t1 ,users as t2 where t1.userid=t2.id and exam_id=.¥exam_id. order by sumscore desc;



    看起来可能有点长,这里大致申明一下,t1是grades表,t2是用户表。两表结合查询得出该次测验每个学生姓名,学号,分数,总分,最后按总分排序,因为有的科目学生未参加或者本次测验不包含,是以采取了mysql的coalesce函数来处理惩罚null值。之前很罕用结合表查询,此次试用之后发明可以简化很多法度逻辑,进步法度效力。此次数据库设计的时辰应用了一些外键,可以说对于简化法度异常处理惩罚也起了很鸿文用。总之感触感染对数据库开辟也有了更深的懂得。



    1. 2.       文件保存避免重名


    因为要导入用户成绩,我设法是先把文件上传到files目次下,然后再读取文件内容导入信息。我想将所有文件用日期时候戳来定名,这就涉及同一天上传多次文件覆盖的题目,最后想了一个办法同一天上传的文件后面加上上传次序1,2,3….. 。同时若是中心删了一个文件,后面上传的文件会弥补这个数字地位。于是在上传代码里加了如下处理惩罚:


     



    ¥i=1;
    

    ¥save_filename=files/users.date(Y-m-d[).¥i.].xls;

    whilefile_exists(files/users.date(Y-m-d[).¥i.].xls))

    {

    ¥i=¥i+1;

    ¥save_filename=files/users.date(Y-m-d[).¥i.].xls;



    }

    move_uploaded_file¥_FILES[grade_file][tmp_name],

    ¥save_filename);



    最后结果是如许的:


     


    其他一些功能也斗劲简单,这里就不细说了。至于安然方面,因为没有什么相干的经验,只是在所有表单根蒂根基都做了特别字符过滤避免SQL注入,用户登录也做了登录失败次数记录防止蛮力。至于XSS,网站不供给对外注册,封闭性较强就也没怎么推敲。


    写在最后


                         之前一向用.net 开辟web,此次在w3school上看了两天php的教程(这里要赞一下这个网站,不清楚的同窗可以百度一下,教程内容精简不失重点!)之后就上手花了3天做这个器材,最后固然功能斗劲简单,界面结果也一般,然则本身还是斗劲合意的,一方面增长了一种技能,另一方面也对这两种技巧做了个简单的对比,小我认为php跟html和js的连络较好,是以做前端相对轻松一些,并且开辟效力小我感触感染也较.net高一些,然则毕竟?成果是脚本说话,安然性必然没.net好,根蒂根基上一个功能周全一点,大一点的体系很轻易呈现各类百般的漏洞。至于效力方面,我没实测过,也没有讲话权,当然这只是一家之言,两种都是优良的说话,不然也不会这么风行。也迎接大师提出不合的概念交换评论辩论。


                         最后若是有中学须要本体系的话,迎接接洽我QQ:290405983

    无论对感情还是对生活,“只要甜不要苦”都是任性而孩子气的,因为我们也不完美,我们也会伤害人。正因为我们都不完美,也因为生活从不是事事如意,所以对这些“瑕疵”的收纳才让我们对生活、对他人的爱变得日益真实而具体。—— 汪冰《世界再亏欠你,也要敢于拥抱幸福》
    分享到: