基于PHP的定时交作业系统

前言

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

  • 文章目录

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

实现的功能

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

重要功能的实现方法

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

发送邮件

1.打开qq邮箱。点击设置【这里我使用的是qq邮箱,你也可以使用163】
在这里插入图片描述
2.点击账户
基于PHP的定时交作业系统_第1张图片
3.点击开启smtp服务基于PHP的定时交作业系统_第2张图片
4.获取授权码、【没有这个系统没有权限使用你的邮箱发送邮件】
在这里插入图片描述
5.重点
你需要了解到 php最多人用的发送email的sdk是什么。并不是自带的核心email函数。而是PHPMailer这个神奇的功能api包。点击到Github下载
使用方法:
将 PHPMailer-master项目文件夹放至指定位置,然后通过引用的方式进行调用
这里我放在了项目根目录下。
基于PHP的定时交作业系统_第3张图片
代码:

 
	error_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 = '[email protected]';                // SMTP 用户名  即邮箱的用户名 这里可以用数据库查询是否用自己的邮箱去发送给老师
		$mail->Password = '这里是上面步骤获取的授权码';             // SMTP 密码 
		$mail->SMTPSecure = 'ssl';                   
		$mail->Port = 465;                          
		$mail->setFrom('[email protected]', '发起者名称');  //发件人  这里可以用数据库查询是否用自己的邮箱去发送给老师
		$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    = '

'.$text.'

'
. 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 "打包中...
"
; $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 "
"
; //获取上传学生作业的文件列表 $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." 份作业....
"
; //这里,可能有多个作业,需要展示给前端页面看具体打包过程。 } } } return $result; } echo $_GET['md5']."
打包成功!"
; 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>

	error_reporting(0);
	if(!$_GET['md5code']){
		echo('请输入正确的网页链接!');
		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('该作业详情不存在!');
		return ;
	}
	else{
		$data = $this_result;
	}
	?>
<body>
	<div class="main">
		<div class="nav">
			<ul class="inn">
				<li></li>
				<li style="font-size: 11px;">
				 
					$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;"> echo($data[11]); ?></font></li>
				<li>
					已交
					<font style="color: green;"> echo $q; ?> </font></li>
				<li>
					未交
					<font style="color: red;">  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>
				
					require_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('

							
								
								
									'.$every[2].'
								
								
									'.$every[3].'
								
								
									'.$every[5].'
								
								
									'.$every[4].'
											
									
							
							');
						}
						else{
							echo('
								
									
									
										'.$every[2].'
									
									
										'.$every[3].'
									
									
										'.$every[5].'
									
									
										'.$every[4].'
												
										
								
							');
						}
						$i++;
					}
					if($i==0){
						echo('
							
							
								
									暂时还没有同学提交,快来抢沙发吧!
								
							
						');
					}
				?>
				<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;"> 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;">
							 echo($data[4]); ?>
						</h6>
					</td>
				</tr>
				<tr>
					<td colspan="2" align="right">
						发起人:
						
					</td>
					<td colspan="8">
						<font class="text">
							
								$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/$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">
							 echo($data[5]) ?>
						</font>
					</td>
				</tr>
				<tr>
					<td colspan="3">
						作业结束时间
					</td>
					<td colspan="7">
						<font class="text">
							 echo($data[6]) ?>
						</font>
					</td>
				</tr>
				<tr></tr>
				<tr>
					<td colspan="10">
						
							if($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;">
							
								//计算时间·段 
							$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="$_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">
						已提交次数: echo $_COOKIE['counts']; ?>
					</td>
				</tr>
				<tr>
					<td colspan="10" align="center">
						<button class="sure_b"  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>

新建作业文件的代码:


	error_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的代码如下:


	error_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文件:


	//及时判断。
	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]." 该作业可以打包发送了。
"
; //然后发送邮件给他 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."
"
; } } ?>

后台管理:


	error_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;
	}
?>

实战: 效果截图

要实现这个功能,需要要一定的所有情况处理。需要以下全部文件:
基于PHP的定时交作业系统_第4张图片
1.新建作业:
基于PHP的定时交作业系统_第5张图片
新建成功
基于PHP的定时交作业系统_第6张图片
后台管理:
基于PHP的定时交作业系统_第7张图片
交作业界面:
基于PHP的定时交作业系统_第8张图片
后台接收的文件:
基于PHP的定时交作业系统_第9张图片
11点30分准时发送打包好的压缩文件邮件,并且将没有提交学生的名单罗列出来:
基于PHP的定时交作业系统_第10张图片

演示视频:

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

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

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

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

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


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

基于PHP的定时交作业系统_第12张图片

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

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

总结

偶尔遇到的坑

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

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

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

你可能感兴趣的:(PHP)