最近学习php框架ThinkPHP.话说学习技术最简单的方法就是动手,所以自己写了一个简单的投票系统(无美工...),环境是LAMP。

这个简单投票系统是给我班做投票用的,写的仓促,交互不好。第一次写希望大家多多包涵。

ThinkPHP的规范这里就不说了,先来项目结构。

其中3个class.*.php是发送邮件的脚本。其他文件夹的作用学过ThinkPHP的应该都清楚,在此就不解释了。

一.index.php

 
  
  1. <?php 
  2.     define('THINKPATH','./ThinkPHP/'); 
  3.     define('APP_NAME','Vote'); 
  4.     define('APP_PATH','.'); 
  5.     require_once(THINKPATH.'ThinkPHP.php'); 
  6.     APP::run(); 
  7. ?> 

二.进入Lib/Action目录。共4个Action类文件。

先看IndexAction.class.php

 

 
  
  1. <?php  
  2. // 本文档自动生成,仅供测试运行  
  3. class IndexAction extends Action  
  4. {  
  5.     public function index(){ 
              $this->display();  
  6.     }  
  7. }  
  8. ?> 

LoginAction.class.php

 

 
  
  1. <?php 
  2.     class LoginAction extends Action{ 
  3.         public function index(){ 
  4.             $this->display(); 
  5.         } 
  6. /**************************************************** 
  7. -对用户提交的用户信息进行检查  
  8. -***************************************************/ 
  9.         public function check(){ 
  10.             $snum=$_POST['snum']; 
  11.             $pwd=$_POST['password']; 
  12.             $User=M('classmates');//建立与数据库think_classmates表的链接 
  13.             if($User->where("snum='$snum'")->getField('password')==$pwd){ 
  14.                 session_start();//会话打开 
  15.                 $_SESSION['snum']=$snum
  16.                 $this->redirect('Vote/index');//跳转到用户投票页面 
  17.                 } 
  18.             else
  19.                 $loginfailed="用户名或密码错误<br/>"
  20.                 $this->assign('loginfailed',$loginfailed); 
  21.                 $this->display('index');                 
  22.             } 
  23.         } 
  24.         }    
  25. ?> 

QuitAction.class.php

实现用户的退出功能.销毁用户 SESSION.

 
  
  1. <?php 
  2.     class QuitAction extends Action{ 
  3.         public function index(){ 
  4.             session_start(); 
  5.             unset($_SESSION['username']); 
  6.             $this->redirect('Index/index'); 
  7.         } 
  8.     } 
  9. ?> 

