最近学习php框架ThinkPHP.话说学习技术最简单的方法就是动手,所以自己写了一个简单的投票系统(无美工...),环境是LAMP。
这个简单投票系统是给我班做投票用的,写的仓促,交互不好。第一次写希望大家多多包涵。
ThinkPHP的规范这里就不说了,先来项目结构。
其中3个class.*.php是发送邮件的脚本。其他文件夹的作用学过ThinkPHP的应该都清楚,在此就不解释了。
一.index.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
// 本文档自动生成,仅供测试运行
classIndexActionextendsAction
{
publicfunctionindex(){$this->display();
}
}
?>
LoginAction.class.php
classLoginActionextendsAction{
publicfunctionindex(){
$this->display();
}
/****************************************************
-对用户提交的用户信息进行检查
-***************************************************/
publicfunctioncheck(){
$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="用户名或密码错误
";
$this->assign('loginfailed',$loginfailed);
$this->display('index');
}
}
}
?>
QuitAction.class.php
实现用户的退出功能.销毁用户 SESSION.
classQuitActionextendsAction{
publicfunctionindex(){
session_start();
unset($_SESSION['username']);
$this->redirect('Index/index');
}
}
?>
VoteAction.class.php
classVoteActionextendsAction{
/******************************************/
//--显示投票首页信息 包括用户信息的显示 及
//--目前可以 进行投票的活动
/*******************************************/
publicfunctionindex(){
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=" | 退出
";
$information="用户信息:
"."真实姓名:".$username."
邮箱:".$email;
$reset="重填";
$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');
}
/***************************************************/
//--用户信息重置 包括用户真实姓名,密码,
//--电子邮件地址的设置
/**************************************************/
publicfunctionresets(){
session_start();
if(isset($_SESSION['snum'])){
$this->display();
}
else
$this->redirect('Index/index');
}
publicfunctionupdate(){
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="信息更新成功
";
$this->assign('updatesuccess',$updatesuccess);
$this->redirect('Vote/index');
}
else
$this->redirect('Index/index');
}
/*******************************************************/
//--用户参与的一个投票活动。
//--主要功能是判断用户参与的是哪种投票活动
/******************************************************/
publicfunctionvote(){
if(isset($_SESSION['snum'])){
$id=$_GET['id'];
/*if($id==1)
echo "精神文明";
`else if ($id==2)
echo "优秀团员";*/
if($id==1){
$actionname="精神文明投票:
";
$actiontype='jingshenwenming';
}
elseif($id==2){
$actionname="优秀团员投票:
";
$actiontype='youxiutuanyuan';
}
$this->assign('actionname',$actionname);
$this->assign('actiontype',$actiontype);
$this->display();}
else
$this->redirect('Index/index');
}
/*****************************************************************/
//--对用户的投票进行计算,并更新数据库
//--显示用户此次投票活动的选择
/*****************************************************************/
publicfunctioncalculate(){
if(isset($_SESSION['snum'])){
$actiontype=$_GET['type'];//获得投票活动类型
$schoolnumber=array();//声明复选框数组
$schoolnumber=$_POST['schoolnumber'];
$list='你选的候选人如下:
';//显示提示信息
$Can=M('final');//创建投票活动表连接
$User=M('classmates');//创建用户信息表连接
foreach($schoolnumberas$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.='
';
}
}
$this->assign('list',$list);
$this->display();
}
else
$this->redirect('Index/index');
}
}
?>
三.进入项目目录下的/Tpl/default/目录 共3个模板目录。
进入Index :
index.html
欢迎投票中心登录
进入Login:
index.html
0903的娃赶快登录吧~{$loginfailed}
学 号:
密 码:
进入Vote:
共4个模板文件。
index.html
投票~{$loginsuccess}
{$hello}{$quit}
{$information}
{$reset}
投票活动 |
状态 |
精神文明 | 未投票 |
优秀团员 | 未投票 |
resets.html
用户信息~真实姓名:
 密    码 :
e-mail   :
calculate.html
投票结果~{$list}
返回
vote.html
投票~{$actionname}
李嘉峻
闻亦晨
高子涵
四.回到主项目目录。解释一下三个class.*.php文件。这三个文件是phpmailer解压后得到的文件,将它们复制到项目中就可以使用phpmailer发送邮件了。
最后一个文件是Mail.php 实现邮件的发送功能。
require("class.phpmailer.php");
/****************************************/
//--应用linux的crontab来定时执行此脚本,
//--如果到达定时的时刻则向think_classmates
//--中所有的用户发送投票结果的邮件
//--在规定时间之前没有投票的用户算作放弃
/****************************************/
/*************************************/
//--连接数据库函数
/*************************************/
functionConnect(){
$conn=@mysql_connect("localhost","root","changyisheng");
if(!$conn){
die("连接数据库失败:".mysql_error());
}
mysql_select_db("Vote",$conn);
mysql_query("set character set 'utf8'");
}
/*************************************/
//--将表中的用户数据根据活动分表
//--每一个投票活动一个数组
/*************************************/
functionDataToArray(){
//$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数组根据票数进行排序
//--结果返回排序好的数组
/*************************************/
functionArrayToData($array){
foreach($arrayas$action){
arsort($action);
$list[]=$action;
}
// dump($list);
return$list;
}
/**************************************/
//--将排序好的数组中学号翻译成学生姓名
//--结果返回一个文本(对人友好的)
/**************************************/
functionNumberToName($array){
//$User=M('classmates');//学生信息数据库
Connect();
$sql="SELECT * FROM think_classmates";
//进行查询
$mark=1;
foreach($arrayas$action){
if($mark==1)
$list.="精神文明投票结果:
";
elseif($mark==2)
$list.="优秀团员投票结果
";
$mark++;
foreach($actionas$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."票
";
break;
}
}
}
}
return$list;
}
if(time()==mktime(11,16)){
//连接数据库
$mail=newPHPMailer();//建立邮件发送类
$mail->IsSMTP();//使用SMTP发送发送
$mail->Host="smtp.qq.com";//您的企业邮局域名
$mail->SMTPAuth=true;//启用SMTP验证功能
$mail->Username="[email protected]";//邮局用户名
$mail->Password="changyisheng";//邮局密码
$mail->Port=25;
$mail->From="[email protected]";//邮件发送者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']."
";
// echo "真实姓名:".$row['username']."
";
// echo "密码:".$row['password']."
";
// echo "email".$row['email']."
";
$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"邮件发送失败.
";
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表: