表演期间,需要展示当前节目的基本信息。
表演完毕,需要所有评审对当前表演者进行打分。打分可能分为多项,多个考核点,最后加和算是最后给分。
打分完毕,需要计算平均分,可能会有去掉最高分和最低分的操作。
最后展示,所有队伍的排名。
【需求点】
2.管理评审的基本信息
3.表演者信息管理
后台最好有个表演者列表,可以管理表演顺序,控制评审的对分对象,临时队伍退赛也可以及时剔除,避免影响。还可以统计分数,便于排名。
4.大屏幕信息展示管理
可能需要展示的有,评审列表,节目列表,单个节目的详细介绍,单个节目的分数列表,排名列表。这些都需要大屏幕实时相应去变化。
【技术方案】
1.LAMP结构搭建后台
php脚本类似c++语法,对于c/C++程序员来说入手很快。wampserver搭建的apache几乎不需要任何配置,写好php代码管理好数据即可。同时,wampserver安装完成之后,可以在文档目录下找到几个已经建好的子站点,文档目录一般是c:/wamp。所以整个技术还是比较容易入手的。
2.建立页面缓存
如果用php去动态打印页面代码是很累的,这里一般使用比较成熟的smarty模版语言。smarty是利用php进行封装之后的一个类,用来将一定格式的网页模版翻译为可以供浏览器执行的页面文件。这个页面文件可以保存在本地目录中,供快速调用。如果模版文件被修改,生成的缓存页面也会被修改,所以开发完成后,调用的速度是很快的。
3.免刷新控制显示
【操作过程】
1.安装wampserver
可以选择安装在D盘,都是一样的,安装之后会在D:/wamp目录下能看到alias和apps目录。
2.添加文档目录配置
在alias目录下一般会有已经有几个文件了,你可以拷贝其中一个自己建一个子站,稍加修改,如:
//count.confAlias/count"D:/wamp/apps/count/"
3.添加网站入口文件
在刚才count.conf文件中填好的目录下,如:D:/wamp/apps/count/,添加index.php文件,其中可以加入如下测试代码:
//index.php
//Turnoffallerrorreportingerror_reporting(0);//Reportsimplerunningerrorserror_reporting(E_ERROR|E_WARNING|E_PARSE);//ReportingE_NOTICEcanbegoodtoo(toreportuninitialized//variablesorcatchvariablenamemisspellings...)error_reporting(E_ERROR|E_WARNING|E_PARSE|E_NOTICE);//ReportallerrorsexceptE_NOTICE//Thisisthedefaultvaluesetinphp.inierror_reporting(E_ALL^E_NOTICE);//ReportallPHPerrors(bitwise63maybeusedinPHP3)error_reporting(E_ALL);//Sameaserror_reporting(E_ALL);ini_set('error_reporting',E_ALL);看到了welcomtocount之后,就要开始进入全面开发阶段了。
4.搭建网站框架
一个好的网站应该有自己的网站架构来管理自己的代码和功能,便于维护和升级,也可以使得结构清晰,便于理解。这里我们可以使用经典的MVC架构。
在apps/count目录下创建module,controller,view三个文件夹,其中view放置页面文件,很多人喜欢把js和css文件也放在view文件加下,这是可行的,放在和view同级目录也行,根据个人习惯即可,count目录是子站的入口目录,只要获取js和css文件的路径是方便的,都是可以的。
module目录放置功能前端功能类,controller放置调用前端功能类,决定什么接口展示什么页面,view是放置页面的地方,还可以放置smarty模版。
我们还可以再建一个library目录,用来放置插件,其他扩展的功能类,例如smarty类,gearman,DB类,memcache类等,当然我们这里也不是都能用到。
5.设计数据存储结构
建表如下:
6.基本工具
这里的基本工具包括,smarty类,可以放到library下,也可以自己定义个类,简单的将smarty类再包一下。例如:
//Module.phpfunctionsmartyOut($view,$out=null){$file=BASE_PATH.'/View/'.$view.'.html';if(!is_file($file)){thrownewException("can'tfind[{$file}].");}require_onceBASE_PATH.'/Library/Smarty/Smarty.class.php';$smarty=Smarty::getInstance();$smarty->left_delimiter='';$out['time']=date('Y-m-dH:i:s');$smarty->assign('out',$out);$smarty->display($file);}这里经过这样的简单包装之后,只需要传入一个view名字,变量名,就完成了对smarty的调用。
另外,对于DB访问数据库的基本函数也可以封装下,将错误记录到执行的文件中去。例如:
日志工具可以按照几个等级和类型进行封装,这里我为了方便,只封装了info提示信息函数。我将info的参数多类型化,这样传入字符串和数组都能够很好的处理。避免外部时而json_encode,时而serialize,将数组转换的麻烦。例如:
//Logs.phpclassLogs{static$_dir='';static$_file='';staticfunctioninit($pre){self::$_dir=BASE_PATH.'/Log/';self::$_file=self::$_dir.$pre."_".date("Ymd");}staticfunctioninfoStr($obj){if(!self::$_file){thrownewException("logfilenotinit.");}if(is_array($obj)){$str='';foreach($objas$one){$str.=self::infoStr($one);}}else{$str=$obj;}return$str;}staticfunctioninfo($obj){$str='['.date('Y-m-dH:i:s').']'.self::infoStr($obj);file_put_contents(self::$_file,$str,FILE_APPEND);}}7.module类开发
//module.phpclassGroupextendsModule{function__construct(){Logs::init('log');}functiondisplay(){$obj=DB::getInstance();$sql="select*fromt_group";$results=array();$ret=$obj->select($sql,$results);$ret['num']=count($results);if($ret['ret']&&$results){$ret['info']="查询成功.";}else{$ret['ret']=false;$ret['info']="查询失败.";}$ret['data']=$results;parent::smartyOut('grouplist',$ret);}}上面是一个我定义的展示表演队伍列表的类,将数据获取到之后,再加上页面文件名字grouplist.html,传递给父类Module,这样就可以将变量传到grouplist文件中,这个文件其实是一个smarty模版,就可以通过out变量访问到results变量中的队伍列表了。
8.view开发
根据上面的grouplist.html的信息,可以做如下的代码,例如:
最后我们既可以看到类似如此的效果:
这里我们看到的页面还是一个比较死的页面,要让他自动感知后台数据的变化,需要做以下工作。
9.页面自动刷新
js部分需要自动发送请求到服务器的某个接口去询问是否发生了变化,用来判断页面是否应该刷新。服务器的接口可以为:
//Module.phpfunctionparse(){$module=isset($_GET['m'])$_GET['m']:'';$action=isset($_GET['a'])$_GET['a']:'';$this->_rute=array('module'=>$module,'action'=>$action,);if(!$module){returnfalse;}$file=BASE_PATH.'/Module/'.$module.'.php';if(!is_file($file)){throwNewException("can'tfindmodule[{$file}].");exit;}require_once$file;if(!class_exists($module)){throwNewException("can'tfindclass[{$module}].");exit;}if(!method_exists($module,$action)){throwNewException("can'tfindaction[{$action}]inclass[{$module}].");exit;}$obj=new$module();$obj->$action();returntrue;}php是动态脚本,随时都可以从字符串中决定调用什么类,什么函数。这也正是脚本的最突出的特点之一。
9.其他注意点
wampserver如果默认没有开启online模式,那么局域网中的其他机器是不能访问到count子站。是否开启了这个模式,可以将鼠标moveover任务栏上的wampserver图标,将会显示这个信息,如果没有可以鼠标左键单击,开启online模式。
如果后台的脚本使用POST方式去请求,那么从页面上要调试后台脚本时,如果发现不能访问到,可以按照这样的步骤去进行:先看apache日志是否有捕获到这个请求,如果未捕获到,可以重启apache,或者重启所有服务(只是稍慢几秒);如果日志中显示异常,可能是apache的配置不正确,请你检查count.conf文件,如果没有错误,那么还要注意allowall的配置,不要将所有请求都deny,如果要限制本机,也是在这里设置的,例如:denyfromlocalhost,127.0.0.1等。
【总结】
到这里,所有我想讲述的技术点都在这里了。我并没有把所有页面和接口的开发都统统列举,只是点到即止。如有疑问,请留言即可。这里是其中部分脚本: