最近学习php框架ThinkPHP.话说学习技术最简单的方法就是动手,所以自己写了一个简单的投票系统(无美工...),环境是LAMP。
这个简单投票系统是给我班做投票用的,写的仓促,交互不好。第一次写希望大家多多包涵。
ThinkPHP的规范这里就不说了,先来项目结构。
其中3个class.*.php是发送邮件的脚本。其他文件夹的作用学过ThinkPHP的应该都清楚,在此就不解释了。
一.index.php
方
- <?php
- define('THINKPATH','./ThinkPHP/');
- define('APP_NAME','Vote');
- define('APP_PATH','.');
- require_once(THINKPATH.'ThinkPHP.php');
- APP::run();
- ?>
二.进入Lib/Action目录。共4个Action类文件。
先看IndexAction.class.php
- <?php
- // 本文档自动生成,仅供测试运行
- class IndexAction extends Action
- {
- public function index(){
$this->display(); - }
- }
- ?>
LoginAction.class.php
- <?php
- class LoginAction extends Action{
- public function index(){
- $this->display();
- }
- /****************************************************
- -对用户提交的用户信息进行检查
- -***************************************************/
- public function check(){
- $snum=$_POST['snum'];
- $pwd=$_POST['password'];
- $User=M('classmates');//建立与数据库think_classmates表的链接
- if($User->where("snum='$snum'")->getField('password')==$pwd){
- session_start();//会话打开
- $_SESSION['snum']=$snum;
- $this->redirect('Vote/index');//跳转到用户投票页面
- }
- else{
- $loginfailed="用户名或密码错误<br/>";
- $this->assign('loginfailed',$loginfailed);
- $this->display('index');
- }
- }
- }
- ?>
QuitAction.class.php
实现用户的退出功能.销毁用户 SESSION.
- <?php
- class QuitAction extends Action{
- public function index(){
- session_start();
- unset($_SESSION['username']);
- $this->redirect('Index/index');
- }
- }
- ?>
VoteAction.class.php
- <?php
- class VoteAction extends Action{
- /******************************************/
- //--显示投票首页信息 包括用户信息的显示 及
- //--目前可以 进行投票的活动
- /*******************************************/
- public function index(){
- session_start();
- if(isset($_SESSION['snum'])){
- $snum=$_SESSION['snum'];
- $User=M('classmates');
- $username=$User->where("snum='$snum'")->getField('username');
- $email=$User->where("snum='$snum'")->getField('email');
- $hello="你好,".$username;
- $quit=" | <a href='__APP__/Quit'>退出</a><br/>";
- $information="用户信息:<br/>"."真实姓名:".$username."<br/>邮箱:".$email;
- $reset="<a href='__APP__/Vote/resets'>重填</a>";
- $this->assign('hello',$hello);
- $this->assign('quit',$quit );
- $this->assign('information',$information);
- $this->assign('reset',$reset);
- $this->assign();
- $this->display();
- }
- else
- $this->redirect('Index/index');
- }
- /***************************************************/
- //--用户信息重置 包括用户真实姓名,密码,
- //--电子邮件地址的设置
- /**************************************************/
- public function resets(){
- session_start();
- if(isset($_SESSION['snum'])){
- $this->display();
- }
- else
- $this->redirect('Index/index');
- }
- public function update(){
- session_start();
- if(isset($_SESSION['snum'])){
- $User=M('classmates');
- $snum=$_SESSION['snum'];
- $data['username']=$_POST['username'];
- $data['password']=$_POST['password'];
- $data['email']=$_POST['email'];
- $User->where("snum='$snum'")->save($data);
- $updatesuccess="信息更新成功<br/>";
- $this->assign('updatesuccess',$updatesuccess);
- $this->redirect('Vote/index');
- }
- else
- $this->redirect('Index/index');
- }
- /*******************************************************/
- //--用户参与的一个投票活动。
- //--主要功能是判断用户参与的是哪种投票活动
- /******************************************************/
- public function vote(){
- if(isset($_SESSION['snum'])){
- $id=$_GET['id'];
- /*if($id==1)
- echo "精神文明";
- `else if ($id==2)
- echo "优秀团员";*/
- if($id==1){
- $actionname="精神文明投票:<br/>";
- $actiontype='jingshenwenming';
- }
- else if ($id==2){
- $actionname="优秀团员投票:<br/>";
- $actiontype='youxiutuanyuan';
- }
- $this->assign('actionname',$actionname);
- $this->assign('actiontype',$actiontype);
- $this->display();}
- else
- $this->redirect('Index/index');
- }
- /*****************************************************************/
- //--对用户的投票进行计算,并更新数据库
- //--显示用户此次投票活动的选择
- /*****************************************************************/
- public function calculate(){
- if(isset($_SESSION['snum'])){
- $actiontype=$_GET['type'];//获得投票活动类型
- $schoolnumber=array();//声明复选框数组
- $schoolnumber=$_POST['schoolnumber'];
- $list='你选的候选人如下:<br/>';//显示提示信息
- $Can=M('final');//创建投票活动表连接
- $User=M('classmates');//创建用户信息表连接
- foreach($schoolnumber as $candidate){
- if($candidate!=''){//如果某个人被选中
- $data[$actiontype]=$Can->where("snum='$candidate'")->getField($actiontype);
- $data[$actiontype]++;
- $Can->where("snum='$candidate'")->save($data);
- $list.=$User->where("snum='$candidate'")->getField('username');
- $list.='<br/>';
- }
- }
- $this->assign('list',$list);
- $this->display();
- }
- else
- $this->redirect('Index/index');
- }
- }
- ?>
三.进入项目目录下的/Tpl/default/目录 共3个模板目录。
进入Index :
index.html
- <html>
- <head><title>欢迎投票中心</title></head>
- <body>
- <a href='__APP__/Login'>登录</a>
- <body>
- </html>
进入Login:
index.html
- <html>
- <head><title>0903的娃赶快登录吧~</title></head>
- <body>
- {$loginfailed}
- <form method='post' action='__APP__/Login/check'>
- 学 号:<input name='snum' type='text' size='20'/><br/>
- 密 码:<input name='password' type='password' size='20'/><br/>
- <input name='submit' type='submit' value='登录'/>
- </form>
- </body>
- </html>
进入Vote:
共4个模板文件。
index.html
- <html>
- <head><title>投票~</title></head>
- <body>
- {$loginsuccess}
- {$hello}{$quit}
- {$information}
- {$reset}
- <h3>你的投票:<br/></h3>
- <table>
- <tr>
- <td><h4>投票活动</h4></td>
- <td><h4>状态</h4></td>
- </tr>
- <tr>
- <td><a href='__APP__/Vote/vote?id=1'>精神文明</a></td>
- <td>未投票</td>
- </tr>
- <tr>
- <td><a href='__APP__/Vote/vote?id=2'>优秀团员</a></td>
- <td>未投票</td>
- <tr/>
- </table>
- </body>
- </html>
resets.html
- <html>
- <head><title>用户信息~</title></head>
- <body>
- <form method='post' action='__APP__/Vote/update'>
- 真实姓名:<input type='text' name='username' size='20'/><br/>
-  密    码 :<input type='password' name='password' size='20'/><br/>
- e-mail   :<input type='type' name='email' size='20'/><br/>
- <input name='submit' type='submit' value='提交' >
- </form>
- </body>
- </html>
calculate.html
- <html>
- <head><title>投票结果~</title></head>
- <body>
- {$list}
- <a href='__APP__/Vote/vote'>返回</a>
- </body>
- </html>
vote.html
- <html>
- <head><title>投票~</title></head>
- <body>
- {$actionname}
- <form method='post' action="__APP__/Vote/calculate?type={$actiontype}">
- <input type="checkbox" name="schoolnumber[]" value='200992139'/>
- 李嘉峻
- <br/>
- <input type="checkbox" name="schoolnumber[]" value='200992263'/>
- 闻亦晨
- <br/>
- <input type="checkbox" name="schoolnumber[]" value='200992026'/>
- 高子涵
- <br/>
- <input type='submit' name='submit' value='提交'/><br/>
- </form>
- </body>
- </html>
四.回到主项目目录。解释一下三个class.*.php文件。这三个文件是phpmailer解压后得到的文件,将它们复制到项目中就可以使用phpmailer发送邮件了。
最后一个文件是Mail.php 实现邮件的发送功能。
- <?php
- require("class.phpmailer.php");
- /****************************************/
- //--应用linux的crontab来定时执行此脚本,
- //--如果到达定时的时刻则向think_classmates
- //--中所有的用户发送投票结果的邮件
- //--在规定时间之前没有投票的用户算作放弃
- /****************************************/
- /*************************************/
- //--连接数据库函数
- /*************************************/
- function Connect(){
- $conn=@mysql_connect("localhost","root","changyisheng");
- if(!$conn){
- die("连接数据库失败:".mysql_error());
- }
- mysql_select_db("Vote",$conn);
- mysql_query("set character set 'utf8'");
- }
- /*************************************/
- //--将表中的用户数据根据活动分表
- //--每一个投票活动一个数组
- /*************************************/
- function DataToArray(){
- //$User=M('final');//查询表think_final
- //$list=$User->select();
- Connect();//连接数据库
- $sql="SELECT * FROM think_final";
- $list=mysql_query($sql);//进行查询
- while($tt=mysql_fetch_array($list)){
- $snum=$tt['snum'];
- $actionname1=$tt['jingshenwenming'];
- $actionname2=$tt['youxiutuanyuan'];
- $list1[$snum]=$actionname1;
- $list2[$snum]=$actionname2;
- }
- $result[0]=$list1;
- $result[2]=$list2;
- return $result;
- }
- /**************************************/
- //--将传进来的$array数组根据票数进行排序
- //--结果返回排序好的数组
- /*************************************/
- function ArrayToData($array){
- foreach($array as $action){
- arsort($action);
- $list[]=$action;
- }
- // dump($list);
- return $list;
- }
- /**************************************/
- //--将排序好的数组中学号翻译成学生姓名
- //--结果返回一个文本(对人友好的)
- /**************************************/
- function NumberToName($array){
- //$User=M('classmates');//学生信息数据库
- Connect();
- $sql="SELECT * FROM think_classmates";
- //进行查询
- $mark=1;
- foreach($array as $action){
- if($mark==1)
- $list.="精神文明投票结果:<br/>";
- else if($mark==2)
- $list.="优秀团员投票结果<br/>";
- $mark++;
- foreach($action as $snum=>$value){
- //echo $snum;//输出学生学号
- //$username=$User->where("snum='$snum'")->getField('username');//获得学生姓名
- $array=mysql_query($sql);
- while($row =mysql_fetch_array($array)){
- if($row['snum']==$snum){
- $username=$row['username'];
- $list.=$username.":".$value."票<br/>";
- break;
- }
- }
- }
- }
- return $list;
- }
- if(time()==mktime(11,16)){
- //连接数据库
- $mail=new PHPMailer();//建立邮件发送类
- $mail->IsSMTP();//使用SMTP发送发送
- $mail->Host="smtp.qq.com";//您的企业邮局域名
- $mail->SMTPAuth=true;//启用SMTP验证功能
- $mail->Username="632849504@qq.com";//邮局用户名
- $mail->Password="changyisheng";//邮局密码
- $mail->Port=25;
- $mail->From="632849504@qq.com";//邮件发送者email地址
- $mail->FromName="icys";
- $conn=@mysql_connect("localhost","root","changyisheng");
- if(!$conn){
- die("连接数据库失败:".mysql_error());
- }
- mysql_select_db("Vote",$conn);
- mysql_query("set character set 'utf8'");
- $sql="SELECT * FROM think_classmates";
- $result=mysql_query($sql);//进行查询
- while($row =mysql_fetch_array($result)){
- // echo "学号:".$row['snum']."<br/>";
- // echo "真实姓名:".$row['username']."<br/>";
- // echo "密码:".$row['password']."<br/>";
- // echo "email".$row['email']."<br/>";
- $address=$row['email'];//接收方邮箱地址
- $username=$row['username'];//收件人姓名
- $mail->AddAddress("$address","username");//收件人地址,收件人姓名
- $mail->IsHTML(true); //以HTML方式进行发送
- $mail->Subject="投票结果";
- //$mail->Body="Hello";
- /*************************/
- //--邮件内容
- /*************************/
- $array=DataToArray();
- //var_dump($array);
- $array=ArrayToData($array);
- //var_dump($array);
- $list=NumberToName($array);
- $mail->Body=$list;
- if(!$mail->Send()){
- echo "邮件发送失败.<p>";
- echo "错误原因:".$mail->ErrorInfo;
- exit;
- }
- //echo "邮件发送成功";
- }
- }
- ?>
最后要实现定时发送邮件的功能(我是每天的11点16分给我的邮箱发送邮件)要更改一下crontab文件 。linux下是在命令行下 crontab -e 回车
在最底下(因为原来没有设过)加入下面一行*/1 * * * /usr/bin/php /var/www/htdocs/Vote/Mail.php
至于其中每一项代表什么,大家可以查一下crontab网上有很多讲解。
数据库设计如下:
think_classmates表:
think_final表:
转载于:https://blog.51cto.com/icys13/675171