201771030118-司绍斌 实验二 个人项目—《西北师范大学学生疫情上报系统》项目报告

项目 内容
课程班级博客链接 https://edu.cnblogs.com/campus/xbsf/nwnu2020SE
本次作业要求链接 https://www.cnblogs.com/nwnu-daizh/p/12416880.html
我的课程学习目标 根据目前所学知识进行软件开发
这个作业在哪些方面帮助我实现学习目标 学会软件开发的流程
项目Github的仓库链接地址 https://github.com/Eason1011/SSM

1. 实验目的与要求

(1)掌握软件项目个人开发流程。

(2)掌握Github发布软件项目的操作方法。

2.实验内容和步骤

任务一:陈述学生疫情每日上报子系统使用体验;

(1)第一天使用因为人数过多,系统出现了一些问题,在修改之后可以很好地使用。

(2)界面比较简洁,刚开始没有记忆功能,每天都要重新输入信息,后面进行了修改。

(3)功能比较单一,没有提醒功能,很容易遗忘。

任务2:总结详细阅读《构建之法》第1-2章、结合第2章2.3节所述PSP流程,开发一款你自己心目中的西北师范大学学生疫情每日填报系统。

我选择第二类开发要求

  1. 系统外观设计比较简约,操作很简便。

  2. 系统支持用户在线使用

  3. 每日只可填报一次,提交后无法修改,每日十点疫情信息填报截止

  4. 各学院指定负责人登录系统,可查看本学院学生填报的汇总数据,可点击查看学生联系方式、班主任联系方式,学院负责人核实本院所有学生数据后,将数据提交给学校防控办

  5. 学校防控办指定负责人登录《西北师范大学疫情防控信息统计》子系统,可浏览所有学生填报汇总数据清单,通过【导出】可获取疫情数据的EXCEL文件

