一、计划

1、随机产生一组(10个)算术题,可以使用循环,并剔除不够减的

2、把一组算术题显示在页面上,并同步计时

3、显示对错,给出提示,并统计分数(假设一题10分),最后再统计时间

二、需求分析

用户故事:

作为一名一年级小学生的家长,我希望制作一个出题软件,完成100以内的正整数的加减法题随机产生。以便减轻我的家庭负担。

具体设计:

本案例是用JavaWeb项目做的,采用前后端分离的技术,前端技术:js ,也引入的bootstrap插件,后端技术:使用的是Java语言,后端接收前端提交的参数,并做出判断,然后再保存数据到前端,做出响应,

为了开发的便捷,使用了Spring框架,因为前端提交的参数数据太多,引入了BeanUtils插件,一键封装数据。最后成功的把本案例部署到了云服务器上。本博客末尾会给出地址,感兴趣的话可以访问一下。

PSP阶段:

四则运算 实际花费时间 估计花费时间
计划 3 2.5

明确需求和其他相关因素,估计每个阶段的时间成本

2 3

开发

12 10

需求分析

5 4

生成设计文档

3 2.5

设计复审(和同事审核设计文档)

2 1

代码规范(为目前的开发制定合适的规范)

1 0.5

具体设计

5 6

具体编码

1 1

代码复审

0.5 0.5

测试(自测、修改代码、提交修改)

1 1

测试报告

0.2 0.1

计算工作量

1 1

事后总结,并提出过程改进计划

0.5 0.5

 

三、具体编码

项目的架构:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1、cn.edu.hnzj.controller.java文件的内容