VoteAction.class.php

 

 
  
  1. <?php 
  2.     class VoteAction extends Action{ 
  3. /******************************************/ 
  4. //--显示投票首页信息 包括用户信息的显示 及  
  5. //--目前可以 进行投票的活动 
  6. /*******************************************/ 
  7.         public function index(){ 
  8.             session_start(); 
  9.             if(isset($_SESSION['snum'])){ 
  10.               $snum=$_SESSION['snum']; 
  11.               $User=M('classmates'); 
  12.               $username=$User->where("snum='$snum'")->getField('username'); 
  13.               $email=$User->where("snum='$snum'")->getField('email');              
  14.               $hello="你好,".$username
  15.               $quit="&nbsp|&nbsp<a href='__APP__/Quit'>退出</a><br/>"
  16.               $information="用户信息:<br/>"."真实姓名:".$username."<br/>邮箱:".$email
  17.               $reset="<a href='__APP__/Vote/resets'>重填</a>"
  18.               $this->assign('hello',$hello); 
  19.               $this->assign('quit',$quit ); 
  20.               $this->assign('information',$information); 
  21.               $this->assign('reset',$reset); 
  22.               $this->assign(); 
  23.               $this->display();          
  24.             } 
  25.             else 
  26.                 $this->redirect('Index/index'); 
  27.         } 
  28. /***************************************************/ 
  29. //--用户信息重置 包括用户真实姓名,密码, 
  30. //--电子邮件地址的设置 
  31. /**************************************************/ 
  32.         public function resets(){ 
  33.             session_start(); 
  34.             if(isset($_SESSION['snum'])){ 
  35.                 $this->display(); 
  36.             } 
  37.             else  
  38.                 $this->redirect('Index/index'); 
  39.         } 
  40.         public function update(){ 
  41.             session_start(); 
  42.             if(isset($_SESSION['snum'])){ 
  43.                 $User=M('classmates'); 
  44.                 $snum=$_SESSION['snum']; 
  45.                 $data['username']=$_POST['username']; 
  46.                 $data['password']=$_POST['password']; 
  47.                 $data['email']=$_POST['email']; 
  48.                 $User->where("snum='$snum'")->save($data); 
  49.                 $updatesuccess="信息更新成功<br/>"
  50.                 $this->assign('updatesuccess',$updatesuccess); 
  51.                 $this->redirect('Vote/index'); 
  52.             } 
  53.             else  
  54.                 $this->redirect('Index/index'); 
  55.         } 
  56. /*******************************************************/ 
  57. //--用户参与的一个投票活动。 
  58. //--主要功能是判断用户参与的是哪种投票活动 
  59. /******************************************************/ 
  60.         public function vote(){ 
  61.             if(isset($_SESSION['snum'])){ 
  62.             $id=$_GET['id']; 
  63.             /*if($id==1) 
  64.                 echo "精神文明"; 
  65.             `else if ($id==2) 
  66.                 echo "优秀团员";*/ 
  67.             if($id==1){ 
  68.                 $actionname="精神文明投票:<br/>"
  69.                 $actiontype='jingshenwenming'
  70.                 } 
  71.             else if ($id==2){ 
  72.                 $actionname="优秀团员投票:<br/>"
  73.                 $actiontype='youxiutuanyuan'
  74.                 } 
  75.             $this->assign('actionname',$actionname); 
  76.             $this->assign('actiontype',$actiontype); 
  77.             $this->display();} 
  78.             else  
  79.                 $this->redirect('Index/index'); 
  80.              
  81.         } 
  82. /*****************************************************************/ 
  83. //--对用户的投票进行计算,并更新数据库 
  84. //--显示用户此次投票活动的选择 
  85. /*****************************************************************/ 
  86.         public function calculate(){ 
  87.             if(isset($_SESSION['snum'])){ 
  88.                 $actiontype=$_GET['type'];//获得投票活动类型 
  89.                 $schoolnumber=array();//声明复选框数组 
  90.                 $schoolnumber=$_POST['schoolnumber']; 
  91.                 $list='你选的候选人如下:<br/>';//显示提示信息 
  92.                 $Can=M('final');//创建投票活动表连接 
  93.                 $User=M('classmates');//创建用户信息表连接 
  94.                 foreach($schoolnumber as $candidate){ 
  95.                     if($candidate!=''){//如果某个人被选中 
  96.                         $data[$actiontype]=$Can->where("snum='$candidate'")->getField($actiontype); 
  97.                         $data[$actiontype]++; 
  98.                         $Can->where("snum='$candidate'")->save($data); 
  99.                         $list.=$User->where("snum='$candidate'")->getField('username'); 
  100.                         $list.='<br/>'
  101.                         } 
  102.                 } 
  103.                 $this->assign('list',$list); 
  104.                 $this->display();    
  105.             } 
  106.             else     
  107.                 $this->redirect('Index/index'); 
  108.         }    
  109.     } 
  110. ?> 

三.进入项目目录下的/Tpl/default/目录 共3个模板目录。

进入Index :

index.html

 
  
  1. <html> 
  2.     <head><title>欢迎投票中心</title></head> 
  3.     <body> 
  4.         <a href='__APP__/Login'>登录</a> 
  5.     <body> 
  6. </html> 

进入Login:

index.html

 

 
  
  1. <html> 
  2.     <head><title>0903的娃赶快登录吧~</title></head> 
  3.     <body> 
  4.         {$loginfailed} 
  5.         <form method='post' action='__APP__/Login/check'> 
  6.         学&nbsp号:<input name='snum' type='text' size='20'/><br/> 
  7.         密&nbsp码:<input name='password' type='password' size='20'/><br/> 
  8.         <input name='submit' type='submit' value='登录'/>      
  9.     </form> 
  10.     </body> 
  11. </html> 

进入Vote:

共4个模板文件。