任务3:完成个人项目报告博文作业

  1. 需求分析:
    1. 背景:2019年12月末,中国武汉发生新型冠状病毒(2019-nCoV) 感染的肺炎疫情,为遏制疫情蔓延,有效切断病毒传播途径,在中央政府指导下,各级政府部分采取了一系列防控措施。值得一提的是,中国互联网企业在此次疫情防控中发挥了社会治理方面的重要作用。各大公司开发研制一系列疫情防控的软件。
    2. 目的:为了完成本校学生的每日疫情基本情况的汇总以及查看。
    3. 疫情上报系统:采用前后端分离的方式,学生疫情上报和老师查看互补影响。学生只需要每天按时上报信息。老师在后台可以进行查看,搜索,导出,删除以及修改功能。
    4. 本系统采用SSM框架开发,前端采用Bootstrap开发。
  2. 功能设计:
    1. 基本功能:

      • 前端采集学生疫情信息,在规定时间内提交
      • 支持多用户同时使用
      • 管理员登录后台后可以查看各个学院的学生上报的疫情信息,查看对应学院的负责人老师名字以及电话号码
      • 管理员可以将学生的疫情信息导出到excel
    2. 扩展功能:

      • 学生如果填报的信息有误,可以联系学院负责人老师进行修改
      • 管理员进去后台后可以根据不同信息进行查询,查看想要的学生疫情信息。并且可以只导出这些数据到excel
      • 增加分页显示
  3. 设计实现:
    1. 数据库设计了四张表,分别为管理员表,学院表,学生疫情表和字典表。

    2. 学生类实现了疫情信息采集,上报到后台,保存当前上报时间等功能

    3. 管理员类实现了登录,学生疫情查看,根据不同信息进行查询,修改和删除以及信息导出到Excel等功能。

  4. 测试运行:
    1. 代码运行截图:

    2. 基本功能截图:

      • 前端登录及学生上报界面

      • 学生上报界面截图

      • 提交成功截图

      • 后台界面截图

      • 导出功能截图

      • 数据导出到Excel

    • GitHub使用截图

    1. 扩展功能截图

      • 后台查询功能

      • 后台修改和删除功能

      • 分页功能

  5. 代码展示:

    粘贴了关于分页的一部分代码:

    @Override
        public int doStartTag() throws JspException {
            JspWriter writer = pageContext.getOut();
            HttpServletRequest request = (HttpServletRequest) pageContext.getRequest();
            Page page = (Page) request.getAttribute(bean);
            if (page == null)
                return SKIP_BODY;
            url = resolveUrl(url, pageContext);
            try {
                // 计算总页数
                int pageCount = page.getTotal() / page.getSize();
                if (page.getTotal() % page.getSize() > 0) {
                    pageCount++;
                }
                writer.print("<nav><ul class=\"pagination\">");
                // 显示“上一页”按钮
                if (page.getPage() > 1) {
                    String preUrl = append(url, "page", page.getPage() - 1);
                    preUrl = append(preUrl, "rows", page.getSize());
                    writer.print("<li><a href=\"" + preUrl + "\">上一页</a></li>");
                } else {
                    writer.print("<li class=\"disabled\"><a href=\"#\">上一页</a></li>");
                }
                // 显示当前页码的前2页码和后两页码
                // 若1 则 1 2 3 4 5, 若2 则 1 2 3 4 5, 若3 则1 2 3 4 5,
                // 若4 则 2 3 4 5 6 ,若10 则 8 9 10 11 12
                int indexPage = (page.getPage() - 2 > 0) ? page.getPage() - 2 : 1;
                for (int i = 1; i <= number && indexPage <= pageCount; indexPage++, i++) {
                    if (indexPage == page.getPage()) {
                        writer.print("<li class=\"active\"><a href=\"#\">" + indexPage
                                + "<span class=\"sr-only\">(current)</span></a></li>");
                        continue;
                    }
                    String pageUrl = append(url, "page", indexPage);
                    pageUrl = append(pageUrl, "rows", page.getSize());
                    writer.print("<li><a href=\"" + pageUrl + "\">" + indexPage + "</a></li>");
                }
                // 显示“下一页”按钮
                if (page.getPage() < pageCount) {
                    String nextUrl = append(url, "page", page.getPage() + 1);
                    nextUrl = append(nextUrl, "rows", page.getSize());
                    writer.print("<li><a href=\"" + nextUrl + "\">下一页</a></li>");
                } else {
                    writer.print("<li class=\"disabled\"><a href=\"#\">下一页</a></li>");
                }
                writer.print("</nav>");
            } catch (IOException e) {
                e.printStackTrace();
            }
            return SKIP_BODY;
        }
    
  6. 总结:

    由于水平有限,只能按照SSM框架的模式进行“模块化”原则,尽量做到各个层级之间互不干扰。由于是个人完成项目,模块化没有很好地体现,后续在小组项目中会更加注意。

  7. 展示PSP
    PSP 任务内容 计划共完成需要的时间(min) 实际完成需要的时间(min)
    Planning 计划 40 30
    ·Estimate 估计这个任务需要多少时间,并规划大致工作步骤 40 30
    Development 开发 1000 1100
    ·Analysis 需求分析 (包括学习新技术) 300 250
    ·Design Spec 生成设计文档 20 20
    ·Design Review 设计复审 (和同事审核设计文档) 0 0
    ·Coding Standard 代码规范 (为目前的开发制定合适的规范) 15 15
    ·Design 具体设计 150 120
    ·Coding 具体编码 335 445
    ·Code Review 代码复审 120 100
    ·Test 测试(自我测试,修改代码,提交修改) 60 150
    Reporting 报告 60 90
    ·Test Report 测试报告 30 50
    ·Size Measurement 计算工作量 20 10
    · Postmortem & Process Improvement Plan 事后总结,并提出过程改进计划 10 30
  • 计划阶段对所需的软件及环境进行了整合,以及前端界面的设计。

  • 开发阶段由于个人水平有限,在编码过程花费了很长时间,修改小bug比较费时。

  • 代码测试阶段由于一些逻辑上的问题,查找后台逻辑花费了一些时间。

    小记

    • 通过这次系统开发,我对软件开发的流程有了一定的了解,不再是以前那种直接开始写代码的过程。了解之后对软件的开发效率有很好的提高作用。

    • SSM框架作为最基本的java后台开发,有一定的优点和缺点,相比于SpringBoot框架有些过程却是比较复杂。以后要抓紧学习SpringBoot这个框架,运用到以后的开发中。

    • JavaScript对处理前端界面的一些问题确实非常强大。

posted @ 2020-03-14 16:46  iEason0727  阅读(428)  评论(2编辑  收藏  举报