前言

    最近有个需求,就是宿舍的学委要去飞去银川参加程序设计国际区域赛了。由于比赛期间不能带电脑,身为宿友的我看他因收作业没时间收而感到有一点点同情,肯定不是因为他要给我带特产我才写的!于是在两天的有空的时间余下给他写了个交作业系统。PHP实现在指定时间打包文件夹以及将其作为附件发送到指定邮箱,此项目技术栈没有用任何架构。纯属基础。

  • 文章目录

    • 前言
      • 实现的功能
      • 重要功能的实现方法
        • 发送邮件
        • 时间精确判断
        • 压缩文件
        • 任务执行文件
        • 文件夹操作
      • 实现原理
      • 准备工作
      • 步骤
      • 实战: 效果截图
      • 演示视频:
      • 总结
        • 偶尔遇到的坑
        • 感慨

实现的功能

    同学可以上传作业文件,后台接收发起者指定类型和大小范围内的文件并将其放在生成的作业链接【这里采用md5校验】文件夹下,发起者可以设置交作业的开始时间和结束时间,作业标题和格式,各种消息通知,设置是否时间结束自动发送还是认为发送,下载打包文件,可以自由添加学生名单,时间一结束将系统自动打包作业文件夹并命名好指定名字将其发送到指定目标邮件。

重要功能的实现方法

  • 发送邮件
  • 时间精确判断
  • 压缩文件
  • 执行任务文件
  • 文件以及文件夹操作
  • 公众号登入,提交多次

发送邮件

1.打开qq邮箱。点击设置【这里我使用的是qq邮箱,你也可以使用163】

2.点击账户

3.点击开启smtp服务
4.获取授权码、【没有这个系统没有权限使用你的邮箱发送邮件】

5.重点
你需要了解到 php最多人用的发送email的sdk是什么。并不是自带的核心email函数。而是PHPMailer这个神奇的功能api包。点击到Github下载
使用方法:
将 PHPMailer-master项目文件夹放至指定位置,然后通过引用的方式进行调用
这里我放在了项目根目录下。

代码:

 <?phperror_reporting(0);if(!$_POST['email']){ //发送目标邮箱echo('未接收到email');return ;}if(!$_POST['code']){//前后端验证echo('没有验证码');return ;}use PHPMailer\PHPMailer\PHPMailer;use PHPMailer\PHPMailer\Exception;require '../PHPMailer-master/src/Exception.php'; //目录,我放到根目录,所以要退回前一级目录 ../require '../PHPMailer-master/src/PHPMailer.php';require '../PHPMailer-master/src/SMTP.php';$mail = new PHPMailer(true);  //学过java的就知道,这是干啥new一个对象,然后下面可以调用对象的方法try {//服务器配置$mail->CharSet ="UTF-8";                     //设定邮件编码,一般是UTF-8$mail->SMTPDebug = 0;                       $mail->isSMTP();                             // 使用SMTP 如果没有开启,那么会发送失败$mail->Host = 'smtp.qq.com';                // SMTP服务器 我在这里实验的是smtp.qq.com//你也可以 查找自己对应的邮件服务器。 win+R 输入cmd 找到对应ip$mail->SMTPAuth = true;                      $mail->Username = '12345678910@qq.com';                // SMTP 用户名  即邮箱的用户名 这里可以用数据库查询是否用自己的邮箱去发送给老师$mail->Password = '这里是上面步骤获取的授权码';             // SMTP 密码 $mail->SMTPSecure = 'ssl';                   $mail->Port = 465;                          $mail->setFrom('12345678901@qq.com', '发起者名称');  //发件人  这里可以用数据库查询是否用自己的邮箱去发送给老师$mail->addAddress($_POST['email'],"用户".$_POST['email']);  // 收件人//发送附件 这里发送作业$mail->addAttachment('../xy.zip');         // 添加附件$mail->Subject = 'CharlinHeng【'.$_POST['code'].'】' . date("Y-m-d H:i:s",time());$text="这里放置 未交学生名单 "; //这里可以定义 未交学生名单,计算学生名单的 算法下面给出。$mail->Body    = '<p>'.$text.'</p>' . date('Y-m-d H:i:s');$mail->AltBody = $text;$mail->send();echo '邮件发送成功';} catch (Exception $e) {echo '邮件发送失败: ', $mail->ErrorInfo;
}

时间精确判断

    很简单的算法,对于执行时间判断条件,需要用当前时间的毫秒数,从格林威治时间到现在的毫秒数。去比较交作业开始时间和交作业结束时间,去减,如果当前时间减去开始时间大于0,那么已经开始,计算当前时间减去结束时间,如果大于0,那么已结束,否则取差的绝对值,然后将毫秒转换成普通用户看的标准的日期时间格式,距离结束还有XX。如果当前时间减去开始时间小于0,那么没有开始,取差的绝对值,后将毫秒转换成普通用户看的标准的日期时间格式,距离开始还有XX。

  核心计算函数:strtotime()//转化为格林威治毫秒

代码

                         $statue = 0;//$data[6]就是 开始时间或者结束时间.可以换$T = strtotime($data[6]);$all = floor((time()-$T));if($all>0){$statue = 0;echo('已结束!');}else{$T = strtotime($data[5]);$all = floor((time()-$T));if($all>0){echo('已经开始!剩余时间:');$statue = 1;$T = strtotime($data[6]);$all = floor(($T-time())); }else{$statue = 0;echo "未开始:倒计时";}$all = abs($all);//                           $dS = $all;//                          $dY = floor($all);//                           $dM = 0;$dD = floor($all/(3600*24));$all = $all-floor($all/60/60/24);$dH = floor($all/3600);$all = $all-floor($all/60/24);$dM = floor($all/60);$all = $all-floor($all/60);$dS = $all;//年月日时分秒////$all 得到的是多少分钟以前    if ($dD>0){$finally_time = ($dD).'天';}else if($dH>0){$finally_time = $dH.'小时';}else if($dM>0){$finally_time = $dM.'分钟';}else{$finally_time = $dS.'秒';}echo $finally_time;}

任务执行判断也是同理,这里不做叙述。

压缩文件

压缩文件夹,打包成zip的方式,如果下面的步骤你做完了,但是还是不成功,你可以去找到php.ini文件,开启支持扩展方式,即可以在文尾加上一句话。

extension=php_zip.dll

核心代码:

error_reporting(0);ob_start();if(!$_GET['md5']){echo "没有定义目录";return ;}echo "打包中...<br>";$dataPath="receiveHomework/homeworks/".$_GET['md5']."/";//BUG$fileName = "17创新实验班实验1.zip";// 自定义打包 文件名命名 可以从数据库读取$fileName = iconv('utf-8','gb2312',$fileName);$fileName = $dataPath.$fileName;if(!file_exists($fileName)){//重新生成文件$zip = new ZipArchive();//php内置打包类if ($zip->open($fileName, ZIPARCHIVE::CREATE)!==TRUE) {exit('无法打开文件,或者文件创建失败');}$datalist=list_dir($tmpPath);foreach($datalist as $val){if(file_exists($val)){$zip->addFile($val, str_replace($tmpPath, '', $val));}}$zip->close();}echo "<br>";//获取上传学生作业的文件列表$count = 0;function list_dir($dir){$result = array();if (is_dir($dir)){$file_dir = scandir($dir);foreach($file_dir as $file){if ($file == '.' || $file == '..'){continue;}elseif (is_dir($dir.$file)){$result = array_merge($result, list_dir($dir.$file.'/'));}else{array_push($result, $dir.$file);$count++;echo "正在打包第".$count." 份作业....<br>"; //这里,可能有多个作业,需要展示给前端页面看具体打包过程。}}}return $result;}echo $_GET['md5']."<br>打包成功!";sleep(1);//打包后,发送邮件,汇报情况if($_GET['send']){header("location:send-time-Mail.php?x=".$_GET['x']);return ;}header("location:downloadFiles.php?md5=".$_GET['md5']."&filename=".$urlpara);

任务执行文件

这里用啥方法都行,本人在这里定义用了XMLHttpRequest对象,方便使用FormData。

