版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
目录系统实现登录注册模块当用户第一次使用系统时,需要进行登录注册操作,以下是本系统对登录注册流程步骤以及实现的原理的阐述。图STYLEREF1\s4-SEQ图\*ARABIC\s11登录注册功能流程图本系统登录模块流程如图4-1所示,会对用户输入账号、密码、验证码进行简单校验判空,输入有误自动刷新验证码。账号密码正确则提交给后台获得用户权限,前端会根据用户权限展示相应功能菜单;若密码错误,则给出错误提示。如果用户没有账号可以进行账号注册,填写正确信息后可进入登录流程。登录成功后进入系统的首页,根据登录角色的不同即管理员和企业,系统展示不同的功能菜单提供服务。系统通过"request"对象获取当前请求的路径信息,以及协议、域名和端口等基本信息,并将这些信息拼接成完整的URL地址,使用了POST方法提交表单数据到拦截器MyInterceptor中进行判断,表单中包含了四个字段:account(用户名)、password(密码)、role(角色)、verifyCode(验证码)。系统Myinterceptor中封装了登录拦截器对页面请求进行筛选拦截操作,非法请求无法进行登录验证操作。拦截器重要功能代码:HttpSessionsession=request.getSession();Objectobject=(Object)session.getAttribute("user");Stringuri=request.getRequestURI();if(uri.endsWith("logon.html")||uri.endsWith("logon.jsp")||uri.endsWith("logon")||uri.endsWith("userLogon.html")||uri.endsWith("css")||uri.endsWith("js")||uri.endsWith(".jpg")||uri.endsWith(".html")||uri.endsWith("addStudent.html")|| uri.endsWith("checkName.action")){//访问登录页面时,直接访问returntrue;}elseif(object!=null){//用户已经登录了,session中有用户的信息,可以访问admin/下的内容returntrue;}else{//其他情况,不允许访问下的内容跳转到登录页面//System.out.println("--拦截--");PrintWriterout=response.getWriter();out.print("<script>alert('您还未登录!请先完成登录后再操作!!');</script>");response.sendRedirect(request.getContextPath()+"/logon.html");// request.getRequestDispatcher("/admin/login.jsp").forward(request,response);}通过拦截器后进入登录AdminController,先进行验证码verifyCode的判断,通过后再进行用户角色role的判断,role值为用户登录时选取的身份,1、2、3分别对应管理员、老师、学生,不同的role值会重定向到不同的页面。系统AdminController中定义身份验证的的接口,通过注解@RequestMapping映射路径,对用户登录信息进行验证后进入到不同的功能界面。AdminController身份权限验证功能代码://后台生成的验证码 StringvCode=(String)session.getAttribute("vCode"); ModelAndViewmav=newModelAndView(); if(verifyCode.equalsIgnoreCase(vCode)){ //验证码正确时分角色登录role if(role==0){ //管理员登录 Adminadmin=adminService.adminLogon(map); if(admin==null){ mav.addObject("info","[管理员登录]用户名或密码错误!!!"); mav.setViewName("logon"); returnmav; }else{ session.setAttribute("user",admin); session.setAttribute("role",0); returnnewModelAndView("redirect:/index.html"); } }elseif(role==1){ //教师登录 Teacherteacher=teacherService.teacherLogon(map); if(teacher==null){ mav.addObject("info","[教师登录]用户名或密码错误!!!"); mav.setViewName("logon"); returnmav; }else{ session.setAttribute("user",teacher); session.setAttribute("role",1); returnnewModelAndView("redirect:/teacherIndex.html"); } }else{ //学生登录 Studentstudent=studentService.studentLogon(map); if(student==null){ mav.addObject("info","[学生登录]用户名或密码错误!!!"); mav.setViewName("logon"); returnmav; }else{ session.setAttribute("user",student); session.setAttribute("role",2); returnnewModelAndView("redirect:/studentIndex.html"); } } }else{ //验证码错误 mav.addObject("info","!!!验证码错误!!!"); mav.setViewName("logon"); returnmav; } }图4-2为系统登录界面效果图:图STYLEREF1\s4-SEQ图\*ARABIC\s12登录界面效果图个人信息模块当用户拥有本系统登录权限的账号后,系统会对用户注册时所填写的信息进行保存,用户在个人信息模块可以进行个人信息的修改操作,下面对信息修改操作以及实现原理进行详细叙述。图STYLEREF1\s4-SEQ图\*ARABIC\s13信息修改流程图如图4-3,修改个人信息只需在页面填写想要修改的项,经过填写规则校验之后,填写完整修改信息后,还需要输入一次密码确认修改,提交修改后会跳转到登录界面。信息修改功能实现与登录注册时的原理类似,通过"request"对象获取当前Web应用的上下文路径信息,将其保存在变量basePath中,在表单提交时,将用户输入的教师信息封装到POST请求中,提交给指定的URL,表单中包含了学生姓名、学号、学院、联系电话、身份证号、学生性别、登录账户、登录密码等,通过EL表达式(${})来访问服务器端变量,并动态生成,通过JSTL标签库(<%@taglibprefix="c"uri="/jsp/jstl/core"%>)来处理循环、判断等逻辑并增加了一些正则表达式验证规则。页面中使用了一些自定义的CSS样式,如wk-breadcrumb、wk-panel、wk-normal-input等,用于美化页面并保持风格统一。图4-4为系统信息修改界面效果图:图STYLEREF1\s4-SEQ图\*ARABIC\s14信息修改效果图考试功能考试功能为学生用户特有功能,用户在老师发布考试后可以看到自己的所有考试信息,可以选择对应的考试场次进行考试,考试结束后系统会自动进行判分并记录学生考试答题状况以及分数。下面就对考试流程的实现原理进行详细的叙述。图STYLEREF1\s4-SEQ图\*ARABIC\s15考试模块流程图如图4-5所示,考试模块功能,用户进入考试模块界面可以看到所有的考试信息,考试信息包括考试科目、考试时间,点击某一场考试可以进入该场考试的页面入口,该入口有开始考试的功能按钮,该按钮仅在考试时间期间可以点击进入本场考试。用户在对应的时间进入考试后在考试规定的时间内可以答题,完成试卷可以手动提交试卷或者考试结束时间到系统自动保存试卷提交。倒计时功能实现:变量endtime,它表示考试结束时间,通过获取当前时间(newDate().getTime())并加上考试时长计算得到,变量flag,表示考试是否已经结束。初始值为true。函数showtime()根据当前时间和考试结束时间的差计算出剩余时间,并将剩余时间格式化成字符串返回,变量examtime,它表示考试的时长(以分钟为单位)。然后,通过将当前时间和结束时间的差计算出剩余的时间,再将剩余时间按照小时、分钟和秒数进行拆分和格式化,最终在页面上显示倒计时。在页面加载完成后,反复调用showtime()函数,并将其返回值显示在页面上。如果剩余时间小于0,并且考试还没有结束,则将flag设为false,弹出提示框告诉用户考试时间结束,并跳转到提交考试成绩的页面。当用户点击“提交”按钮时,弹出提示框询问用户是否确定要提交考试,如果确定则跳转到提交考试成绩的页面。当用户选择了某个题目的答案时,通过AJAX将该答案提交到服务器保存。考试倒计时功能主要代码:setInterval(function(){ div.innerHTML=showtime(); },1000);//反复执行函数本身 varshowtime=function(){ varnowtime=newDate()//获取当前时间 varlefttime=endtime-nowtime.getTime(),//距离结束时间的毫秒数 leftd=Math.floor(lefttime/(1000*60*60*24)),//计算天数 lefth=Math.floor(lefttime/(1000*60*60)%24),//计算小时数 leftm=Math.floor(lefttime/(1000*60)%60),//计算分钟数 lefts=Math.floor(lefttime/1000%60);//计算秒数 if(lefttime<0&&flag==true){ flag=false $("#outTime").modal(); $("#outOk").on("click",function(){ location.href="<%=basePath%>saveExamScore/${exam.id}.html"; }); } returnlefth+"小时"+leftm+"分"+lefts+"秒";//返回倒计时的字符串 }用一个表单元素taskForm,并且使用POST请求方法将表单的数据提交到服务器上的一个URL地址。同时,这个表单中包含了一个题目列表。通过c:forEach标签的迭代,每个问题都被转化成了一个showTask类型的div元素。在每个showTask元素中,都包含有一个表示问题标题的label以及四个表示问题答案选项的radio元素。在这些radio元素中,name属性值是相同的,这样就能够保证同一个问题只能有一个答案被选定。此外,在每个radio元素后面都有一个标签,用于展示相应答案选项的内容。考试功能核心代码:<formid="taskForm"action="<%=basePath%>saveStudentTask/${taskId}.html"method="POST"> <divclass="panel-body"> <divclass="row"> <c:forEachitems="${questions}"var="var"varStatus="idxStatus"> <!--试题--> <divclass="showTask"> <divclass="form-inline"> <divclass="form-group"> <labelclass="control-labelwk-filed-label"style="font-weight:600;"> 题目${idxStatus.index+1}:${var.title} </label> </div> </div> <divclass="form-inline"> <labelclass="control-labelwk-filed-label">答案:</label> <divstyle="font-size:16px;margin-left:82px;margin-top:-28px;"class="userAnswer"name="${var.id}"> <inputtype="radio"required="required"value="A"name="${var.id}"/> A: ${var.itemA}</br> <inputtype="radio"required="required"value="B"name="${var.id}"/> B: ${var.itemB}</br> <inputtype="radio"required="required"value="C"name="${var.id}"/> C: ${var.itemC}</br> <inputtype="radio"required="required"value="D"name="${var.id}"/> D: ${var.itemD}</br> </div> </hr> </div> </div> </c:forEach> </div> </div> <divclass="panel-footerwk-panel-footer"> <buttonid="submitBtn"type="button"class="btnbtn-defaultwk-btn">完成考试</button> </div> </form>图STYLEREF1\s4-SEQ图\*ARABIC\s16考试效果图老师部分的考试模块功能,老师进入考试模块界面可以查看自己组织的考试,点击考试可以进入该场考试信息页面,点击修改可以更改考试试卷,成功提交后会有成功提示,此时会回到该场考试对应的信息界面。也可以创建考试,对考试试卷进行设置后提交,成功后会回到该场考试信息界面。此上就是老师部分的考试模块的主要功能。成绩分析功能实现效果(学生端)如图4-7图STYLEREF1\s4-SEQ图\*ARABIC\s17成绩查看效果图在页面文件头部引入ECharts的JavaScript文件:<scripttype="text/javascript"src="js/echarts5/echarts.min.js"></script>,用一个div元素,作为图表的容器,配置图表选项和数据,代码如下:letoption2={ xAxis:{ type:'category', data:data.exams }, yAxis:{ type:'value' }, series:[{ data:data.scores, type:'line', smooth:true }] };调用ECharts实例的setOption方法,将图表配置应用到实例中,代码如下:echartsRecords.setOption(option2);实现效果(老师端)如图4-8:图STYLEREF1\s4-SEQ图\*ARABIC\s18成绩查看效果图图STYLEREF1\s4-SEQ图\*ARABIC\s19对应学生成绩效果图首先通过解析页面URL获取到教师的ID,然后将其存储在变量teacherId中。接着使用jQuery的ajax方法异步请求服务器端的数据。ajax方法的参数包括:url:请求的URL地址,包含了教师ID参数、type:请求类型,这里使用GET方法、dataType:返回数据的类型,这里使用JSON格式、success:请求成功时的回调函数,其中data参数包含了所有学生的考试成绩、error:请求失败时的回调函数。在success回调函数中,首先定义了用于存储图表数据的各个数组(如labels、passScores、failScores等)。然后对返回的data数据进行遍历,将每个学生的考试成绩加入到相应的数组中。这里使用parseFloat方法将字符串类型的成绩转换为数字类型。initChart函数用于渲染一个柱状图,在该函数中,使用Chart.js库创建一个柱状图对象,并设置其属性:type:图表类型为柱状图、data:数据包括labels和datasets两部分,其中datasets包括及格分数和不及格分数两个数据集。options:图表的选项,包括标题、坐标轴、图例等设置。最后再调用echartsRecords.setOption(option)方法将option对象传递给echarts实例对象进行图表渲染。InitChart功能函数代码如下:functioninitChart(select,data){ letechartsRecords=echarts.init(document.getElementById('echarts-records'),'dark'); letoption={ legend:{}, tooltip:{}, dataset:{ source:data }, xAxis:{type:'category'}, yAxis:{}, //Declareseveralbarseries,eachwillbemapped //toacolumnofdataset.sourcebydefault. series:[ {type:'bar'},{type:'bar'}, ] }; echartsRecords.setOption(option); }initChart2函数用于渲染一条折线图,同样接收两个参数select和data。其内部逻辑与initChart类似,不过这里的option对象包括了横轴、纵轴、以及一条折线图系列,其中折线图的数据通过data参数中的exams和scores两个数组获取到。initChart2功能函数代码如下:functioninitChart2(select,data){ letechartsRecords=echarts.init(document.getElementById('echarts-records2'),'dark'); letoption2={ xAxis:{ type:'category', data:data.exams }, yAxis:{ type:'value' }, series:[{ data:data.scores, type:'line', smooth:true }] }; echartsRecords.setOption(option2); }为页面中的三个按钮添加了监听器。当点击这些按钮时,会触发相应的回调函数,更新图表的数据并重新渲染。JSTL标签库主要用于呈现动态内容。主要使用了以下几个标签:c:forEach:用于遍历获取到的学生考试成绩,并将它们渲染到HTML代码、fmt:formatNumber:用于格式化输出数字类型的数据,例如保留小数点后两位、添加千位分隔符等操作。使用c:forEach标签遍历所有学生的考试成绩数据。在每次循环中,使用fmt:formatNumber标签格式化输出分数,并将其存储在一个变量中。最后,用JSP脚本语言将这些数据拼接成HTML代码,并输出到页面上。系统视频模块视频上传系统老师用户拥有视频上传功能,老师可以选择对应的课程进行教学视频上传,老师点击上传视频后弹出下拉选择框,选择对应的课程点击选择上传文件,在本地选择文件上传。savaVideoTest()方法,用于将浏览器传来的视频流数据保存到服务器上。具体来说,该方法需要传入两个参数:一个名为file的文件流对象和一个名为SavePath的字符串,前者表示要上传的视频流数据,后者表示要保存到服务器的路径地址。在方法体内,首先通过file.getOriginalFilename()方法获取上传的视频的原始文件名,并从中截取出文件后缀,得到一个名为fileExt的字符串变量。然后通过UUID.randomUUID().toString().replaceAll("-","")方法生成一个唯一标识符pikId,并将其加上文件后缀组成新的文件名newVideoName。接着,将原始文件名、视频URL路径和新文件名调用数据库接口的save()方法存入数据库中。Map<String,String>resultMap=newHashMap<>();try{//获取文件后缀,因此此后端代码可接收一切文件,上传格式前端限定StringfileExt=file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")+1).toLowerCase();System.out.println("前端传递的保存路径:"+SavePath);StringpikId=UUID.randomUUID().toString().replaceAll("-","");StringnewVideoName=pikId+"."+fileExt;System.out.println("重构文件名防止上传同名文件:"+newVideoName);StringvideoNameText=file.getOriginalFilename();System.out.println("视频原名:"+videoNameText);StringvideoUrl=SavePath+"/"+newVideoName;//调用数据库接口插入数据库方法save,把视频原名,视频路径,视频的唯一标识码传进去存到数据库内videoUploadMapper.save(videoNameText,videoUrl,newVideoName);然后,该方法会判断视频需要保存的文件夹是否存在,如果不存在则会创建。之后,使用File类在服务器上创建一个新的视频文件,并将上传的视频流数据写入其中。最后,将一些有关视频信息的键值对以Map的形式返回给前端,比如重构后的视频名称、返回码、视频保存路径等。如果上传和保存过程中发生错误,则会通过try-catch语句捕获异常并记录相关信息,并将错误码和异常信息添加到Map中返回给浏览器。Filefilepath=newFile(SavePath,file.getOriginalFilename());if(!filepath.getParentFile().exists()){//如果不存在,就创建一个这个路径的文件夹。filepath.getParentFile().mkdirs();}FilefileSave=newFile(SavePath,newVideoName);file.transferTo(fileSave);//构造Map将视频信息返回给前端//视频名称重构后的名称:这里put代表添加进map集合内,和前端的push一样。括号内是前面字符串是键,后面是值resultMap.put("newVideoName",newVideoName);resultMap.put("resCode","200");//返回视频保存路径resultMap.put("VideoUrl",SavePath+"/"+newVideoName);returnresultMap;}catch(Exceptione){//在命令行打印异常信息在程序中出错的位置及原因e.printStackTrace();e.getMessage();resultMap.put("resCode","400");returnresultMap;}视频查看与删除videoTable()方法:用来查询所有视频信息并返回给前端展示成表格形式。在这个方法中,我们直接调用videoMapper.SelectVideoAll()方法来查询数据库中保存的所有视频信息,并将其以列表的形式返回给前端。deleteVideo()方法:用来删除指定视频。在这个方法中,我们首先通过调用videoMapper.SelectVideoId(videoId)方法查询数据库获取对应videoId的视频信息,然后根据该视频路径删除对应的视频文件,如果删除成功则再根据videoId删除数据库中对应的视频信息记录。视频删除功能部分代码如下:Map<String,String>resultMap=newHashMap<>();VideovideoPathList=videoMapper.SelectVideoId(videoId);if(videoPathList!=null){if(FileSystemUtils.deleteRecursively(newFile(videoPathList.getVideoUrl()))){resultMap.put("videoName",videoPathList.getVideoName());//dataSource:文件是否被删除resultMap.put("dataRource","true");resultMap.put("VideoUrl",videoPathList.getVideoUrl());if(videoMapper.rmVideo(videoId)){//mysql:数据库信息记录是否被删除resultMap.put("mysql","true");}else{resultMap.put("mysql","false");}}else{resultMap.put("dataResource","false");}视频播放视频播放功能是所有用户都拥有的功能模块,在老师针对对应课程上传课程视频就,用户就可以在课程学习模块使用该功能,点击对应的课程,选择特定的课程视频点击播放即可。视频播放主要是依靠videoPreview()方法。该用来获取指定视频的流数据并输出到浏览器。在这个方法中,我们首先通过调用videoMapper.SelectVideoId(videoId)方法查询数据库获取对应videoId的视频信息,然后从视频信息对象中取出视频路径,将其转为磁盘上的路径,最后通过创建自定义的NonStaticResourceHttpRequestHandler组件并调用其中的handleRequest()方法将该视频的流数据输出到浏览器。//调用查询方法,把前端传来的id传过去,查询对应的视频信息。VideovideoPathList=videoMapper.SelectVideoId(videoId);//从视频信息中单独把视频路径信息拿出来保存StringvideoPathUrl=videoPathList.getVideoUrl();//保存视频磁盘路径PathfilePath=Paths.get(videoPathUrl);//Files.exists:用来测试路径文件是否存在if(Files.exists(filePath)){//获取视频的类型,如MP4StringmimeType=FbeContentType(filePath);if(StringUtils.hasText(mimeType)){//判断类型,根据不同的类型文件来处理对应的数据response.setContentType(mimeType);}//转换视频流部分request.setAttribute(NonStaticResourceHttpRequestHandler.ATTR_FILE,filePath);nonStaticResourceHttpRequestHandler.handleRequest(request,response);浏览器视频列表展示部分:使用Bootstrap的表格组件展示所有视频信息,并为每一行视频信息添加预览和删除按钮。删除确认框部分:使用Bootstrap的模态框组件实现删除视频时的确认提示,用户点击“删除”按钮时将会发送一个GET请求到后端控制器中的deleteVideo()方法,并携带要删除的视频ID。监听预览和删除按钮的点击事件,当点击预览按钮时向后端控制器中的videoPreview()方法发送GET请求并携带对应的视频ID,获取视频流数据并在页面上展示播放器;当点击删除按钮时弹出删除确认框并将要删除的视频ID保存到模态框表单中,当用户点击确认删除后再次向后端控制器中的deleteVideo()方法发送GET请求进行删除操作。如果删除成功,则刷新页面以更新视频列表展示。浏览器监听预览和删除按钮实现代码如下:<script>$(function(){//监听删除按钮的点击事件,将该行视频ID保存到模态框表单中$('#deleteModal').on('show.bs.modal',function(event){varbutton=$(event.relatedTarget);varvideoId=button.data('video-id');varmodal=$(this);modal.find('#videoIdInput').val(videoId);});//监听删除表单的提交事件,成功后刷新页面$('#deleteForm').submit(function(event){event.preventDefault();varform=$(this);$.get(form.attr('action')+form.find('#videoIdInput').val(),function(result){if(result.mysql==='true'&&result.dataRource==='true'){location.reload();}else{alert('删除失败');}});});});</script>第五章系统测试与分析系统测试与分析在上一章中对在线学习系统进行了设计与实现。在本章中主要对重要功能在web端进行测试与验证系统测试环境表5-SEQ表\*ARABIC\s11系统测试环境表系统windows11内存16GB处理器Intel(R)Core(TM)i7-9750HCPU@2.60GHz2.59GHz浏览器谷歌如表5-1,为系统将在Windows11的环境下采用谷歌浏览器自带的系统测试工具ChromeDevTools进行系统测试功能测试本节将测试在线学习系统重要的功能模块:登录注册模块、考试模块、信息修改、人员新增、视频上传、视频播放、成绩分析、讨论模块。表STYLEREF1\s5-SEQ表\*ARABIC\s12功能测试表编号功能点前置条件测试步骤预期结果实际结果是否通过Z-101注册无用户填写基本身份信息,格式无误后注册成功,获得登录权限。成功注册,跳转到登录界面成功注册,跳转到登录界面是Z-102登录无用户填写注册时填的账户信息与密码,核验无误后登陆成功进入系统主界面成功登录,进入主界面成功登录,进入主界面是Z-103考试学生账户登录点击考试选择对应的考试开始考试成功,进入考试界面开始考试成功,进入考试界面是Z-104信息修改用户账户登录点击个人信息点击修改个人信息填写个人信息后提交修改成功,信息显示为自己修改后的信息修改成功,信息显示为自己修改后的信息是Z-105试题新增老师用户登录点击考试进入考试界面点击录入试题填写试题信息后点击提交新增成功,在试题列表中可以看见自己新增的试题新增成功,在试题列表中可以看见自己新增的试题是Z-106人员新增管理员用户登录点击新增老师填写老师信息提交新增成功,新增的人员可以正常登录习题新增成功,新增的人员可以正常登录习题是Z-107视频上传老师用户登录点击视频上传选择对应的课程选择上传文件点击上传上传成功,视频列表中有新增视频上传成功,视频列表中有新增视频是Z-108成绩分析用户登录点击成绩查看查看成功查看成功是Z-109新增讨论老师用户登录点击发布话题选择对应的课程输入话题信息点击发布发布成功,学生端可以参与话题讨论发布成功,学生端可以参与话题讨论是Z-110参与讨论学生用户登录点击话题选择对应的话题进行发言点击发布参与成功,讨论记录有新增参与成功,讨论记录有新增是Z-111查看考试记录学生用户登录点击考试记录查看成功,展示自己所有考试记录查看成功,展示自己所有考试记录是Z-112发布考试老师用户登录点击考试选择新增考试选择试题录入填写试题信息点击发布发布成功,学生可以进入考试界面答题发布成功,学生可以进入考试界面答题是Z-113删除人员管理员账户登录点击删除人员选择对应的人员点击删除删除成功,数据库用户信息删除,该用户失去系统登录权限删除成功,数据库用户信息删除,该用户失去系统登录权限是性能测试本系统对浏览器的兼容性较好,对于主流浏览器的页面展示效果均符合需求。性能测试运用谷歌浏览器原生工具ChromeDevTools,图5-1为性能分析图,测试结果显示,在采集样本中响应时间区间的为100-3000ms,符合需求要求加载和响应时间小于4000ms,对于数据存储和并发使用的场景下系统依旧保持稳定安全运行。由此可见,这个系统具备快速响应和顺畅性能非常好的在线学习工具,同时还配有简单易用的操作界面,使得用户可以享受到优质的使用体验。图STYLEREF1\s5-SEQ图\*ARABIC\s11性能测试图安全性测试本系统的安全性测试主要从用户登录和在线时未操作超时进行测试。测试结果如表5-3所示。表STYLEREF1\s5-SEQ表\*ARABIC\s13安全性测试表功能点测试步骤预期结果实际结果是否通过登录测试输入账号、密码和验证码中一个或多个错误时,测试系统能否正常登录输入账号、密码和验证码中一个或多个错误时,系统均不能登录输入账号、密码和验证码中一个或多个错误时,系统均不能登录是在线时长测试当系统未操作时间过长时,系统是否会拒绝请求,且提示重新登录当系统未操作时间过长时,系统拒绝请求,且提示重新登录当系统未操作时间过长时,系统拒绝请求,且提示重新登录是本章小结本章主要针对系统功能模块和非功能模块进行了测试。对发现的小问题进行了修
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026及未来5年带磁钢柄汤壳项目可行性研究报告(市场调查与数据分析)
- 景观设计雨水管理服务
- 沪科版物理八年级上学期期中仿真模拟试卷A卷附答案
- 5-Hydroxycoumarin-生命科学试剂-MCE
- 合肥高中数学试题及答案
- 2026年医药行业产量、销量、库存、供需平衡及市场趋势报告
- 2026年汽车行业会员储值策略与等级权益创新报告
- 2026年数码产品市场消费升级报告001
- 2026年食品加工行业风险控制与信用评估研究
- 2026年金融行业循环经济与低碳发展报告
- TSG 08-2026 特种设备使用管理规则
- 林业专业高级职称面试题目及答案
- 格萨尔王传课件
- 学堂在线 实验室安全教育 章节测试答案
- GJB3243A-2021电子元器件表面安装要求
- 李白赠孟浩然课件
- 上海杉达学院《普通物理》2023-2024学年第二学期期末试卷
- 2025石家庄市深泽县辅警考试试卷真题
- 典型零件机械加工工艺过程(共29张课件)
- 园林绿化树穴隐蔽工程验收记录
- (正式版)HG∕T 20644-2024 弹簧支吊架选用标准
评论
0/150
提交评论