package cn.edu.hnzj.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.beanutils.BeanUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class pageController {
    
    /**
     * 接收用户提交的参数
     */
    @RequestMapping("/getParam")
    public ModelAndView  getParam(HttpServletRequest request,HttpServletResponse response) throws Exception{
        //创建ModelAndView对象
        ModelAndView mav = new ModelAndView();
        //创建PagePow对象
        PagePo po = new PagePo();
        //使用populate方法一键封装,前台提交的所有的参数
        BeanUtils.populate(po, request.getParameterMap());
            
        Integer value1 = po.getValue1();
        Integer value2 = po.getValue2();    
        Integer value3 = po.getValue3();
        Integer value4 = po.getValue4();
        Integer value5 = po.getValue5();
        Integer value6 = po.getValue6();
        Integer value7 = po.getValue7();
        Integer value8 = po.getValue8();
        Integer value9 = po.getValue9();
        Integer value10 = po.getValue10();
        Integer value11 = po.getValue11();
        Integer value12 = po.getValue12();    
        Integer value13 = po.getValue13();
        Integer value14 = po.getValue14();
        Integer value15 = po.getValue15();
        Integer value16 = po.getValue16();
        Integer value17 = po.getValue17();
        Integer value18 = po.getValue18();
        Integer value19 = po.getValue19();
        Integer value20 = po.getValue20();
        
        Integer values1 = po.getValues1();
        Integer values2 = po.getValues2();
        Integer values3 = po.getValues3();
        Integer values4 = po.getValues4();
        Integer values5 = po.getValues5();
        Integer values6 = po.getValues6();
        Integer values7 = po.getValues7();
        Integer values8 = po.getValues8();
        Integer values9 = po.getValues9();
        Integer values10 = po.getValues10();
        
        
//          if( values1 ==0 || values2 ==0 ||values3 ==0 || values4 ==0 ||values5 ==0 ||
//          values6 ==0 ||values7 ==0 ||values8 ==0 ||values9 ==0 ||values10 ==0) {
//          
//          mav.addObject("msg1", "此题您还没有做答!"); mav.setViewName("page.jsp"); return mav;
//          }
         
        int count =0;//记录答题分数,答对一题得10分
        //第一题
        if(value1+value2==values1) {
            
            //如果value1+value2=values1就返回 “恭喜您,答对了”,否则就返回"答错了!"。
            mav.addObject("msg1", "恭喜您,答对了");
            //用于把输入的结果保存到前台
            mav.addObject("values1", values1);
            count+=10;
        }else {
            
            mav.addObject("msg1", "对不起,答错了!");
            mav.addObject("values1", values1);
        }
        //第二题
        if(value3+value4==values2) {
            
            //如果value3+value4=values2就返回 “恭喜您,答对了”,否则就返回"答错了!"。
            mav.addObject("msg2", "恭喜您,答对了");
            //用于把输入的结果保存到前台
            mav.addObject("values1", values2);
            count+=10;
        }else {
            
            mav.addObject("msg2", "对不起,答错了!");
            mav.addObject("values2", values2);
        }
        //第三题
        if(value5+value6==values3) {
    
            //如果value5+value6=values3就返回 “恭喜您,答对了”,否则就返回"答错了!"。
            mav.addObject("msg3", "恭喜您,答对了");
            //用于把输入的结果保存到前台
            mav.addObject("values3", values3);
            count+=10;
            }else {
            
            mav.addObject("msg3", "对不起,答错了!");
            mav.addObject("values3", values3);
            
        }
        
        //第四题
        if(value7+value8==values4) {
    
            //如果value7+value8=values4就返回 “恭喜您,答对了”,否则就返回"答错了!"。
            mav.addObject("msg4", "恭喜您,答对了");
            //用于把输入的结果保存到前台
            mav.addObject("values4", values4);
            count+=10;
        
            }else {
            
            mav.addObject("msg4", "对不起,答错了!");
            mav.addObject("values4", values4);

        }
        
    //第五题
    if(value9+value10==values5) {
    
        //如果value9+value10=values5就返回 “恭喜您,答对了”,否则就返回"答错了!"。
        mav.addObject("msg5", "恭喜您,答对了");
        //用于把输入的结果保存到前台
        mav.addObject("values5", values5);
        count+=10;
        }else {
        
        mav.addObject("msg5", "对不起,答错了!");
        mav.addObject("values5", values5);
    
        }
    
    //第六题
    
        if(value11-value12==values6) {
            
            //如果value11-value12=values6就返回 “恭喜您,答对了”,否则就返回"答错了!"。
            mav.addObject("msg6", "恭喜您,答对了");
            //用于把输入的结果保存到前台
            mav.addObject("values6", values6);
            count+=10;
        }else {
            
            mav.addObject("msg6", "对不起,答错了!");
            mav.addObject("values6", values6);
        }
    //第七题
        if(value13-value14==values7) {
            
            //如果value13-value14=values7就返回 “恭喜您,答对了”,否则就返回"答错了!"。
            mav.addObject("msg7", "恭喜您,答对了");
            //用于把输入的结果保存到前台
            mav.addObject("values7", values7);
            count+=10;
        }else {
            
            mav.addObject("msg7", "对不起,答错了!");
            mav.addObject("values7", values7);
        }
            //第八题
            if(value15-value16==values8) {
        
                //如果value15-value16=values8就返回 “恭喜您,答对了”,否则就返回"答错了!"。
                mav.addObject("msg8", "恭喜您,答对了");
                //用于把输入的结果保存到前台
                mav.addObject("values8", values8);
                count+=10;
                }else {
                
                mav.addObject("msg8", "对不起,答错了!");
                mav.addObject("values8", values8);
            }
            
            //第九题
            if(value17-value18==values9) {
        
                //如果value17-value18=values9就返回 “恭喜您,答对了”,否则就返回"答错了!"。
                mav.addObject("msg9", "恭喜您,答对了");
                //用于把输入的结果保存到前台
                mav.addObject("values9", values9);
                count+=10;
                }else {
                
                mav.addObject("msg9", "对不起,答错了!");
                mav.addObject("values9", values9);

            }
            
        //第十题
        if(value19-value20==values10) {
        
            //如果value19-value20=values10就返回 “恭喜您,答对了”,否则就返回"答错了!"。
            mav.addObject("msg10", "恭喜您,答对了");
            //用于把输入的结果保存到前台
            mav.addObject("values10", values10);
            count+=10;
            }else {
            
            mav.addObject("msg10", "对不起,答错了!");
            mav.addObject("values10", values10);
        
            }
        
        String str= "本次答题共得分为:";    
        mav.addObject("count", str+count);
        mav.setViewName("page.jsp");
        return mav;
    }
}

WebContent下的page.jsp文件内容

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>四则运算</title>
 <link rel="stylesheet" href="bootstrap/bootstrap.min.css" type="text/css"/>     

    <script src="bootstrap/bootstrap.min.css"></script>
    <link rel="stylesheet" href="./css/style.css" type="text/css"/> 
    <script src="layui.js"/>


    <style>
        .center{
            text-align: center;
        }
        input{
        text-align: center;
        
        }
    </style>
    
</head>
<body>
    <h3 style="text-align: center;">四则运算</h3>
<hr/>
    <!-- form表单用于随机生成10到算术题 -->
    <form action="${pageContext.request.contextPath}/getParam" method="POST" class="center">
        <!-- 第一道算术题 -->
        <input type="text"  style="width:40px;height:30px"  name="value1" id="value1" value="javascript:GetRandomn()" />
            <span><b style="font-size: 22px;">+</b></span>

        <input type="text"  style="width:40px;height:30px"  name="value2" id="value2" value="javascript:GetRandomn()" />

            <span><b style="font-size: 22px;">=</b></span>
        <input type="text" style="width:40px;height:30px" name="values1" value="${values1 }"> ${msg1 }
        <br/>

        <!-- 第二道算术题 -->
          <input type="text"  style="width:40px;height:30px"  name="value3" id="value3" value="javascript:GetRandomn()" />
            <span><b style="font-size: 22px;">+</b></span>

        <input type="text"  style="width:40px;height:30px"  name="value4"  id="value4" value="javascript:GetRandomn()" />

            <span><b style="font-size: 22px;">=</b></span>
        <input type="text" style="width:40px;height:30px" name="values2" value="${values2 }"> ${msg2 }
        <br/>   
        <!-- 第三道算术题 -->
          <input type="text"  style="width:40px;height:30px"  name="value5"  id="value5" value="javascript:GetRandomn()" />
            <span><b style="font-size: 22px;">+</b></span>

        <input type="text"  style="width:40px;height:30px"  name="value6" id="value6" value="javascript:GetRandomn()" />

            <span><b style="font-size: 22px;">=</b></span>
        <input type="text" style="width:40px;height:30px" name="values3" value="${values3 }"> ${msg3 }
        <br/>  
        <!-- 第四道算术题 -->
         <input type="text"  style="width:40px;height:30px"  name="value7" id="value7" value="javascript:GetRandomn()" />
            <span><b style="font-size: 22px;">+</b></span>

        <input type="text"  style="width:40px;height:30px"  name="value8"  id="value8" value="javascript:GetRandomn()" />

            <span><b style="font-size: 22px;">=</b></span>
        <input type="text" style="width:40px;height:30px" name="values4" value="${values4 }"> ${msg4 }
        <br/>  
        <!-- 第五道算术题 -->
         <input type="text"  style="width:40px;height:30px"  name="value9" id="value9" value="javascript:GetRandomn()" />
            <span><b style="font-size: 22px;">+</b></span>

        <input type="text"  style="width:40px;height:30px"  name="value10"  id="value10" value="javascript:GetRandomn()" />

            <span><b style="font-size: 22px;">=</b></span>
        <input type="text" style="width:40px;height:30px" name="values5" value="${values5 }"> ${msg5 }
        <hr/> 
        
        <!-- 第六道算术题 -->
         <input type="text"  style="width:40px;height:30px"  name="value11" id="value11" value="javascript:GetRandomn()" />
            <span><b style="font-size: 22px;">-</b></span>

        <input type="text"  style="width:40px;height:30px"  name="value12" id="value12" value="javascript:GetRandomn()" />

            <span><b style="font-size: 22px;">=</b></span>
        <input type="text" style="width:40px;height:30px" name="values6" value="${values6 }"> ${msg6 }
        <br/> 
        <!-- 第七道算术题 -->
        <input type="text"  style="width:40px;height:30px"  name="value13" id="value13" value="javascript:GetRandomn()" />
            <span><b style="font-size: 22px;">-</b></span>

        <input type="text"  style="width:40px;height:30px"  name="value14" id="value14" value="javascript:GetRandomn()" />

            <span><b style="font-size: 22px;">=</b></span>
        <input type="text" style="width:40px;height:30px" name="values7" value="${values7 }"> ${msg7 }
        <br/> 
        <!-- 第八道算术题 -->
         <input type="text"  style="width:40px;height:30px"  name="value15"   id="value15" value="javascript:GetRandomn()" />
            <span><b style="font-size: 22px;">-</b></span>

        <input type="text"  style="width:40px;height:30px"  name="value16"  id="value16" value="javascript:GetRandomn()" />

            <span><b style="font-size: 22px;">=</b></span>
        <input type="text" style="width:40px;height:30px" name="values8" value="${values8 }"> ${msg8 }
        <br/> 
        <!-- 第九道算术题 -->
         <input type="text"  style="width:40px;height:30px"  name="value17"  id="value17" value="javascript:GetRandomn()" />
            <span><b style="font-size: 22px;">-</b></span>

        <input type="text"  style="width:40px;height:30px"  name="value18"  id="value18" value="javascript:GetRandomn()" />

            <span><b style="font-size: 22px;">=</b></span>
        <input type="text" style="width:40px;height:30px" name="values9" value="${values9 }"> ${msg9 }
        <br/>
        <!-- 第十道算术题 -->
         <input type="text"  style="width:40px;height:30px"  name="value19" id="value19" value="javascript:GetRandomn()" />
            <span><b style="font-size: 22px;">-</b></span>

        <input type="text"  style="width:40px;height:30px"  name="value20" id="value20" value="javascript:GetRandomn()" />

            <span><b style="font-size: 22px;">=</b></span>
        <input type="text" style="width:40px;height:30px" name="values10" value="${values10 }"> ${msg10 } 
        
        
        <br>
        <br>
        <br>
        <!-- <button class="btn btn-success">提交</button>-->    
        <input type="submit" value="提交" />
        <button class="btn btn-danger">重做</button> 
        
        <!--  <input type="reset" value="重置"/>  -->    
    
    </form>    
        ${count }<br/>
        <h2 style="font-family: 微软雅黑"></h2>
        
