精华内容
下载资源
问答
  • 于是在两天的有空的时间余下给他写了个交作业系统。 文章目录前言实现的功能重要功能的实现方法发送邮件时间精确判断压缩文件任务执行文件文件夹操作实现原理准备工作步骤实战: 效果截图总结偶尔遇到的坑感慨 实现...

    前言

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

    实现的功能

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

    重要功能的实现方法

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

    发送邮件

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

     <?php
    	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 = '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>
    <?php
    	error_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>
    				<?php
    					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('
    
    							<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">
    						<?php
    							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;">
    							<?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>
    

    新建作业文件的代码:

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

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

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

    后台管理:

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

    实战: 效果截图

    要实现这个功能,需要要一定的所有情况处理。需要以下全部文件:
    在这里插入图片描述
    1.新建作业:
    在这里插入图片描述
    新建成功
    在这里插入图片描述
    后台管理:
    在这里插入图片描述
    交作业界面:
    在这里插入图片描述
    后台接收的文件:
    在这里插入图片描述
    11点30分准时发送打包好的压缩文件邮件,并且将没有提交学生的名单罗列出来:
    在这里插入图片描述

    演示视频:

    上传作业:
    在这里插入图片描述匹配同学(不在作业列表的同学无法交作业,这里发起者可后台设定指定交作业同学)
    在这里插入图片描述
    判断交作业是否含有指定同学名字

    在这里插入图片描述

    判断格式;(格式不合格学委可能会联系你,至于为什么不写个自动生成作业格式算法?因为我不想让同学变懒。。。)
    在这里插入图片描述
    交了之后可以下载(放心,绝对私密。后台会生成临时文件夹并在你下载之后秒删除。服务器各级目录权限也是配置好的。并且设置cookie和session双重防护。不会让你的文件泄露)和预览

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

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

    在这里插入图片描述

    在这里插入图片描述

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

    在这里插入图片描述

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

    总结

    偶尔遇到的坑

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

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

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

    展开全文
  • 主要介绍了ThinkPHP5实现作业管理系统中处理学生未交作业与已交作业信息的方法,涉及thinkPHP针对数据表的查询与遍历操作相关实现技巧,需要的朋友可以参考下
  • 《PHP应用:ThinkPHP5实现作业管理系统中处理学生未交作业与已交作业信息的方法》要点:本文介绍了PHP应用:ThinkPHP5实现作业管理系统中处理学生未交作业与已交作业信息的方法,希望对您有用。如果有疑问,可以联系...

    《PHP应用:ThinkPHP5实现作业管理系统中处理学生未交作业与已交作业信息的方法》要点:

    本文介绍了PHP应用:ThinkPHP5实现作业管理系统中处理学生未交作业与已交作业信息的方法,希望对您有用。如果有疑问,可以联系我们。

    PHP编程在作业管理系统中,学生登陆到个人中心后可以通过左侧的菜单查看自己已经提交的作业和未提交作业.那么在系统中如何实现这些数据的查询的呢?首先我们需要弄清楚学生(Student)、班级(class)、作业提交表(Submit)这三个表之间的关系.

    PHP编程1. 每个学生都属于一个班级

    PHP编程2. 班级里的每个学生都会被布置同样的作业

    PHP编程3. 学生提交作业后会在作业提交表中添加响应的记录,如学生的ID,作业的ID,提交的内容等.

    PHP编程可以按照以下步骤获取学生已交作业和未交作业

    PHP编程1. 获取学生所在班级的所有作业

    PHP编程

    //获取学生所在班级的所有作业

    public function getTasks($stuno)

    {

    $stu=$this::get(['stu_no'=>$stuno]);

    $clas=Clas::get(['clas_id'=>$stu['clas_id']]);

    return $clas->task;

    }

    PHP编程由上述代码课看出,首先根据学号($stuno)获取学生信息,通过学生信息表保存的班级ID(clas_id)再获取学生所在班级信息,最后通过班级与作业表之间的多对多的关系(详见Thinkphp5官方手册关于模型的关联部分内容),获取该学生所在班级所布置的所有作业.

    PHP编程2. 获取学生未交作业

    PHP编程

    //获取某学生所有未交作业

    public function getUnSubmitTasks($stuno)

    {

    $stu=$this::get(['stu_no'=>$stuno]);

    $alltask=$this->getTasks($stuno);

    foreach($alltask as $key=>$value)

    {

    if(Submit::get(['task_id'=>$value['task_id'],'stu_id'=>$stu['stu_id']]))

    {

    unset($alltask[$key]);//删除已提交作业

    }

    }

    return $alltask;

    }

    PHP编程该函数首先调用获取全部作业的函数($this->getTasks($stuno))获得了学生所在班级的所有作业.这个数据集是一个二维数组,遍历这个二维数组,看看这个二维数组中是否有作业已经被该学生提交到了Submit中,如果提交了就删除该元素.

    PHP编程3.获得学生已交作业

    PHP编程有了上述两个函数,获取已交作业的事情就变的简单了,第一个函数获得的二维数组减去第二个函数所返回的数组就是学生已交作业的集合,做下二维数组的求差即可

    PHP编程

    //获取某学生所有已交作业(所有作业和未交作业的差集)

    public function getSubmitTasks($stuno)

    {

    $unsubmit=$this->getUnSubmitTasks($stuno);

    $alltasks=$this->getTasks($stuno);

    $submittasks=array();

    foreach ($alltasks as $key=>$value)

    {

    if(!in_array($value,$unsubmit))

    {

    $submittasks[]=$value;

    }

    }

    return $submittasks;

    }

    PHP编程以上就是我在使用ThinkPHP5建立学生作业管理系统实践中对学生作业列表的解决办法,如果您有更好的方法,欢迎批评指正!

    PHP编程更多关于thinkPHP相关内容感兴趣的读者可查看本站专题:《ThinkPHP入门教程》、《thinkPHP模板操作技巧总结》、《ThinkPHP常用方法总结》、《smarty模板入门基础教程》及《PHP模板技术总结》.

    PHP编程希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助.

    展开全文
  • 作业管理系统中,学生登陆到个人中心后可以通过左侧的菜单查看自己已经提交的作业和未提交作业。那么在系统中如何实现这些数据的查询的呢?首先我们需要弄清楚学生(Student)、班级(class)、作业提交表(Submit)这...

    在作业管理系统中,学生登陆到个人中心后可以通过左侧的菜单查看自己已经提交的作业和未提交作业。那么在系统中如何实现这些数据的查询的呢?首先我们需要弄清楚学生(Student)、班级(class)、作业提交表(Submit)这三个表之间的关系。

    1. 每个学生都属于一个班级

    2. 班级里的每个学生都会被布置同样的作业

    3. 学生提交作业后会在作业提交表中添加响应的记录,如学生的ID,作业的ID,提交的内容等。

    可以按照以下步骤获取学生已交作业和未交作业

    1. 获取学生所在班级的所有作业

    //获取学生所在班级的所有作业
     public function getTasks($stuno)
     {
      $stu=$this::get(['stu_no'=>$stuno]);
      $clas=Clas::get(['clas_id'=>$stu['clas_id']]);
      return $clas->task;
     }

    由上述代码课看出,首先根据学号($stuno)获取学生信息,通过学生信息表保存的班级ID(clas_id)再获取学生所在班级信息,最后通过班级与作业表之间的多对多的关系(详见Thinkphp5官方手册关于模型的关联部分内容),获取该学生所在班级所布置的所有作业。

     

        2. 获取学生未交作业

    //获取某学生所有未交作业
     public function getUnSubmitTasks($stuno)
     {
      $stu=$this::get(['stu_no'=>$stuno]);
      $alltask=$this->getTasks($stuno);
      foreach($alltask as $key=>$value)
      {
       if(Submit::get(['task_id'=>$value['task_id'],'stu_id'=>$stu['stu_id']]))
       {
        unset($alltask[$key]);//删除已提交作业
       }
      }
      return $alltask;
      
     }

    该函数首先调用获取全部作业的函数($this->getTasks($stuno))获得了学生所在班级的所有作业。这个数据集是一个二维数组,遍历这个二维数组,看看这个二维数组中是否有作业已经被该学生提交到了Submit中,如果提交了就删除该元素。

     

    3.获得学生已交作业

    有了上述两个函数,获取已交作业的事情就变的简单了,第一个函数获得的二维数组减去第二个函数所返回的数组就是学生已交作业的集合,做下二维数组的求差即可

    //获取某学生所有已交作业(所有作业和未交作业的差集)
     public function getSubmitTasks($stuno)
     {
      $unsubmit=$this->getUnSubmitTasks($stuno);
      $alltasks=$this->getTasks($stuno);
      $submittasks=array();
      foreach ($alltasks as $key=>$value)
      {
       if(!in_array($value,$unsubmit))
       {
        $submittasks[]=$value;
       }
      }
      
      return $submittasks;
     }

    以上就是我在使用ThinkPHP5建立学生作业管理系统实践中对学生作业列表的解决办法,如果您有更好的方法,欢迎批评指正!

    本文首发 顶求网,转载请注明来源!

    转载于:https://www.cnblogs.com/nerd/p/6025895.html

    展开全文
  • 本文实例讲述了ThinkPHP5实现作业管理系统中处理学生未交作业与已交作业信息的方法。分享给大家供大家参考,具体如下:在作业管理系统中,学生登陆到个人中心后可以通过左侧的菜单查看自己已经提交的作业和未提交...

    本文实例讲述了ThinkPHP5实现作业管理系统中处理学生未交作业与已交作业信息的方法。分享给大家供大家参考,具体如下:

    在作业管理系统中,学生登陆到个人中心后可以通过左侧的菜单查看自己已经提交的作业和未提交作业。那么在系统中如何实现这些数据的查询的呢?首先我们需要弄清楚学生(Student)、班级(class)、作业提交表(Submit)这三个表之间的关系。

    1. 每个学生都属于一个班级

    2. 班级里的每个学生都会被布置同样的作业

    3. 学生提交作业后会在作业提交表中添加响应的记录,如学生的ID,作业的ID,提交的内容等。

    可以按照以下步骤获取学生已交作业和未交作业

    1. 获取学生所在班级的所有作业

    //获取学生所在班级的所有作业

    public function getTasks($stuno)

    {

    $stu=$this::get(['stu_no'=>$stuno]);

    $clas=Clas::get(['clas_id'=>$stu['clas_id']]);

    return $clas->task;

    }

    由上述代码课看出,首先根据学号($stuno)获取学生信息,通过学生信息表保存的班级ID(clas_id)再获取学生所在班级信息,最后通过班级与作业表之间的多对多的关系(详见Thinkphp5官方手册关于模型的关联部分内容),获取该学生所在班级所布置的所有作业。

    2. 获取学生未交作业

    //获取某学生所有未交作业

    public function getUnSubmitTasks($stuno)

    {

    $stu=$this::get(['stu_no'=>$stuno]);

    $alltask=$this->getTasks($stuno);

    foreach($alltask as $key=>$value)

    {

    if(Submit::get(['task_id'=>$value['task_id'],'stu_id'=>$stu['stu_id']]))

    {

    unset($alltask[$key]);//删除已提交作业

    }

    }

    return $alltask;

    }

    该函数首先调用获取全部作业的函数($this->getTasks($stuno))获得了学生所在班级的所有作业。这个数据集是一个二维数组,遍历这个二维数组,看看这个二维数组中是否有作业已经被该学生提交到了Submit中,如果提交了就删除该元素。

    3.获得学生已交作业

    有了上述两个函数,获取已交作业的事情就变的简单了,第一个函数获得的二维数组减去第二个函数所返回的数组就是学生已交作业的集合,做下二维数组的求差即可

    //获取某学生所有已交作业(所有作业和未交作业的差集)

    public function getSubmitTasks($stuno)

    {

    $unsubmit=$this->getUnSubmitTasks($stuno);

    $alltasks=$this->getTasks($stuno);

    $submittasks=array();

    foreach ($alltasks as $key=>$value)

    {

    if(!in_array($value,$unsubmit))

    {

    $submittasks[]=$value;

    }

    }

    return $submittasks;

    }

    以上就是我在使用ThinkPHP5建立学生作业管理系统实践中对学生作业列表的解决办法,如果您有更好的方法,欢迎批评指正!

    希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。

    展开全文
  • 快脚 ”快作业提交系统
  • 自制的员工管理系统php写的mysql数据库,交作业
  • 客房管理信息系统客房管理信息系统客房管理信息系统客房管理信息系统
  • 物流运管理系统 派车作业

    千次阅读 2015-06-03 19:49:21
    派车作业 派车作业是对事先设定好的车次进行派车,派车后车辆会到达出货分区先对应的位置进行装货 派车作业界面: 改变datagrid中单元格的颜色 效果图: HTML代码: 车次 脚本代码: function myformatter(index...
  •  利用面向对象的编程思想以及C++的编程方法完成系统的设计;  完成设计的具体内容: 某小公司,主要有四类人员:经理、兼职技术人员、销售经理和兼职推销员。需要存储这些人员的姓名、编号、级别、当月薪水,...
  • jsp+sql sever在线考试系统,简单易用...适合期末交作业

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 815
精华内容 326
关键字:

交作业系统