$(document).ready(function(){});function judge(){if(window.XMLHttpRequest){var request = new XMLHttpRequest();request.onreadystatechange=function(){if(request.readyState==4&&request.status==200){$('#div').prop('scrollTop',document.getElementById("div").scrollHeight);document.write(request.responseText);document.clear;if(request.responseText.indexOf("成功")!=-1){//notices sender sned ok//pirnt all each type data}}};request.open("GET",'handle_system_auto.php',true);request.send();}}window.setInterval(function (){judge();},8000);judge();

文件夹操作

1.php移动指定文件夹下的tmp临时文件

$success = move_uploaded_file($file_tmp,$path.$name);

2.删除指定目录下的文件

unlink("./".$path.$name_edata);

3.生成空文件夹

$dir = iconv("UTF-8", "GBK", $path2);
if (!file_exists($dir)){mkdir ($dir,0777,true);//个人感觉挺多函数都跟系统命令差不多语法。echo "新建文件夹成功!";}

4.获取前端js FormData的post过来的file

 $file = $_FILES['file'];$fileName = $_FILES['file']['name'];$file_tmp = $_FILES['file']['tmp_name'];

实现原理

  1. 首先,需要先定义好,交作业开始和结束时间,格式,标题,说明,将这些存到数据库指定的表,并随机生成一个md5作业链接。
  2. 交作业的同学只能交一次,即含有该名字的文件只能上传一次,交了的同学对应表中有记录。
  3. 判断类型,后台只接收数据库存的发起者设置的接收的文件类型和大小范围。
  4. 将上传的文件存到对应作业链接文件夹,如果文件夹不存在,则创建一个。
  5. 写一个定时执行任务html文件和检测执行php文件,检查数据库字段 状态为0,即没有完成的作业的结束时间,如果时间已到,而且发起者规定了自动发送,那么寻找目标邮箱,对文件进行打包,作为附件,发送。否则提醒发起者,作业已结束。
  6. 发送之后邮箱通知发起者结果。
  7. 任务文件基本运行流程图:
执行文件
符合时间和要求
打包结果
打印结果
打包成功,不发送
打包成功自动发送
少于3次发送失败,自环
返回结果
返回结果
发送结果
定时执行html文件
php文件判断
打包目标文件夹
提醒发起者
发送目标邮件

准备工作

  1. 邮件发送者的邮箱需要开启smtp/pop3服务和获得授权码。
  2. 服务器或者云主机一台。【用自己电脑也可,但是就是需要一天到晚挂浏览器运行】

注:服务器和云主机方面,如果想了解如何快速获得一台免费云主机免费服务器教程,1小时内即可让别人访问你的网站。可以留个言,本人会另外写一篇关于1小时即可拥有自己的网站博客文章,免备案系列。

步骤

1.根据需求,设计作业的表。

作业表 对应的SQL语句如下

CREATE TABLE `homeWork` (
`x`  int(11) NOT NULL AUTO_INCREMENT ,
`userid`  int(11) NULL DEFAULT NULL ,
`path`  varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL ,
`title`  text(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL ,
`format_`  tinytext CHARACTER SET utf8 COLLATE utf8_general_ci NULL ,
`starttime`  tinytext CHARACTER SET utf8 COLLATE utf8_general_ci NULL ,
`endtime`  tinytext CHARACTER SET utf8 COLLATE utf8_general_ci NULL ,
`auto_sendemail`  text CHARACTER SET utf8 COLLATE utf8_general_ci NULL ,
`email`  tinytext CHARACTER SET utf8 COLLATE utf8_general_ci NULL ,
`use_you_email`  text CHARACTER SET utf8 COLLATE utf8_general_ci NULL ,
`youemail`  tinytext CHARACTER SET utf8 COLLATE utf8_general_ci NULL ,
`studentnum`  int NULL DEFAULT NULL ,
`noticesyou`  text CHARACTER SET utf8 COLLATE utf8_general_ci NULL ,
`student`  text CHARACTER SET utf8 COLLATE utf8_general_ci NULL ,
`buildtime`  char(25) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
`statue`  int(11) NULL DEFAULT NULL ,
PRIMARY KEY (`x`)
)
ENGINE=InnoDB
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
AUTO_INCREMENT=29
ROW_FORMAT=DYNAMIC
;

对于交了作业的同学,还需要记录到另外一个表里。

CREATE TABLE `receiveStudentFile` (
`x`  int(11) NOT NULL AUTO_INCREMENT ,
`md5FileName`  char(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
`studentName`  text CHARACTER SET utf8 COLLATE utf8_general_ci NULL ,
`filename`  text CHARACTER SET utf8 COLLATE utf8_general_ci NULL ,
`uploadcount`  int(11) NULL DEFAULT NULL ,
`uploadtime`  char(25) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
`statue`  int(11) NULL DEFAULT NULL ,
PRIMARY KEY (`x`)
)
ENGINE=InnoDB
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
AUTO_INCREMENT=64
ROW_FORMAT=DYNAMIC
;

2.设计前端页面
        发起者的 设计新建作业、查看我的收作业、作业管理、交作业页面。这里比较简单,但比较花费时间,不做叙述。
3.功能编写
       对于交作业的homework页面,需要加载作业详情。同时还应前后端判断作业在改时间是否可上传。 注:[考虑到开发只有2天以及使用用户基数,所以没采用前后端分离,采用前后端内嵌式]。
交作业homework页面的代码如下:

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>作业</title>
<link rel="stylesheet" type="text/css" href="../css/tooltip_css/tooltip.css">
<link rel="stylesheet" type="text/css" href="../css/homework.css">
<script src="../js/tooltipNeed/tooltip_1_js.js"></script>
<script src="../js/tooltipNeed/tooltip_2_js.js"></script>
</head>
<?phperror_reporting(0);if(!$_GET['md5code']){echo('<a style="color:red;position:relative;top:20vw;margin:0 auto;justify-content: center;display:flex;">请输入正确的网页链接!</a>');return ;}if(!$_COOKIE['counts']){setcookie('counts',0,time()+3600*24*30);   }$md5 = $_GET['md5code'];require_once('connect.php');$query_is_exist = "select * from homework where path='".$md5."'";$result = mysqli_query($connect_to_database,$query_is_exist);$this_result = mysqli_fetch_array($result);if($this_result[0]==""){echo('<a style="color:red;position:relative;top:20vw;margin:0 auto;justify-content: center;display:flex;">该作业详情不存在!</a>');return ;}else{$data = $this_result;}?>
<body><div class="main"><div class="nav"><ul class="inn"><li></li><li style="font-size: 11px;"><?php $q = "select count(*) from userreceive where md5='".$_GET['md5code']."'";$dataw =  mysqli_query($connect_to_database,$q);$q = mysqli_fetch_array($dataw)[0];?>需交人数:<font style="color: brown;"><?php echo($data[11]); ?></font>人</li><li>已交<font style="color: green;"><?php echo $q; ?> </font>人</li><li>未交<font style="color: red;"> <?php echo($data[11]-$q); ?> </font>人</li><li><a class="aa">按时间排序</a></li><li><a class="aa" title="如果发起的作业没有设置学生名单,那么将不可用" onClick="get_student_homework()">未交学生名单</a></li></ul></div><div class="left"><table class="left_table"><tr class="trw" style="font-weight: bolder;"><td colspan="2"></td><td colspan="3" align="center">已交同学姓名</td><td colspan="8" align="center">提交文件名称</td><td colspan="3" align="center">提交时间</td><td colspan="2" align="center">提交次数</td>           <td colspan="2"></td>    </tr><?phprequire_once('connect.php');$q = "select * from userreceive where md5='".$_GET['md5code']."'";$dataw =  mysqli_query($connect_to_database,$q);$i = 0;while($every = mysqli_fetch_array($dataw)){if($i%2){echo('<tr class="trw"><td colspan="2"></td><td colspan="3" align="center">'.$every[2].'</td><td colspan="8" align="center">'.$every[3].'</td><td colspan="3" align="center">'.$every[5].'</td><td colspan="2" align="center">'.$every[4].'</td>         <td colspan="2"></td>    </tr>');}else{echo('<tr><td colspan="2"></td><td colspan="3" align="center">'.$every[2].'</td><td colspan="8" align="center">'.$every[3].'</td><td colspan="3" align="center">'.$every[5].'</td><td colspan="2" align="center">'.$every[4].'</td>          <td colspan="2"></td>    </tr>');}$i++;}if($i==0){echo('<tr></tr><tr></tr><tr></tr><tr></tr><tr></tr><tr></tr><tr></tr><tr></tr><tr></tr><tr></tr><tr><td colspan="20" align="center" style="color:gray;">暂时还没有同学提交,快来抢沙发吧!</td></tr>');}?><tr>
<!--             trw--><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr></table></div><div class="right"><table class="right_table"><tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td colspan="10"><h3 align="center" style="margin: 0;"><?php echo($data[3]); ?></h3></td></tr><tr></tr><tr><td colspan="2" style="color: gray;font-size: 10px;" align="right">格式要求:</td><td colspan="8"><h6 style="margin: 0;color: red;font-size: 13px;"><?php echo($data[4]); ?></h6></td></tr><tr><td colspan="2" align="right">发起人:</td><td colspan="8"><font class="text"><?php$id = $data[1];$quer = "select * from moreuserdata where userid=".$id."";$result = mysqli_query($connect_to_database,$quer);$result = mysqli_fetch_array($result)[3];if($result=="-"){$quer = "select * from users where userid=".$id."";$result = mysqli_query($connect_to_database,$quer);$result = mysqli_fetch_array($result)[1];echo $result;}else{echo($result);}  ?></font></td></tr><tr></tr><tr><td colspan="10" align="center"><img src="register_php/user/<?php echo($id); ?>/icon/A.jpg" style="width: 40px;height: 40px;margin: 0 auto;border-radius: 25px;" alt=""></td></tr><tr></tr><tr><td colspan="3">作业开始时间:</td><td colspan="7"><font class="text"><?php echo($data[5]) ?></font></td></tr><tr><td colspan="3">作业结束时间</td><td colspan="7"><font class="text"><?php echo($data[6]) ?></font></td></tr><tr></tr><tr><td colspan="10"><?phpif($data[7]=="false"){echo('备注:发起者未采用准时邮件发送系统。');}else{echo('备注:发起者采用了准时邮件发送系统,超过时间系统自动打包作业邮件发送给老师邮箱。');}?></td></tr><tr></tr><tr><td colspan="10" align="center"><font style="color: green;font-size: 20px;font-weight: bolder;"><?php//计算时间·段 $statue = 0;$T = strtotime($data[6]);$all = floor((time()-$T));if($all>0){$statue = 0;echo('已结束!');}else{$T = strtotime($data[5]);$all = floor((time()-$T));if($all>0){echo('已经开始!剩余时间:');$statue = 1;$T = strtotime($data[6]);$all = floor(($T-time())); }else{$statue = 0;echo "未开始:倒计时";}$all = abs($all);//                           $dS = $all;//                          $dY = floor($all);//                           $dM = 0;$dD = floor($all/(3600*24));$all = $all-floor($all/60/60/24);$dH = floor($all/3600);$all = $all-floor($all/60/24);$dM = floor($all/60);$all = $all-floor($all/60);$dS = $all;//年月日时分秒////$all 得到的是多少分钟以前    if ($dD>0){$finally_time = ($dD).'天';}else if($dH>0){$finally_time = $dH.'小时';}else if($dM>0){$finally_time = $dM.'分钟';}else{$finally_time = $dS.'秒';}echo $finally_time;}?></font></td></tr></table><hr style="background:linear-gradient(to right,rgba(0,0,0,0.3),rgba(255,0,0,0.3));color: transparent;width: 90%;height: 0.1px;"><input type="text" id="md5value" value="<?php echo $_GET['md5code']; ?>" hidden=""><input type="file" hidden="" id="bufile" onChange="loadfile(this)" accept="application/"><table class="right_table"><tr><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td colspan="10" align="center">已提交次数:<?php echo $_COOKIE['counts']; ?></td></tr><tr><td colspan="10" align="center"><button class="sure_b" <?php if($statue==0){echo(' title="当前状态不能上传作业!"');}else{echo(' onClick="start()"');} ?> >点击提交</button></td></tr><tr></tr><tr><td colspan="10" align="center">提示:如果未设置准时发送邮件,可以联系发送者进行设置延期提交。否则规定时间外不得提交作业!;<br><font style="color: red;font-weight: bolder;">当前设置了只有一次提交机会,请谨慎提交</font></td></tr></table></div><div class="nav"></div></div><div class="tip" id="tips"><div style="height: 10px;"></div><a id="fff" style="justify-content: center;display: flex;margin: 0 auto;">sdasdas</a></div><div style="width: 1000px;height: 30px; margin: 0 auto;position: relative;top: 100px;font-size: 10px;color: gray;"><a style="justify-content: center;display: flex;margin: 0 auto;">CharLinHeng all Reserved .</a></div>
</body>
</html>
<script>$(document).tooltip();var times = 100;var ani;var successa= 1;function start(){$("#bufile").click();}function loadfile(boj){var file = boj.files[0];if(file.name.split(".")[(file.name.split(".").length-1)]!="docx"&&file.name.split(".")[(file.name.split(".").length-1)]!="doc"&&file.name.split(".")[(file.name.split(".").length-1)]!="jpg"&&file.name.split(".")[(file.name.split(".").length-1)]!="png"&&file.name.split(".")[(file.name.split(".").length-1)]!="pdf"&&file.name.split(".")[(file.name.split(".").length-1)]!="exe"){$("#fff").text("不支持的格式!");times = 2;$("#tips").css("display","block");ani = window.setInterval(function(){countds()},1000);return ;}//var datas = new FormData();datas.append("md5",$("#md5value").val());datas.append("file",file);$("#fff").text("上传中....");$("#tips").css("display","block");if(window.XMLHttpRequest){var request = new XMLHttpRequest();request.onreadystatechange=function(){if(request.readyState==4&&request.status==200){$("#fff").text( request.responseText);times = 3;if(request.responseText.indexOf("成功")!=-1){successa = 0;}$("#tips").css("display","block");ani = window.setInterval(function(){countds()},1000);}};request.upload.onprogress = function (evt) {if (evt.lengthComputable) {var percentComplete = Math.round(evt.loaded * 100 / evt.total);$("#tips").css("display","block");$("#fff").text("上传进度:"+percentComplete+"%");}};request.open("POST","acceptHomework.php",true);request.send(datas);}}function countds(){times--;if(times<=0){$("#tips").css("display","none");clearInterval(ani);if(successa!=1){window.location.href=window.location.href;}return ;}}function get_student_homework(){window.open("noload.php?md5="+$("#md5value").val());}
</script>

新建作业文件的代码:

<?phperror_reporting(0);require_once('connect.php');if($_POST['title']&&$_COOKIE['userid']){$size = rand(1000,2000);$size = md5($size);$query = "insert into homework(`userid`, `path`, `title`, `format_`, `starttime`, `endtime`, `auto_sendemail`, `email`, `use_you_email`, `youemail`, `studentnum`, `noticesyou`, `student`, `buildtime`, `statue`) values(".$_COOKIE['userid'].",'".$size."','".$_POST['title']."','".$_POST['format']."','".$_POST['starttime']."','".$_POST['endtime']."','".$_POST['auto_send']."','".$_POST['auto_send_email']."','".$_POST['use_my']."','".$_POST['use_my_1']."',".$_POST['num'].",'".$_POST['notices']."','".$_POST['content']."','".date("Y-m-d H:i:s",time())."',0)";$result = mysqli_query($connect_to_database,$query);if($result){echo('新建成功!您这次交作业的链接,请保管好!|  http://www.erremall.top/neusoftforum/php/homework.php?md5code='.$size);//需要建立文件夹$dir = iconv("UTF-8", "GBK", "receiveHomework/homeworks/".$size);if (!file_exists($dir)){mkdir ($dir,0777,true);}else{echo("建立失败,已存在相同类型MD5,请重新提交");}}else{echo('服务器繁忙!');}}
?>

后台处理文件acceptHomework.php的代码如下:

<?phperror_reporting(0);require_once('connect.php');header("Content-Type: text/html;charset=utf-8");if(!$_POST['md5']){echo "文件太大!文件最多不能超过200M";return ;}$md5 = $_POST['md5'];$_COOKIE['counts']++;$query_is_exist = "select * from homework where path='".$md5."'";$result = mysqli_query($connect_to_database,$query_is_exist);$this_result = mysqli_fetch_array($result);$T = strtotime($this_result[6]);$all = floor((time()-$T));if($all>0){echo "已结束";return ;}else{$T = strtotime($this_result[5]);$all = floor((time()-$T));if($all<0){echo "未开始";return ;}}$file = $_FILES['file'];$fileName = $_FILES['file']['name'];$file_tmp = $_FILES['file']['tmp_name'];$path = "receiveHomework/homeworks/".$md5."/";$path2 = "receiveHomework/homeworks/".$md5;$dir = iconv("UTF-8", "GBK", $path2);if (!file_exists($dir)){mkdir ($dir,0777,true);echo "新建文件夹成功!";}$path = "receiveHomework/homeworks/".$md5."/";$name = iconv('utf-8','gb2312',$fileName);//查找是否有这个同学,是否提交过,如果是,那么覆盖$datanames = explode("\n",$this_result[13]);$name_  ="";$has_recode = false;$repeat = 0;for($i = 0;$i<count($datanames);$i++){if(strstr(trim($fileName),trim($datanames[$i]))===false){}  else{$has_recode = true;$repeat = 1;$name_ = $datanames[$i];break;}
//      echo $datanames;}//repeat if($repeat==1){$query = "select x from userreceive where studentName='".$name_."' and md5='".$md5."'";$query = mysqli_query($connect_to_database,$query);$query = mysqli_fetch_array($query);if($query[0]!=""){echo "为防止其他同学恶意篡改,只有一次提交机会!";return ;}}if(strlen($this_result[13])>2){$query_has_sub ="select studentName,filename from  userreceive where md5='".$md5."' and studentName='".$name_."'";$quee = mysqli_query($connect_to_database,$query_has_sub);$edata = mysqli_fetch_array($quee);if($edata[0]!=""){$repeat = 1;}else{$repeat = 0;}}else{$repeat = 0;}if($repeat==1){$name_edata = iconv('utf-8','gb2312',$edata[1]);unlink("./".$path.$name_edata);echo "更新文件成功!";}//查找 文件名有没有出现在数据库里,有,则覆盖$sele_repeat_file = "select filename,x from userreceive where filename='".$fileName."'";$Q = mysqli_query($connect_to_database,$sele_repeat_file);$repeat_same_file = 0;$eeeeee = mysqli_fetch_array($Q);$repeat_file_id = $eeeeee[1];$eeeeee = $eeeeee[0];if($eeeeee[0]!=""){echo "已覆盖文件";$name_edata = iconv('utf-8','gb2312',$fileName);unlink("./".$path.$name_edata);$repeat_same_file = 1;}//$success = move_uploaded_file($file_tmp,$path.$name);if($success){//新增 用户信息//先搜索学生名字$names = "-";if(strlen($this_result[13])<2){echo "该作业没有定义名单";}else{//有$dataname = explode("\n",$this_result[13]);$is_has = false;$names = "";for($i = 0;$i<count($dataname);$i++){if(strstr(trim($fileName),trim($dataname[$i]))===false){} else{$is_has = true;$names = $dataname[$i];break;}}if($is_has){if($repeat!=1)echo $names." 同学,提交成功啦!";}else{echo "该同学没有找到,请注意格式或者联系发起者更换名单!上传的文件已删除";unlink("./".$path.$name);return ;}}$timesq = $_COOKIE['counts'];if($timesq==0){$timesq = 1;}if($timesq==1){$has_fix = 0;}else{$has_fix = 1;}if($repeat==1||$repeat_same_file==1){if($repeat_same_file==1){$insert_data = "update userreceive set filename='".$fileName."',uploadtime='".Date("Y-m-d H:i:s",time())."',statue=1,uploadcount=".$timesq." where md5='".$md5."' and x=".$repeat_file_id;  }else{$insert_data = "update userreceive set filename='".$fileName."',uploadtime='".Date("Y-m-d H:i:s",time())."',statue=1,uploadcount=".$timesq." where md5='".$md5."' and studentName='".$names."'"; }}else{$insert_data = "insert into userreceive( `md5`, `studentName`, `filename`, `uploadcount`, `uploadtime`, `statue`) values('".$md5."','".$names."','".$fileName."',".$timesq.",'".Date("Y-m-d H:i:s",time())."',".$has_fix.")";   }$result = mysqli_query($connect_to_database,$insert_data);if($result){if($repeat!=1){echo('上传成功!');    }else{echo('更新成功!');  }}else{echo ("上传失败");}}else{echo '上传失败!请重试,可能是网络的原因.';}
?>

定时执行任务html文件:

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<script src="../js/jquery_need.js"></script>
<title>自动发送系统</title>
</head><body id="div"><div id="tip" style="width: 1000px;height: 500px;overflow-y: auto;margin: 0 auto;position: relative;top: 10vw;justify-content: center;display: flex;margin: 0 auto;word-break: break-all;word-wrap: break-word;">提示</div></body>
</html>
<script>$(document).ready(function(){});function judge(){if(window.XMLHttpRequest){var request = new XMLHttpRequest();request.onreadystatechange=function(){if(request.readyState==4&&request.status==200){//                  $('#div').prop('scrollTop',document.getElementById("div").scrollHeight);document.write(request.responseText);document.clear;if(request.responseText.indexOf("success")!=-1){//notices sender sned ok// print relative data... For example, email send Result.}}};request.open("GET",'handle_system_auto.php',true);request.send();}}window.setInterval(function (){judge();},8000); //you can adjust exec time 。你可以改变执行时间judge();
</script>

后台定时处理php文件:

<?php//及时判断。error_reporting(0);require_once('connect.php')  ;//计算时间·段 $query_has_send = "select x,title,path,endtime from homework where  statue=0";$query_is_exist = mysqli_query($connect_to_database,$query_has_send);while($every_homework = mysqli_fetch_array($query_is_exist)){$curr = strtotime($every_homework[3]);$rest = floor(time()-$curr);if($rest>=0){echo "编号:".$every_homework[0].",".$every_homework[1]." <a style='color:green;'>该作业可以打包发送了。</a><br>";//然后发送邮件给他 send mail for he//压缩 run zip files.~header("location:zip_files.php?md5=".$every_homework[2]."&send=1&x=".$every_homework[0]);//发送邮件//邮件通知//更改结果//break;}else{echo $every_homework[1]." 时候未到,剩余:";$all = abs($rest);$dD = floor($all/(3600*24));$all = $all-floor($all/60/60/24);$dH = floor($all/3600);$all = $all-floor($all/60/24);$dM = floor($all/60);$all = $all-floor($all/60);$dS = $all;//年月日时分秒if ($dD>0){$finally_time = ($dD).'天';}else if($dH>0){$finally_time = $dH.'小时';}else if($dM>0){$finally_time = $dM.'分钟';}else{$finally_time = $dS.'秒';}echo $finally_time."<br>";}}
?>

后台管理:

<?phperror_reporting(0);
//  class Handle{//      function Handle(){//
//
//      }
//
//  }if(!$_GET['id']&&!$_GET['stopid']&&!$_GET['lateDate']&&!$_GET['sender']&&!$_GET['goaler']&&!$_GET['zip']){echo "抱歉,请求参数出现错误,请重新尝试!";return ;}require_once('connect.php');if($_GET['id']){ //删除 $id_md5_file = $_GET['id'];$name = "select filename,md5 from userreceive where x=".$id_md5_file;$name_query = mysqli_query($connect_to_database,$name);$name_set = mysqli_fetch_array($name_query);$name_set_data = $name_set[0];$md5data = $name_set[1];$query_update = "delete from userreceive where x = ".$id_md5_file;$end_result = mysqli_query($connect_to_database,$query_update);if($end_result){echo "删除成功!";$path = "receiveHomework/homeworks/".$md5data."/";$name_edata = iconv('utf-8','gb2312',$name_set_data);unlink("./".$path.$name_edata);}else{echo "删除失败,请重新提交!";}  }if($_GET['stopid']){//截止$Dtime = date("Y-m-d H:i:s",time());$name = "update homework set  endtime='".$Dtime."' where x=".$_GET['stopid'];$name_query = mysqli_query($connect_to_database,$name);if($name_query){echo "截止成功!即将发送邮箱";}else{echo "截止失败,服务器繁忙";}}if($_GET['lateDate']){//延期日期}if($_GET['sender']){//修改发送者的邮箱$name = "update homework set use_you_email='true',youemail='".$_GET['sender']."' where x=".$_GET['ttt'];$name_query = mysqli_query($connect_to_database,$name);if($name_query){echo "修改发送者邮箱成功!";}else{echo "修改失败,服务器繁忙";}}if($_GET['goaler']){$name = "update homework set email='".$_GET['goaler']."' where x=".$_GET['ttt'];$name_query = mysqli_query($connect_to_database,$name);if($name_query){echo "修改接受者邮箱成功!";}else{echo "修改失败,服务器繁忙";}//修改接受者的邮箱}if($_GET['zip']){$namewww = "17软件工程创新实验班实验1.zip"; //可以修改命名格式$name = "select path from homework where x=".$_GET['x'];$name_query = mysqli_query($connect_to_database,$name);$name_set = mysqli_fetch_array($name_query); echo $name_set[0]."|".$namewww;}
?>

实战: 效果截图

要实现这个功能,需要要一定的所有情况处理。需要以下全部文件:

1.新建作业:

新建成功

后台管理:

交作业界面:

后台接收的文件:

11点30分准时发送打包好的压缩文件邮件,并且将没有提交学生的名单罗列出来:

演示视频:

上传作业:
匹配同学(不在作业列表的同学无法交作业,这里发起者可后台设定指定交作业同学)

判断交作业是否含有指定同学名字

判断格式;(格式不合格学委可能会联系你,至于为什么不写个自动生成作业格式算法?因为我不想让同学变懒。。。)

交了之后可以下载(放心,绝对私密。后台会生成临时文件夹并在你下载之后秒删除。服务器各级目录权限也是配置好的。并且设置cookie和session双重防护。不会让你的文件泄露)和预览


截止时间后,不能再提交。(后台前端会双重判断验证时间范围有效性。所以卡页面的时间卡法是没用的,而且时间一到,系统会自动压缩文件将它发送到指定老师的邮箱哦。你是没机会交的。。只能补交了)


后台查看交作业的同学,可以进行各种操作(作业叫错了。只能叫学委在后台删除你的作业,重交。或者公众号登入,绑定微信号后,可以提交多次呦)

公众号登入!(中间时间是在找手机= =)

需要项目文件的感兴趣的朋友,可以留言,会发过去。
项目部署步骤:
1.新建数据库homeworkSet
2.注入项目中的sql文件
3.打开即可

总结

偶尔遇到的坑

1.使用语法对php进行文件删除或者把tmp文件复制的过程中,需要将传过来的文件名进行转换,不然会乱码。
方法:

$fileName = iconv('utf-8','gb2312',$fileName);
感慨

总的来说,人是不断进步的。多多运用所学知识去解决一些生活中的问题,才能将知识发挥用武之地。

基于PHP的定时交作业系统相关推荐

  1. 基于SSM大学生宿舍交电费系统

    开发工具(eclipse/idea): eclipse4.5/4.8或者idea2018,jdk1.8 数据库:mysql 功能模块: 管理员: ① 宿管管理:增.删.改宿管(学工号.密码.管理楼号. ...

  2. 基于springboot框架开发的作业提交与批改系统

    此系统是基于springboot框架开发的作业提交与批改系统,系统项目是maven项目,项目层次分离,易于二次开发和学习, 系统功能 分为教师,学生两类用户,每一角色具有不同的功能权限. 教师功能权限 ...

  3. 基于ESP32的开源定时浇花系统

    基于ESP32的开源定时浇花系统 文章目录 基于ESP32的开源定时浇花系统 前言 一.软硬件环境 二.模块连接图 1.浇花功能说明 2.Web界面展示 总结 前言 养了些许花花草草,需要按时浇灌,奈 ...

  4. C#毕业设计——基于C#+asp.net+sqlserver作业审阅系统设计与实现(毕业论文+程序源码)——作业审阅系统

    基于C#+asp.net+sqlserver作业审阅系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于C#+asp.net+sqlserver作业审阅系统设计与实现,文章末尾附有本毕业设 ...

  5. 基于交替迭代法的交直流混合系统潮流计算matlab程序iEEE9节点系统算例

    基于交替迭代法的交直流混合系统潮流计算matlab程序iEEE9节点系统算例 由于受端负荷量持续增大,直流输电受端系统的电压稳定性能自然引起了人们的关注.目前,交直流混合电网的电压稳定分析大致分为两类 ...

  6. 车载仪表android方案,基于NXP iMX8QM 汽车仪表+车载娱乐双作业系统解决方案

    基于NXP iMX8QM 汽车仪表+车载娱乐双作业系统解决方案 在汽车产业不断的发展下,新型汽车都有一个可使用地图.娱乐和其他功能的资讯面板(所谓的车载娱乐系统).另一方面,数位仪表板也正在取代传统汽 ...

  7. 【003】基于51单片机的宠物自动定时、喂食系统的proteus仿真设计

    一.压缩包资料(私信获取) (1). 包含基于51单片机的宠物自动定时.喂食系统的proteus仿真设计一份: (2).包含基于51单片机的宠物自动定时.喂食系统keil源代码工程文件一份: (3). ...

  8. java基于springboot+vue的在线作业提交与批改系统nodejs

    在线作业提交与批改系统基于WEB开发, 本在线作业提交与批改系统是对高校教学管理应用的体现,在学生信息管理,课程信息和作业信息管理方面进行了分析设计和实现.通过在线作业提交与批改系统实现,规范的对作业 ...

  9. javaweb基于JSP+Servlet开发在线个人理财系统+论文 课程设计 大作业源码

    基于JSP+Servlet开发在线个人理财系统+论文(大作业/毕业设计) 开发环境: Windows操作系统 开发工具: MyEclipse+Jdk+Tomcat+SQLServer数据库 运行效果图 ...

  10. javaweb基于JSP+Servlet开发网上作业批改系统 大作业 毕业设计

    基于JSP+Servlet开发网上作业批改系统(大作业/毕业设计) 开发环境:   Windows操作系统 开发工具:MyEclipse+Jdk+Tomcat+SQLSERVER数据库 运行效果图: ...

最新文章

  1. 物体检测中的Objectness是什么?
  2. Java bean转换map
  3. 如何自学python爬虫-Python初学者如何从网络爬虫到机器学习?
  4. 用数字告诉你2014年Google的野心在哪里
  5. 看我如何发现Uber合作方网站XXE 0day漏洞并获得9000美元赏金
  6. oracle 并行执行 杀掉会话,oracle – 为什么即使我禁用并行DML和并行DDL也会创建并行会话...
  7. 删除oracle表里的重复记录
  8. Worktile协同特色之二:任务看板管理
  9. 支付宝首页新增商家服务进度卡片 目前正在灰度测试中
  10. 从零开始学Java——基础篇
  11. 录屏怎么录?你知道多少录屏软件?
  12. BurpSuite-Collaborator插件介绍 附最新burp破解版地址
  13. numeric比较大小 数据库_SQL中NUMERIC和DECIMAL的区别
  14. 教师节,给老师们写一个随机点名的网页
  15. 【Hash篇】HashTab一款可扩展资源管理器的哈希校验软件
  16. 注意力机制SimAM代码(Pytorch)
  17. 1646906-26-4,PO-T2T钌(Ⅱ)多吡啶配合物[Ru(phen)(Hecip)](ClO4)2
  18. 大数据----Hive学习(6)----Hive 基本操作4
  19. 基于深度学习的智能车辆视觉里程计技术发展综述*--陈涛
  20. 使用Sublime Text+SumatraPDF轻松写论文

热门文章

  1. 这么多2B项目管理软件,怎么选?
  2. JavaScript 实现简单的移动和缓动的效果
  3. 消消乐游戏算法实现(三消乐)
  4. 计算机组成与设计第五版课后答案ch04,数据结构第4章例题与答案
  5. 微软并购雅虎案:世界商业三巨头的财智较量
  6. C语言micstring函数,micSendString函数使用方法
  7. 公有云服务器租赁协议,云服务器
  8. 恶意流量监测开源系统:Maltrail
  9. mysql的explain执行计划_MySQL之Explain(执行计划)
  10. HTML- 表单(简单易懂)