</body>
</html>
    <script type="text/javascript">

            //获取随机范围内数值的函数
            function GetRandom(n){
                GetRandomn=Math.floor(Math.random()*n+1)
            }
            //开始调用,获得一个1-100的随机数
            for(var i=1; i<21; i++){
                GetRandom(50);
                document.getElementById('value'+i).value = GetRandomn;
                
            }
            
            //输出查看
    //        document.write(GetRandomn)
            //document.getElementById('value1').value = GetRandomn;
            //document.getElementById('value2').value = GetRandomn;
            //document.getElementById('value3').value = GetRandomn;

    </script>
    <script type="text/javascript">
        var h2 = document.getElementsByTagName('h2')[0];
        //获取时间,每隔1s,更新
         
        var t1 = setInterval(function(){
            var d1 = new Date();
            var y = d1.getFullYear();
            var m = d1.getMonth() + 1;
            var d = d1.getDate();
            var h = d1.getHours();
            var i = d1.getMinutes();
            var s = d1.getSeconds();
            //构造表示时间的字符串
            var str = y + "" + m +"" + d + "" + h + "" + i + "" + s + "";
            h2.innerHTML = str;
            //写入到h2标签中
        },1000);
 
    </script>
 
    <script type="text/javascript">
         
        function f1(){
            console.log('setTimeout');
        }
        var t1 = window.setTimeout(f1,1000);
        console.log( t1 );
 
        var btns = document.getElementsByTagName('button');
 
        btns[0].onclick = function(){
            clearTimeout(t1);
        }
 
        var t2 = setInterval(function(){
            console.log( 'setInterval' );
        },1500);
         
        btns[1].onclick = function(){
            clearInterval(t2);
        }
    </script>
    
    

src下的springmvc-config.xml文件内容

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
       http://www.springframework.org/schema/context 
  http://www.springframework.org/schema/context/spring-context-4.3.xsd">
    <!-- 指定需要扫描的包 -->
    <context:component-scan base-package="cn.edu.hnzj.controller" />
    
    <!-- 定义视图解析器 -->
     <bean id="viewResolver" class=
    "org.springframework.web.servlet.view.InternalResourceViewResolver">
         <!-- 设置前缀 -->
         <property name="prefix" value="/WEB-INF/jsp/" />
         <!-- 设置后缀 -->
         <property name="suffix" value=".jsp" />
    </bean> 
</beans>

WebContent下的WEB-INF下的web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>siZeYunSuan</display-name>
  
   <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>
           org.springframework.web.servlet.DispatcherServlet
       </servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc-config.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
  <filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>
               org.springframework.web.filter.CharacterEncodingFilter
        </filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
  </filter> 
  
  <filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  
</web-app>

 运行截图:

 

 

 

 

 

 

四、代码复审

本案例还有一些不足之处,例如代码有点冗余(用Ajax可能会好一些,后端在往前端传数据的时候,会省下一些代码。异步请求,局部刷新。),还有我是前5道题随机生成的加法,后五道题生成的减法,也就是说没有随机生成加减号,这后端再处理的时候就方便很都多。才想起来,忘了对负数进行剔除了,其实这个也简单,在后端进行一下简单的判断就行了。

五、测试

使用的是Debug模式,例如:前端在往后端传数据的时候,开启此模式,可以事半功倍。

六、测试报告

七、事后总结

刚开始接触这个作业本来打算随便做做应付一下,但后来发现,这些页面和后端的代码,还是有些费劲的。我本人是不太擅长做这些前端页面的,我做这个案例在前端花费的时间远大于后端的时间。就比如说那个随机数的生成我就是用最笨的方法弄的。确实完成这个案例,对我前端的技术有不少帮助,同时感觉到了我某些技术的薄弱的地方。

地址:http://39.105.232.183:8080/siZeYunSuan/page.jsp

本博客未经本人同意,禁止转载,否则后果自负。

 

posted on 2021-05-24 21:40  第三学习小组  阅读(145)  评论(0编辑  收藏  举报