index.html

 

 
  
  1. <html> 
  2.     <head><title>投票~</title></head> 
  3.     <body> 
  4.         {$loginsuccess} 
  5.         {$hello}{$quit} 
  6.         {$information} 
  7.         {$reset} 
  8.     <h3>你的投票:<br/></h3> 
  9.     <table> 
  10.         <tr> 
  11.             <td><h4>投票活动</h4></td> 
  12.             <td><h4>状态</h4></td> 
  13.         </tr> 
  14.         <tr> 
  15.             <td><a href='__APP__/Vote/vote?id=1'>精神文明</a></td> 
  16.             <td>未投票</td> 
  17.         </tr> 
  18.         <tr> 
  19.             <td><a href='__APP__/Vote/vote?id=2'>优秀团员</a></td> 
  20.             <td>未投票</td> 
  21.         <tr/> 
  22.     </table> 
  23.     </body> 
  24. </html> 

resets.html

 

 
  
  1. <html> 
  2.     <head><title>用户信息~</title></head> 
  3.     <body> 
  4.         <form method='post' action='__APP__/Vote/update'> 
  5.         真实姓名:<input type='text' name='username' size='20'/><br/> 
  6.         &nbsp密&nbsp&nbsp&nbsp&nbsp码&nbsp:<input type='password' name='password' size='20'/><br/> 
  7.         e-mail&nbsp&nbsp&nbsp:<input type='type' name='email' size='20'/><br/> 
  8.         <input name='submit' type='submit' value='提交' > 
  9.         </form> 
  10.         </body> 
  11. </html> 

calculate.html

 

 
  
  1. <html> 
  2.     <head><title>投票结果~</title></head> 
  3.     <body> 
  4.         {$list} 
  5.         <a href='__APP__/Vote/vote'>返回</a> 
  6.         </body> 
  7. </html> 

vote.html

 

 
  
  1. <html> 
  2.     <head><title>投票~</title></head> 
  3.     <body> 
  4.         {$actionname} 
  5.         <form method='post' action="__APP__/Vote/calculate?type={$actiontype}"> 
  6.             <input type="checkbox" name="schoolnumber[]" value='200992139'/> 
  7.             李嘉峻 
  8.             <br/> 
  9.             <input type="checkbox" name="schoolnumber[]" value='200992263'/> 
  10.             闻亦晨 
  11.             <br/> 
  12.             <input type="checkbox" name="schoolnumber[]" value='200992026'/> 
  13.             高子涵 
  14.             <br/> 
  15.             <input type='submit' name='submit' value='提交'/><br/> 
  16.         </form> 
  17.         </body> 
  18. </html> 

四.回到主项目目录。解释一下三个class.*.php文件。这三个文件是phpmailer解压后得到的文件,将它们复制到项目中就可以使用phpmailer发送邮件了。

最后一个文件是Mail.php 实现邮件的发送功能。

 

 
  
  1. <?php 
  2.     require("class.phpmailer.php"); 
  3. /****************************************/ 
  4. //--应用linux的crontab来定时执行此脚本, 
  5. //--如果到达定时的时刻则向think_classmates 
  6. //--中所有的用户发送投票结果的邮件 
  7. //--在规定时间之前没有投票的用户算作放弃 
  8. /****************************************/ 
  9.  
  10.  
  11.  
  12. /*************************************/ 
  13. //--连接数据库函数 
  14. /*************************************/ 
  15.          function Connect(){ 
  16.                 $conn=@mysql_connect("localhost","root","changyisheng"); 
  17.         if(!$conn){ 
  18.             die("连接数据库失败:".mysql_error()); 
  19.         } 
  20.         mysql_select_db("Vote",$conn); 
  21.         mysql_query("set character set 'utf8'");     
  22.         } 
  23. /*************************************/ 
  24. //--将表中的用户数据根据活动分表 
  25. //--每一个投票活动一个数组 
  26. /*************************************/ 
  27.          function DataToArray(){ 
  28.             //$User=M('final');//查询表think_final 
  29.             //$list=$User->select(); 
  30.         Connect();//连接数据库 
  31.         $sql="SELECT * FROM think_final"
  32.         $list=mysql_query($sql);//进行查询 
  33.         while($tt=mysql_fetch_array($list)){     
  34.                 $snum=$tt['snum']; 
  35.                 $actionname1=$tt['jingshenwenming']; 
  36.                 $actionname2=$tt['youxiutuanyuan']; 
  37.                 $list1[$snum]=$actionname1
  38.                 $list2[$snum]=$actionname2
  39.             } 
  40.                 $result[0]=$list1
  41.                 $result[2]=$list2
  42.                 return $result
  43.         } 
  44. /**************************************/ 
  45. //--将传进来的$array数组根据票数进行排序 
  46. //--结果返回排序好的数组 
  47. /*************************************/ 
  48.          function ArrayToData($array){ 
  49.             foreach($array as $action){ 
  50.                 arsort($action); 
  51.                 $list[]=$action
  52.             } 
  53.             //  dump($list); 
  54.             return $list
  55.         } 
  56. /**************************************/ 
  57. //--将排序好的数组中学号翻译成学生姓名 
  58. //--结果返回一个文本(对人友好的) 
  59. /**************************************/ 
  60.          function NumberToName($array){ 
  61.             //$User=M('classmates');//学生信息数据库 
  62.             Connect(); 
  63.             $sql="SELECT * FROM think_classmates"
  64.             //进行查询 
  65.                 $mark=1; 
  66.             foreach($array as $action){ 
  67.                 if($mark==1) 
  68.                     $list.="精神文明投票结果:<br/>"
  69.                 else if($mark==2) 
  70.                     $list.="优秀团员投票结果<br/>"
  71.                 $mark++; 
  72.                 foreach($action as $snum=>$value){ 
  73.                     //echo $snum;//输出学生学号 
  74.                     //$username=$User->where("snum='$snum'")->getField('username');//获得学生姓名 
  75.                     $array=mysql_query($sql); 
  76.                     while($row =mysql_fetch_array($array)){ 
  77.                     if($row['snum']==$snum){ 
  78.                     $username=$row['username'];  
  79.                     $list.=$username.":".$value."票<br/>"
  80.                     break
  81.                     } 
  82.                         } 
  83.                 } 
  84.             } 
  85.             return $list
  86.         }    
  87.  
  88.     if(time()==mktime(11,16)){ 
  89.         //连接数据库 
  90.         $mail=new PHPMailer();//建立邮件发送类 
  91.         $mail->IsSMTP();//使用SMTP发送发送 
  92.         $mail->Host="smtp.qq.com";//您的企业邮局域名 
  93.         $mail->SMTPAuth=true;//启用SMTP验证功能 
  94.         $mail->Username="632849504@qq.com";//邮局用户名 
  95.         $mail->Password="changyisheng";//邮局密码 
  96.         $mail->Port=25; 
  97.         $mail->From="632849504@qq.com";//邮件发送者email地址 
  98.         $mail->FromName="icys"
  99.         $conn=@mysql_connect("localhost","root","changyisheng"); 
  100.         if(!$conn){ 
  101.             die("连接数据库失败:".mysql_error()); 
  102.         } 
  103.         mysql_select_db("Vote",$conn); 
  104.         mysql_query("set character set 'utf8'"); 
  105.         $sql="SELECT * FROM think_classmates"
  106.         $result=mysql_query($sql);//进行查询 
  107.         while($row =mysql_fetch_array($result)){ 
  108.         //  echo "学号:".$row['snum']."<br/>"; 
  109.         //  echo "真实姓名:".$row['username']."<br/>"; 
  110.         //  echo "密码:".$row['password']."<br/>"; 
  111.         //  echo "email".$row['email']."<br/>"; 
  112.         $address=$row['email'];//接收方邮箱地址 
  113.         $username=$row['username'];//收件人姓名 
  114.         $mail->AddAddress("$address","username");//收件人地址,收件人姓名 
  115.         $mail->IsHTML(true); //以HTML方式进行发送 
  116.         $mail->Subject="投票结果"
  117.         //$mail->Body="Hello"; 
  118.         /*************************/ 
  119.         //--邮件内容 
  120.         /*************************/ 
  121.         $array=DataToArray(); 
  122.         //var_dump($array); 
  123.         $array=ArrayToData($array); 
  124.         //var_dump($array); 
  125.         $list=NumberToName($array); 
  126.         $mail->Body=$list
  127.         if(!$mail->Send()){ 
  128.             echo "邮件发送失败.<p>"
  129.             echo "错误原因:".$mail->ErrorInfo; 
  130.             exit;            
  131.         } 
  132.         //echo "邮件发送成功"; 
  133.         } 
  134.     } 
  135. ?> 

最后要实现定时发送邮件的功能(我是每天的11点16分给我的邮箱发送邮件)要更改一下crontab文件 。linux下是在命令行下 crontab -e 回车

在最底下(因为原来没有设过)加入下面一行*/1 * * * /usr/bin/php   /var/www/htdocs/Vote/Mail.php

至于其中每一项代表什么,大家可以查一下crontab网上有很多讲解。

数据库设计如下:

think_classmates表:

 

think_final表: