基于Android的教学课程系统设计与开发

摘 要

移动应用已经成为人们生活必不可缺的一部分,大学生身为移动应用的最大用户群体,在生活学习娱乐各个方面都与移动应用有着紧密联系,然而针对大学生校园学习的移动应用却寥寥无几,因为不同的学校,甚至不同的院系,都有着自己独特的情况。
该项目借鉴了现有的一些和学习相关的移动应用,结合软件学院的特点,针对软件学院的学生,提供了学生日常学习生活常用的一些功能。主要分为我的课表,我的日程,我的学习,教室预约,我的班级和我的成绩六个主要模块,给学生用户提供课表,学校公告,课程成绩等相关信息,用户还可以自定义自己的日程,也可以进行在线的学习。
该项目最重要的移动端采用Android开发,用Android Studio 作为移动端的开发工具。
在服务器端和数据库方面,采用Node.js结合MongoDB,直接将自己的电脑模拟成服务器,因为数据较为简单,所以采用以便于HTTP协议传输的json格式储存数据的MongoDB作为数据库。
最终该项目经过功能和性能的测试,基本实现各个功能模块,成功实现服务器和移动端的数据交互。

关键词:移动应用;Android;MongoDB

Design and development of campus mobile application based on Android
Abstract

The mobile application has become part of people’s life, and college students as the largest group of users of mobile applications, have close connection with mobile applications in learning, entertainment, and life. However, there are few mobile applications aimed at college students, because different schools, and even different departments, have their own unique situation.
The project learning from some mobile applications related to learning, combing with the characteristics of the software institute, aimed to students in software institute, provides students some of the functions which they may usually use in their daily learning and life. And the project mainly divided into six main modules, my course-table, my schedule, my study, classroom reservation, my class and my grades. And to to provide students with the curriculum, the school bulletin, grades and other information. Students can also customize their own schedules, and can also study on the Internet.
The most important mobile end of the project is developed by Android, and the development tool using Android Studio as the mobile terminal is adopted.
At the end of the server and the database, using Node.js combined with MongoDB, directly use the computer into the server. Because the data is relatively simple, MongoDB is used as the database for storing data in the JSON format that facilitates the transmission of HTTP protocols.
Finally, the function and performance of the project is tested, the basic function modules are implemented, and the data exchange between the server and the mobile terminal is successfully realized.

Key Words:Mobile applications;Android;MongoDB

目 录

摘 要 II
Abstract III
引 言 1
1 绪论 2
1.1 开发背景和目的 2
1.2 开发环境 2
1.2.1 移动端 2
1.2.2 服务器 4
1.2.3 数据库 4
2 可行性研究 5
3 需求分析 6
3.1 功能需求分析 6
3.2 非功能需求分析 6
3.2.1 性能分析 6
3.2.2 易用性分析 7
3.2.3 安全性分析 8
3.2.4 可维护性分析 8
3.2.5 界面分析 8
3.3 用例分析 9
3.4 参考系统 10
4 详细设计 10
4.1 功能模块设计析 14
4.1.1 登录和登出 14
4.1.2 我的课表模块 15
4.1.3 我的学习模块 16
4.1.4 教室预约模块 19
4.1.5 我的日程模块 20
4.1.6 我的班级模块 20
4.1.7 我的成绩模块 23
4.2 数据设计 23
4.3 数据E-R图 23

5 编码实现 29
5.1 编码风格 29
5.2 功能模块实现 29
5.2.1 登录与登出 29
5.2.2 我的课表模块 30
5.2.3 我的学习模块 31
5.2.4 教室预约模块 32
5.2.5 我的日程模块 33
5.2.6 我的班级模块 34
5.2.7 我的成绩模块 34
5.2 功能模块实现 34
5.2.1 登录和登出 34
5.2.2 我的课表模块 35
5.2.3 我的学习模块 35
5.2.4 教室预约模块 39
5.2.5 我的日程模块 40
5.2.6 我的班级模块 41
5.2.7 我的成绩模块 42
6 测试与分析 43
6.1 功能测试 43
6.2 性能测试 46
6.3 分析与展望 46
6.3.1 现状分析 46
6.3.2 改进与展望 47
设 计 总 结 44
参 考 文 献 49
致 谢 50

引 言

随着软件科技和网络技术的发展,以及智能手机的普及,移动应用已经成为人们生活必不可缺的一部分。移动应用有着广大的受众,它方便快捷,种类繁多,在生活的方方面面都涉及的到。移动应用的种类可以说是数不胜数,几乎覆盖所有领域,常见的例如购物,移动支付,聊天社交,影音,游戏,办公,阅读,搜索等等。
移动应用的开发也一直是一个热门的话题,移动应用开发的成本低廉,开发平台繁多,开发的语言也多种多样。移动应用的开发,应该遵循这样几点,首先,要做到操作便捷,简洁大方,交互的步骤越少越好,便于用户的使用,提高体验感;其次,要注重信息的即时性和有效性,信息作为移动应用最重要的一部分,必须保持“新鲜”;还有,一个移动应用应该要有效率和集中性,展现给用户的是最高效和常用的功能,要做到精简。
Android作为一个开源的开发软件,适用性强,扩展性强,其开发简单,用JAVA语言即可进行开发,并且具有丰富多样的类库和开发框架,能实现各种功能。Android开发的应用界面多样化,便于设计出个性化的产品。
考虑到大学生在学习类移动应用中最常用的几个功能,例如课表查看,日程表功能,再结合我们软院自身的情况,例如借教室,尔雅课堂等,再综合现有的学习相关的移动应用,设计出一款基于Android的针对软件学院学生的教学课程APP。
该移动应用主要分为我的课表,我的日程,我的学习,教室预约,我的班级和我的成绩六个主要模块,主要用于和学生之间的信息管理和互动,从软件开发的层次去实现一个教学课程系统。
本论文从软件开发的角度,从需求分析,功能分析,数据设计,详细设计等方面,详细介绍了一个移动应用的开发过程,尽量做到使APP有较高的针对性和实用性,并非做到完美。

1 绪论

1.1 开发背景和目的
随着软件科技和网络技术的发展,以及智能手机的普及,移动应用已经成为人们生活必不可缺的一部分。移动应用的种类可以说是数不胜数,几乎覆盖所有领域,常见的例如购物,移动支付,聊天社交,影音,游戏,办公,阅读,搜索等等。
移动应用的开发也一直是一个热门的话题,移动应用开发的成本低廉,开发平台繁多,开发的语言也多种多样。由于手机的操作系统品种繁多,所以相关的移动应用开发也多种多样,其中最广泛的应该就是Android系统和iOS系统,考虑到开发的难易程度和开发工具,选择Android是比较容易实现的。
大学生身为移动应用的最大用户群体,在生活学习娱乐各个方面都与移动应用有着紧密联系,然而针对大学生校园学习的移动应用却寥寥无几,比较热门的有课程格子,超级课程表等等,但是因为不同的学校,甚至不同的院系,都有着自己独特的情况,所以市面上的校园移动应用不能做到真正的有针对性和适用。
为了方便软件学院学生的日常生活和学习,结合软件学院自身的情况,例如教室外借,通识课尔雅课程的情况,我想设计出一款移动应用,能满足同学的需求,为同学们带来一些便利,让同学们能更轻松地进行网上学习,查看自己学习课程相关的信息。并且,通过这一次的开发研究,更深一步了解掌握软件开发,尤其是移动应用开发的流程。
1.2 开发环境
1.2.1 移动端
移动Android端的开发,选取的工具是Android Studio。
Android Studio 是一个Android集成开发工具,基于IntelliJ IDEA,类似 Eclipse ADT,Android Studio提供了集成的 Android 开发工具用于开发和调试。[1]
在IDEA的基础上,Android Studio 提供:
(1)基于Gradle的构建支持
(2)Android 专属的重构和快速修复
(3)提示工具以捕获性能、可用性、版本兼容性等问题
(4)基于模板的向导来生成常用的 Android 应用设计和组件
(5)功能强大的布局编辑器,可以让你拖拉 UI 控件并进行效果预览
图1.1,图1.2是Android Studio的开发界面。
在这里插入图片描述

图1.1 Android Studio的编程界面

在这里插入图片描述

图1.2 Android Studio的UI设计界面

Android Studio 作为一种Android集成开发工具,具有许多优点:
(1) Google针对Android的特点开发而成,是基于IntelliJ idea改造的IDE,上升空间非常大
(2) 启动速度、响应速度快
(3) UI界面美观
(4) 自动保存,更加智能
(5) 实时预览UI编辑效果
(6) 内置终端
(7) 支持各种插件,如Git、Markdown、Gradle等等
(8) 安装的时候就自带了如GitHub,Git,SVN等流行的版本控制系统
1.2.2 服务器
服务器端的开发,选取的是Node.js。
Node.js是一个Javascript运行环境(runtime)。实际上它是对Google V8引擎进行了封装。V8引 擎执行Javascript的速度非常快,性能非常好。Node.js对一些特殊用例进行了优化,提供了替代的API,使得V8在非浏览器环境下运行得更好。
Node.js是一个基于Chrome JavaScript运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动, 非阻塞I/O 模型而得以轻量和高效,非常适合在分布式设备上运行数据密集型的实时应用。[2]
Nodejs作为一个新兴的前端框架,后台语言,有许多突出的优点:
(1) 它采用RESTful API
(2) 它是采用单线程进行操作
(3) Node.js可以在维持原来线程正常工作的情况下,不创建额外的线程,对任务进行并发处理,它通过事件轮询(event loop)来实现并发操作,所以,这一点可以用来避免阻塞操作。
(4) 非阻塞IO
(5) V8虚拟机
(6) 事件驱动
1.2.3 数据库
数据库的设计,采用MongoDB。
MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。[3]
MongoDB具有一些优势:
(1) 快速,MongoDB拥有适量级内存,将数据存储在在物理内存中
(2) 高扩展性
(3) 自身的failover机制
(4) json的存储格式

2 可行性研究

可行性研究是一项确定建设项目前具有决定性意义的工作,它对拟建项目有关的自然、社会、经济、技术等进行调研、分析比较以及预测建成后的社会经济效益。在此基础上,综合论证项目建设的必要性,财务的盈利性,经济上的合理性,技术上的先进性和适应性以及建设条件的可能性和可行性,从而为投资决策提供科学依据。
(1) 技术可行性
本项目用Android Studio作为移动端的开发,可直接将项目打包成APK。
在实时的 Web连接上,Node.js 采用的是基于 WebSocket 的推送技术,可以保证及时,有效,双向连接的web应用,客户端和服务器端都可以主动地发起通信,也能够有效安全地接收数据。
MongoDB 的数据存储格式为json,方便列表性数据的传输。
(2) 经济可行性
本项目用Android Studio作为移动端的开发,无需开发花费,开发时间短,用自己的电脑作为服务器,也无需花费,若想投入真正的实用中,可将学校或者软院的网站作为服务器,开发费用较低,利用率高,经济可行。
(3) 操作可行性
本项目界面简洁大方,功能模块明确,有较完善的操作和信息的提示机制,输入较少,以信息的展示为主,容易操作。
(4) 社会可行性
本项目未涉及政治,法律,宗教,道德等问题,为违反相关规定。

3 需求分析

本章将从功能需求,性能需求,用例三个大方向对该应用开发进行详细分析,并且提出该应用应该达到的一些标准。在3.4节中,举例了一些现有的基于Android系统的移动应用,用于参考借鉴,以便能更好地开发。
3.1 功能需求分析
(1) 登录与登出
用户输入正确的账号密码后,即可登录应用,进行相关操作,登陆过的账号密码应该自动保存,用户下次打开应用时无需再次输入账号密码,可自动登录。
用户退出登录时,保存的账号密码以及相关信息也应该删除。
(2) 个人信息查看
用户可在应用内查看自己相关信息,例如学号,院系,班级,邮箱等。
(3) 课程表的查看
用户可以查看本学期自己所选的所有课程及其相关信息,例如上课时间,所在教室,授课教师等,在应用中以一周为显示单位。
(4) 在线学习
用户可以在应用中查看可供在线学习的课程列表,选择相关课程,进入学习,根据章节观看视频,可以选择题库进行习题练习,每道题做完后都可以查看正确答案,也可进行测试,加深知识点的巩固。
(5) 日程管理
用户可以添加,删除,修改自己的日程,可以查看任意一天的日程,在应用中以一周为显示单位。
(6) 教室预约
用户可以查看教室列表,选择有空闲时间段的教室,填写预约的时间及其相关预约信息,预约成功后提示用户。
(7) 班级信息查看
用户可以查看自己班级中同学的相关信息,如姓名,学号,联系方式等,还可以查看创建班级公告,及时获取信息。
(8) 成绩查询
用户可以查看自己所选课程的成绩,没有参加考试的课程无需显示成绩。
3.2 非功能需求分析
3.2.1 性能分析
(1) 响应时间
① 启动应用时间<2S
② 页面切换时间<1S
③ 与服务器交互数据时间(网络流畅时)<2S
(与服务器交互数据时间视网络具体情况而定)
(2) 内存占用
① (没有观看视频时)不超过物理内存20%
② (观看视频时)不超过物理内存50%
(3) 并发用户数
① (未连接服务器)数量不限
② (连接服务器)500人
(4) 稳定性
① 持续时间>7*24小时
② 出错率<0.01%
(5) 耗电量
① (没有观看视频时)不超过总耗电量的10%
② (观看视频时)不超过总耗电量的50%
3.2.2 易用性分析
(1) 信息显示
应用在向用户提供信息时,显示的信息必须正确完整,简单易懂,并且具有及时性;复杂的信息可采用分段或者分页显示的方法;同一页面显示的信息不可过多;不同的信息内容要用不同的样式或者大小区分。
(2) 操作简单
应用应该易于操作,页面控件不可过多,控件的文字应当简洁明了;减少用户的输入操作,尽量用选择操作代替输入;页面的层次不可过多,减少页面的跳转;对于一些操作,要采用默认的方法,避免出现特殊的操作。
(3) 消息提醒
对于一些交互性的操作,应当有操作成功或者失败的消息提醒;退出某些特殊页面的时候,应当提醒是否确定退出;进行无法修改或恢复的操作时,应当提醒是否进行操作。
(4) 功能划分
应用的所有功能应该有明确的划分,不同的模块针对不同的功能需求,一个模块最好只突出一个主要功能;各个功能之间要避免交叉重复;避免无用功能。
3.2.3 安全性分析
(1) 保密性
只有输入正确账号密码的用户才可登录应用,对应用进行相关操作用户在退出登录时,保存的账号密码应及时删除
(2) 完整性
信息的展示,修改和必须保证完整性,以规定的数据格式进行数据交互
(3) 可用性和抗毁性
应用备份机制、容错机制,防止在应用出现错误时,系统的备份机制保证应用的正常运行。
3.2.4 可维护性分析
(1) 可理解性
命名方式和编码方式要统一,要有良好的编码规范,适当添加注释。
(2) 可测试性
功能模块化,能进行每一个功能的单独测试;测试的内容越少越好;通过控制测试范围,能够更好地分解问题,执行更灵巧的再测试;测试对应用造成的破坏越小越好,减少改变。
(3) 可修改性
采用标准化的文档资料结构,及时记录开发过程,采用可维护的程序设计语言,要有健全程序的文档。
(4) 可靠性
规定测试时间内,规定测试条件下,特定功能应该做到能正常使用,平均故障间隔时间(MTBF)、平均修复时间(MTTR)、可用度都要达到标准指定要求。
(5) 可移植性
应用要适用于不同的Android系统手机,能成功安装,所用功能都应该正常使用,界面也必须适应不同机型。
(6) 可使用性
应用应该易于使用,便于操作;数据交互步骤要有进度提示,具有一定的容错能力,并且有报错机制。
3.2.5 界面分析
(1) 风格统一
应用整体的风格要统一,控件,图标,图片,提示等,相同功能或者操作的事物的UI要一致。
(2) 简洁大方
应用整体的风格和配色要漂亮大方,同一页面上的控件和展示信息不可过多。
(3) 便于操作
用按钮和选择控件代替输入编辑控件,减少操作;对同一事物的添加,修改,删除,查看功能要有不同的操作;要用默认规范的操作方法。
(4) 避免重复
不同的控件要用不同的UI设计;同一页面内,不同的信息需要用不同展示方式,避免重复和混乱。
3.3 用例分析

在这里插入图片描述

图3.1 应用用例图

图3.1为本应用的用例分析。
用户可登陆,登出应用,登陆应用后可进行先关功能的操作,当输入错误的账号密码时,应该有提醒。
登陆应用后,主页面为六个主功能模块,个人页面即显示用户的相关信息,也可在该页面登出。
该应用主要分为六个模块:
(1) 进入日程模块
① 用户可以查看自己任意一天的日程
② 用户可以修改任意一天的某一日程
③ 用户可以删除任意一天的某一日程
(2) 进入课程表模块
① 用户可以查看自己一周的课程表
(3) 进入教室预约模块
① 用户可以进行教室预约
(4) 进入在线学习模块
① 用户可以对选择某一课程的某一章节进行在线观看视频
② 用户可以对选择某一课程进行习题练习
③ 用户可以对选择某一课程进行测试训练
(5) 进入查看成绩模块
① 用户可以查看自己所有课程的成绩
(6) 进入班级模块
① 用户可以查看自己所在班级同学的相关信息
② 用户可以查看自己班级的公告
③ 用户可以添加自己班级的公告
3.4 参考系统
参考现有的针对大学生的移动应用,以及大学生常用的应用,能更好地完善需求,制定更好地开发方向,使移动应用的功能更贴近学生的要求,更符合日常生活,方便学生的使用。
现有的基于Android的移动应用已经较为成熟,种类繁多,在学习类方面,较为广泛应用的有课程格子,超级课程表等综合向的,还有扇贝单词,网易公开课等提供在线学习的。
(1)课程表
图3.2为课程格子课程表页面。
在这里插入图片描述

图3.2 课程格子应用课程表页面

纵观现有的学习类移动应用,课程表是必备的功能,这也是大学生用学习类移动应用最常用的应用。
课程格子作为现在较为成功的一个学习类移动应用,它最出名的就是课程表的完善系统,其界面也是较为美观。
(2)在线学习
在这里插入图片描述
图3.3 元贝驾考应用题库选择页面 图3.4 元贝驾考应用答题页面

图3.3,图3.4为元贝驾考的应用页面,参考同学们比较常用的在线学习应用,元贝驾考是身边的同学最为常用且体验感较好的一款应用。
元贝驾考的操作较为简单,对每一科目进行选择,然后选择相对应的题库即可进行练习,每道题做完后可以查看正确答案,并对自己的答案进行判断。
在这里插入图片描述

图3.5 元贝驾考应用功能页面

图3.5为元贝驾考应用功能页面,可以看到,元贝驾考应用在习题这一块做得比较详细,分为练习和模拟测试这两个模块,在练习中又有细分。

在这里插入图片描述

图3.6 网易云公开课视频播放页面

图3.6为网易云公开课视频播放页面,每个视频应该结合目录,可以根据章节选择。
(3)日程管理
在这里插入图片描述

图3.7 点击操作时间选择器 图3.8 滑动操作时间选择器

图3.7,图3.8为时间选择器,可以看出,在日程管理这一模块中,对比传统的点击操作时间选择器,滑动操作时间选择器的操作更为简单快捷,现有的新兴的移动应用大多都选择滑动操作时间选择器,这一点在日程创建和管理上可以提供很好的帮助。
在这里插入图片描述

图3.9 日程表结合日历

图3.9为日程表,一般的日程表都会结合日历,方便查看,不过在校大学生的日程多以一周为单位,在设计的时候要考虑到这一点,也要适当结合日历。

4 详细设计

4.1 功能模块设计析
详细设计是软件工程中软件开发前期的一个重要步骤,在详细设计阶段,主要是根据需求分析,设计出满足用户需求的应用功能。良好的详细设计是成功的软件开发的必要保障,并且在这一阶段必须花费一定的时间和精力,保证设计的质量。
这一章节,将对该移动应用进行详细的设计,从时序图出发,详细介绍每个模块中每个功能的操作步骤,以及服务器端和移动端的交互,并且对数据库进行系统的设计,设计每一个类的属性,用E-R图表明各个类的关系。
4.1.1 登录和登出
在这里插入图片描述

图4.1 登录和登出时序图

图4.1为登录和登出的时序图。
(1) 用户输入账号密码后,移动端将账号密码发送给服务器,服务器进行验证后,返回成功码给移动端,移动端进行页面跳转,进入应用。
(2) 用户选择登出,移动端退出应用,返回到登录界面,并且删除用户留在本地的相关数据。

在这里插入图片描述

图4.2 查看个人信息时序图

图4.2为查看个人信息的时序图。
用户进入“个人”页面,移动端自动获取用户的ID,并向服务器发起获取用户信息的需求,服务器端返回用户的个人信息,移动端自动保存这些数据,下次查看时可自动提取移动端本地的数据。
4.1.2 我的课表模块

在这里插入图片描述

图4.3 查看课表时序图

图4.3为查看课表的时序图。
用户点击“我的课表”按钮,进行页面跳转,移动端自动将保存在本地用户的ID发送给服务器,服务器根据用户ID将用户的课表发送给移动端,移动端展示给用户。
4.1.3 我的学习模块
在这里插入图片描述

图4.4 在线学习视频观看时序图

图4.4为在线学习视频观看的时序图。
用户点击“我的学习”按钮,进行页面跳转,移动端向服务器发送获取列表请求,服务器返回所有相关的课程信息,用户再点击自己想学习的课程,移动端将课程ID发送给服务器,服务器返回该门课程的章节和相关视频的信息,用户再点击某个视频,移动端将视频ID发送给服务器,服务器返回给移动端视频的存放路径,移动端根据路径,找到视频,进行播放处理。

在这里插入图片描述

图4.5 在线学习习题练习时序图

图4.5为在线学习习题练习的时序图。
用户点击“我的学习”按钮,进行页面跳转,移动端向服务器发送获取课程列表请求,服务器返回相关的课程信息,用户点击自己想学习的课程,移动端将课程ID发送给服务器,服务器返回该门课程的章节和相关视频的信息,用户再点击“习题”按钮,移动端向服务器发送获取该门课程题库的请求,用户选择某个题库,移动端将题库ID发送给服务器端,服务器返回给移动端该题库的题目,用户即可做题,每做完一道题目,用户可以点击“确定”按钮,移动端会显示每道题目的答案并对用户的答案进行判断。
在这里插入图片描述

图4.6 在线学习习题测试时序图

图4.6为在线学习习题测试的时序图。
用户点击“我的学习”按钮,进行页面跳转,移动端向服务器发送获取课程列表请求,服务器返回所有相关的课程信息,用户再点击自己想学习的课程,移动端将课程ID发送给服务器,服务器返回该门课程的章节和相关视频的信息,用户再点击“测试”按钮,移动端向服务器发送课程ID,服务器端返回该门课程的测试题目,用户进行测试,测试完毕,点击“交卷”,移动端对测试卷进行判卷。并给出成绩显示每道题的结果。
4.1.4 教室预约模块
在这里插入图片描述

图4.7 教室预约时序图

图4.7为教室预约的时序图。
用户点击“教室预约”按钮,进行页面跳转,移动端向服务器发送获取教室列表请求,服务器返回所有相关的教室信息,用户点击某个可预约的教室,移动端进行页面跳转,显示预约界面,用户填写预约周次和星期,点击“节次”按钮,服务器将教室ID,预约周次和星期发送给服务器端,服务器进行判冲,选出可以预约的时间段,返回给移动端,用户选择合适的时间段,再填写好所有的预约信息,点击“提交”按钮,移动端将教室ID以及相关预约信息发送给服务器端,服务器进行数据处理,返回给移动端预约成功或失败的信息,移动端高职用户,并且自动刷新教室列表页面。
4.1.5 我的日程模块
在这里插入图片描述

图4.8 创建日程,修改日程,删除日程时序图

图4.8为用户管理日程的时序图。
(1) 用户点击“我的日程”按钮,移动端进行页面跳转,显示日程列表,用户点击“创建日程”按钮,移动端弹出日程创建对话框,用户填写相关信息,提交,移动端将日程数据保存到移动端本地数据库,并且刷新日程列表。
(2) 用户点击某个日程,移动端弹出带有该日程相关信息的对话框,用户修改日程信息,提交,移动端将日程数据保存到移动端本地数据库,并且刷新日程列表。
(3) 用户长按某个日程,移动端弹出对话框,询问用户是否删除该日程,用户点击“确定”后,移动端将该日程数据从移动端本地数据库删除,并且刷新日程列表。
4.1.6 我的班级模块
在这里插入图片描述

图4.9 查看班级成员时序图

图4.9为查看班级成员的时序图。
用户点击“我的班级”按钮,进行页面跳转,移动端自动将保存在本地用户的ID发送给服务器,服务器根据用户ID将用户所在班级的相关信息发送给移动端,用户再点击“班级成员”按钮,移动端进行页面跳转,显示班级成员列表。
在这里插入图片描述

图4.10 查看班级公告时序图
图4.10为查看班级公告的时序图。
用户点击“我的班级”按钮,进行页面跳转,移动端自动将保存在本地用户的ID发送给服务器,服务器根据用户ID将用户所在班级的相关信息发送给移动端,移动端显示班级公告列表,用户再点击某个公告,移动端将该公告ID发送给服务器端,服务器返回该公告相关信息。
在这里插入图片描述

图4.11 创建班级公告时序图

图4.11为创建班级公告的时序图。
用户点击“我的班级”按钮,进行页面跳转,移动端自动将保存在本地用户的ID发送给服务器,服务器根据用户ID将用户所在班级的相关信息发送给移动端,移动端显示班级公告列表,用户点击“创建公告”按钮,移动端进行页面跳转,跳到新建公告页面,用户填写公告相关的信息,提交,移动端发送新建公告信息给服务器端,服务器端进行数据处理,返回给移动端创建成功或失败的信息,移动端告知用户,并刷新班级公告列表页面。
4.1.7 我的成绩模块
在这里插入图片描述

图4.12 查看我的成绩时序图

图4.12为查看我的成绩的时序图。
用户点击“我的成绩”按钮,进行页面跳转,移动端自动将保存在本地用户的ID发送给服务器,服务器根据用户ID将用户的所有课程成绩发送给移动端,移动端展示给用户。
4.2 数据表结构设计

表4.1 Student类表
字段名 数据类型 意义
stuNum String 学生学号
stuName String 学生姓名
stuSex String 学生性别
stuMajor String 学生所在院系
stuClass String 学生所在班级
stuPhone String 学生的联系电话
stuEmail String 学生的邮箱
password String 学生的密码

Student表用来记录学生用户的相关信息,stuNum为主键,只有在表中有记录并且输入正确的账号密码的用户才能登陆系统。

表4.2 Course类表
字段名 数据类型 意义
itemNum String 课程编号
courseNumber String 课程号
courseName String 课程名称
weekday String 周几上课
start_class int 开始节次
end_class int 结束节次
sectionSpan int 跨几节课
classroom String 所在教室
cname String 任课老师
start_week int 开始周次
end_week int 结束周次

Course表用来记录所有课程的相关信息,itemNum为主键。

表4.3 SchoolWeek类表
字段名 数据类型 意义
weekDate int 日期
week int 周次
weekday int 星期几

SchoolWeek表用来记录校历相关信息,weekDate为主键,以便课表与相对应日期的显示。

表4.4 LearningCourse类表
字段名 数据类型 意义
id int 课程号
title String 课程标题
cname String 授课教师
isOpen int 是否开放

LearningCourse表用来记录所有网上学习课程的相关信息,id为主键,这里的课程与学生平时在教室所上的课程没有关系,是独立的部分。

表4.5 Stu_Cou类表
字段名 数据类型 意义
stuNum String 学生学号
itemNum String 课程编号

Stu_Cou表用来记录学生选的课程,stuNum为主键。ItemNum为外键。

表4.6 LearningChapter类表
字段名 数据类型 意义
id int 章节号
title String 章节名称
courseId int 课程号

LearningChapter表用来记录所有网上学习课程的相关章节信息,id为主键,courseId为外键。

表4.7 Video类表
字段名 数据类型 意义
id int 视频浩
chapterId int 章节号
title String 视频名称
videoPath String 视频路径

Video表用来记录所有网上学习课程的相关视频信息,id为主键,chapterId为外键。

表4.8 QuestionPool类表
字段名 数据类型 意义
id int 题库号
title String 题库名称
courseId int 课程号

QuestionPool表用来记录网上学习课程的题库信息,id为主键,courseId为外键。

表4.9 Question类表
字段名 数据类型 意义
id int 题目号
description String 题干
text List 选项
answer List 答案,1为正确答案,0为错误答案
type int 题目类型,1为多选,2为单选
PoolId int 题库号

QuestionPool表用来记录所有网上学习课程的相关题库信息,id为主键,courseId为外键。

表4.10 Schedule类表
字段名 数据类型 意义
id int 日程号
date String 日期,格式为yyyy-MM-dd
time String 时间,格式为hh:mm-hh:mm
content String 日程内容
hourFromSelection int 日程开始的小时,从0-24
minuteFromSelection int 日程开始的分钟,从0-60
hourToSelection int 日程结束的小时,从0-24
minuteToSelection int 日程结束的分钟,从0-60

Schedule表用来记录学生日程的相关信息,id为主键,courseId为外键。

表4.11 ClassX类表
字段名 数据类型 意义
id int 预约号
week int 周次
weekDay int 星期几
section int 节次,从1到13
content String 预约内容
student String 预约学生
ps String 备注

ClassX表用来记录教室预约的相关信息,id为主键,ClassX中的X表示教室,一个教室对应着一张表格。

表4.12 Announcement类表
字段名 数据类型 意义
id int 公告号
title String 公告标题
time String 公告创建时间
sponsor String 公告创建者
content String 公告内容
class String 公告所在班级

Announcement表用来记录所有公告的相关信息,id为主键。

表4.13 Grade类表
字段名 数据类型 意义
id int 成绩号
stuNum int 学生学号
courseId int 课程号
grade int 成绩

Grade表用来记录所有学生课程成绩的相关信息,id为主键,stuNum,courseId为外键。

4.3 数据E-R图
在这里插入图片描述

图4.1 E-R图

图4.1为该应用的E-R图,以学生为中心,每个学生属于一个班级,每个班级有许多公告,属于该班级的学生可以查看本班级的公告;学生选择不同的课程,每一门课程都有对应的成绩;学生可以管理自己的日程;学生还可以进行网上学习,每门课程都有许多章节,每个章节有对应的视频,每门课程还有对应的题库,题库里有对应的题目,供学生在线练习和测试。

5 编码实现

5.1 编码风格
(1) 变量命名方式
骆驼式命名法(Camel-Case),例如weekNames,mFreshLayout。
静态变量用大写。
(2) 注释
每个类的前端都使用Javadoc标准注释,写明每个类的用途。
每个变量都在定义时注释它的意义。
每个方法都在定义是注释它的用途。
(3) 属性定义
所有属性应定义在文件的开始处,或者定义在使用它的方法的上面。
(4) 限制行的长度
每行字符的个数不超过80个,保证查看和复制代码的便捷性。
(5) 大括号
左括号不换行。
(6) 类的划分
所有类按功能模块划分,公共的类放在Common包内。
5.2 代码实现
5.2.1 登录与登出
创建一个线程,使用HTTP协议,通过URL,将账号密码作为参数传给服务器,再通过handler处理从服务器返回的数据,判断账号密码是否匹配成功,若匹配成功,则登录应用,跳转到主页面,并将账号密码保存到sharedpreference,保存在移动应用本地。
//将账号密码发送给服务器
String content = “username=” + userNameValue ;
content += “&&password=” + passwordValue;// 作为get方法的参数
try {
URL url = new URL(PATH + “?” + content);
getConnection(url,handlerForLogin );// getConnection是封装好的利用http协议连接服务器的方法
} catch (MalformedURLException e) {
e.printStackTrace();
}
// 处理服务器返回的数据
public Handler handlerForLogin = new Handler() {
public void handleMessage(Message msg) {
String response = msg.obj.toString();
//0表示没有这个账号,2表示密码错误,1表示登陆成功
int result = 0;
try {
JSONObject jsonObject = new JSONObject(response.toString());
result = jsonObject.getInt(“success”);
} catch (JSONException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
if(result == 1){
//登录成功才保存用户信息
SharedPreferences.Editor editor = sp.edit();
editor.putString(“USER_NAME”, userNameValue);
editor.putString(“PASSWORD”,passwordValue);
editor.commit();
//登录成功,转到主页面
Intent intent = new Intent(Login.this,MainActivity.class);
startActivity(intent);
finish();
}
//省略别的状态
}
};
5.2.2 我的课表模块
移动端通过http协议,发送给服务器学生的学号,服务器返回该学生选择的所有课程,将所有课程分为周一至周天七个列表,根据当前日期和校历,匹配出当前的周次,选取该周次的课程,利用自定义的TextView绘出课程。
//获取课程表的信息,并且按照周一,周二,周三。。。的顺序存放
private static List[] getCourseData(List list) {
List courseModels[] = new ArrayList[7];

for (int i = 0; i < courseModels.length; i++) {
    courseModels[i] = new ArrayList<>();
}
List<CourseModel> models_1 = new ArrayList<>();

//重复周二到周天的list
for(int i = 0;i < list.size(); i ++){
if(list.get(i).getWeekday()==1){
models_1.add(new CourseModel(list.get(i).getCourseCodeId(),list.get(i).getItemName(),list.get(i).getStart_class(),list.get(i).getEnd_class(),list.get(i).getWeekday(),list.get(i).getLabRoomName(),list.get(i).getStart_week(),list.get(i).getEnd_week(),list.get(i).getCname(),(int) (Math.random() * 10)));
}
//重复周二到周天的list
}
courseModels[0].addAll(models_1);
//重复周二到周天的list
return courseModels;
}
//初始化课程表格
public void initWeekPanel(LinearLayout ll, List data) {
//没有数据时,返回
if (ll == null || data == null || data.size() < 1)
return;
CourseModel firstCourse = null;
for (int i = 0; i < data.size(); i++) {
final CourseModel courseModel = data.get(i);

    if (courseModel.getStart_class() == 0 || courseModel.getSectionSpan() == 0)
        return;
//匹配校历
    if(courseModel.getStart_week()<=weekOfSchool&&courseModel.getEnd_week()>=weekOfSchool){
        FrameLayout frameLayout = new FrameLayout(this);

        CornerTextView tv = new CornerTextView(this,
                getCourseBgColor(courseModel.getCourseFlag()),
                dip2px(this,3));
        //省略CornerTextView的参数设置
        if (i == k) {
            frameLp.setMargins(0, (courseModel.getStart_class() - 1) * itemHeight, 0, 0);
        } else {
            frameLp.setMargins(0, (courseModel.getStart_class() -1- firstCourse.getEnd_class()) * itemHeight, 0, 0);
        }
     }
}

5.2.3 我的学习模块
视频播放:导入第三方开源库vitamio。
if (!LibsChecker.checkVitamioLibs(this))
return;
//设置全屏
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_video_view);
mVideoPath = VIDEO_PATH;
//初始化播放控件
initviews();
//初始化控制栏
initController();
//初始化视频设置
initVideoSettings();

//初始化播放器
private void preparePlayVideo() {
startLoadingAnimator();
mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mediaPlayer) {
// TODO Auto-generated method stub
stopLoadingAnimator();

            if (currentPosition > 0) {
                mVideoView.seekTo(currentPosition);
            } else {
                mediaPlayer.setPlaybackSpeed(1.0f);
            }
            startPlay();
        }
    });
 }

答题界面:自定义viewPager,并设计出自定义的questionAdapter。
//答题界面
questionAdapter = new QuestionAdapter(LearningOfQuest.this, viewItems, listOfQuestionForQuest);
viewPagerForQuest.setAdapter(questionAdapter);
viewPagerForQuest.getParent().requestDisallowInterceptTouchEvent(false);

倒计时功能:自定义TextView,并创建线程,每隔一秒刷新TextView的内容,达到倒计时效果。
//倒计时功能,自定义TextView
@Override
public void run() {
//标示已经启动
if(mHour0&&mMin0&&mSecond0){
Dialog alertDialog = new AlertDialog.Builder(LearningOfTest.mactivity).
setTitle(“时间到,自动交卷”).
setPositiveButton(“确定”, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//省略跳转页面代码 }
}).create();
alertDialog.show();
//停止线程
removeCallbacks(this);
}
else{
if(run){
ComputeTime();
//省略设置时间
//每秒刷新一次时间
postDelayed(this, 1000);
}else {
removeCallbacks(this);
}
}
}
5.2.4 教室预约模块
利用http协议,从服务器获取教室列表,选中教室,点击按钮,在dialog中选择合适的周次和日期,发送给服务器,服务器返回可供选择的时间段,再填写相关信息,发送给服务器,服务器返回是否预约成功,并且刷新教室列表。
选择日期:创建单选以及多选的dialog,供用户选择(以选择日期为例)。
weekDay=(Button)findViewById(R.id.btnChooseWeekDay);
weekDay.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//用于标记选中哪一天
final int[] choose = {0};
//默认显示是周一
if(mWeekDay
0){
choose[0]=1;
}
else{
choose[0]=mWeekDay;
}
//选项显示数组
final String[] arrayWeekDay = new String[] {“星期一”, “星期二”, “星期三” , “星期四” , “星期五” , “星期六” , “星期天”};
//创建选项框
alertDialogForWeekDay = new AlertDialog.Builder(OrderRoom.this)
.setTitle(“请选择星期”)
.setSingleChoiceItems(arrayWeekDay,(choose[0]-1), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
choose[0] = which+1;
mWeekDay=choose[0];
weekDay.setText(arrayWeekDay[mWeekDay-1]);
isChooseWeekDay=1;
}
}).create();
alertDialogForWeekDay.show();
}
});
5.2.5 我的日程模块
自定义wheelview,结合自定义的dialog,创建日程。
自定义MyDatabaseHelper继承SQLiteOpenHelper,获取当前日期,或者选中日期,利用MyDatabaseHelper将创建的日程信息和日期保存在SQLite中,查看某一天的日程,只要读取SQLite中的信息即可,删除日程只要删除记录即可。
addShedule=(Button)findViewById(R.id.btnAddSchedule);
addShedule.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
TimeChooseDialog.Builder builder = new TimeChooseDialog.Builder(MySchedule.this);
builder.setPositiveButton(“确定”, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
ContentValues values = new ContentValues();
String time = TimeToStandard(hourFromSelection)+“:”+TimeToStandard(minuteFromSelection)+“-”+TimeToStandard(hourToSelection)+“:”+TimeToStandard(minuteToSelection);
values.put(“date”, chooseDate);
//。。。。。。省略其他参数的保存
//保存到数据库
SQLiteDatabase db = dbHelper.getWritableDatabase();
db.insert(“Schedule”,null,values);
//刷新页面
refreshTheList();
}
});
builder.setNegativeButton(“取消”,
new android.content.DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builder.create(0,0,0,0,“”,myListener).show();//传入需要获得的数据
}
});
5.2.6 我的班级模块
移动端通过http协议,发送给服务器学生的学号,服务器返回该学生所在班级的公告列表,以及该班级学生的相关信息。
学生点击公告,将公告ID发送给服务器,服务器返回公告的相关信息。
创建公告时,学生填写公告标题和内容,自动生成创建时间,发送给服务器,服务器返回是否成功。
5.2.7 我的成绩模块
移动端通过http协议,发送给服务器学生的学号,服务器返回该学生所有课程的成绩通过listview和自定义的adapter显示出来。
5.3 功能实现
5.3.1 登录和登出
在这里插入图片描述

图5.1 登录界面 图5.2 主页面(首页) 图5.3 个人页
用户第一次打开移动应用,首先进入登录界面,如图5.1所示,输入正确的账号密码,点击“登录”按钮,移动端和服务器进行数据交互,传送账号密码,在数据库中进行匹配,若匹配正确,则登陆成功,进入主页面,如图5.2所示,之后可进行相关功能的操作。
用户点击主页面最底部的导航栏中的“首页”和“个人”按钮,可进入到不同的页面。主页是六个功能的按钮,点击可进入各个功能的页面,如图5.3所示,个人页面会显示用户的个人信息,个人页面的底端有“退出登录”按钮,点击会弹出提示框,确认退出后即可退出登录。
用户登录应用后,账号密码会自动保存在移动应用中,下次打开应用时会自动登录,进行退出登录操作后,账号密码会自动删除。
5.3.2 我的课表模块
在这里插入图片描述

图5.4 课表页面 图5.5 课程详细信息

图5.4,5.5为课程表页面,用户点击首页“我的课表”按钮,即可进入我的课表页面,查看当前周次的课表。顶部会显示当前周次,下方是一周的标题,当天会用红色标出,左边是节次,一天共有13节,可下滑页面查看完整信息,主体是课程表,不同的课程用不同的颜色标出,显示课程的名称和所在教室。
点击相应的课程,会显示该门课程的相关信息。
点击“返回”按钮即可返回主页。
5.3.3 我的学习模块
在这里插入图片描述

图5.6 课程列表页面 图5.7 视频列表页面
在这里插入图片描述

图5.8 最新视频列表 图5.9 选择章节对话框

用户点击首页“我的学习”按钮,即可进入我的学习页面,如图5.6所示,查看当前所有在线学习的课程,点击可供开发的课程,即可跳转到学习页面,如图5.7所示,同时也是视频列表页面,该页面会显示该门课程所有的视频,选中“最新”选择框,即可查看最新更新的视频,如图5.8所示,点击“选择章节”按钮,弹出选择章节对话框,如图5.9所示,用户选中某一章节,列表仅显示该章节的视频。
点击“返回”按钮即可返回主页或回退到上一个页面。
在这里插入图片描述

           图5.10  视频加载页面                 图5.11  视频播放(控制)页面  

用户点击视频,即可进入视频播放页面,如图5.10所示,进行一段时间的加载,即可观看视频,视频自动转换为横屏模式。
单击屏幕,即可调换出底部控制栏,如图5.11所示,可暂停/播放视频,点击“快进/后退”按钮调节进度,也可移动进度条控制播放的进度,点击“屏幕”按钮可切换屏幕的大小,点击“截图”按钮进行截图,在视频左部上下滑动可调节视频亮度,在视频右部上下滑动可调节视频的声音。
点击“返回”按钮即可返回主页或回退到上一个页面。
在这里插入图片描述

图5.12 题库目录 图5.13 答题页面
在这里插入图片描述

 图5.14  答案判断页面        图5.15  题目目录对话框

用户点击“练习”按钮即可进入题库列表页面,如图5.12所示,选择其中一个题库,进入练习页面每道题有题目和选项,分为单选题或者多选题,如图5.13所示,进行选择后,点击“确定”按钮,即可查看正确选项,如图5.14所示,否则会弹出提示框,提醒选择后再进行判题。
底部的菜单栏可以选择上一题/下一题,到达第一题/最后一题则会弹出提示框。
中间的目录栏会显示答题的进度,点击会弹出题目目录,如图5.15所示,做过的题颜色加深,点击题目可以跳转到对应的题目。
点击“返回”按钮即可返回主页或回退到上一个页面。
在这里插入图片描述

图5.16 测试提示框 图5.17 测试页面 图5.18 测试结果页面

用户点击“测试”按钮,弹出提示框,如图5.16所示,点击确定即可进入测试页面,如图5.17所示,测试页面左上角有计时功能,时间结束自动交卷,少于指定时间倒计时颜色变红,用于提醒。
底部的菜单栏可以选择上一题/下一题,到达第一题/最后一题则会弹出提示框。
中间的目录栏会显示答题的进度,点击会弹出题目目录,做过的题颜色加深,点击题目可以跳转到对应的题目。
做到最后一题会出现交卷按钮,点击“交卷”即可交卷,立即进行判卷,跳转到测试结果页面,如图5.18所示,显示每道题的答题情况和得分,并显示最终成绩。
点击“返回”按钮即可返回主页或回退到上一个页面。
5.3.4 教室预约模块

在这里插入图片描述

用户点击“教室预约”按钮,即可进入教室列表页面,如图5.19所示,查看所有教室的预约信息,点击可预约的教室,即可进入教室预约页面,如图5.20所示。周次,星期,节次,都是选择操作,用户单击按钮,即可弹出相应对话框,如图5.21所示,选择合适的时间段,再填写预约相关内容,点击“清空”按钮即可清空所有的信息,点击“提交”按钮即可提交预约申请。
申请成功后会立即返回“预约成功”的提醒,退出预约页面,如图5.22所示,教室列表页面即时刷新,失败也会返回“预约失败”的信息。
点击“返回”按钮即可返回主页或回退到上一个页面。
5.3.5 我的日程模块

在这里插入图片描述

用户点击“我的日程”按钮,即可进入日程列表页面,如图5.23所示,顶部是一周的标题栏,显示对应的日期,采用国际日期的形式,底部三个按钮可切换不同的周次,查看对应的日程。
点击“添加”按钮,弹出新建日程的对话框,如图5.24所示,滑动选择日程的开始和结束时间,填写内容,点击“确定”按钮,即可添加日程,如图5.25所示。
单击日程弹出对话框,对日程进行修改,长按弹出提示栏,点击确定删除日程。
点击右上角日历按钮,即可跳转到日历页面,如图5.26所示,点击某一天,即可自动跳转到当天的日程列表页面。
点击“返回”按钮即可返回主页或回退到上一个页面。
5.3.6 我的班级模块
在这里插入图片描述

用户点击首页“我的班级”按钮,即可进入我的班级页面,如图5.27所示,查看当前的班级公告列表,点击某个公告,即可跳转到对应公告的详细页面,如图5.28所示,可以看到公告的详细信息。
点击公告列表页面的“添加公告”按钮,即可进入新增公告页面,如图5.29所示,可输入公告的标题和内容,发布人和发布者自动生成。点击“清空”按钮清空所有输入数据,点击“提交”按钮即可新建公告。
点击我的班级页面上端的“班级成员”按钮,如图5.30所示,可查看班级成员的相关信息。
点击“返回”按钮即可返回主页或回退到上一个页面。
5.3.7 我的成绩模块
在这里插入图片描述

图5.31 我的成绩列表页面

成绩班级页面,查看班级公告列表,点击某个公告,查看课程成绩的相关信息,如图5.31所示。
点击“返回”按钮即可返回主页。

6 测试与分析

软件测试是为了发现错误而执行程序的过程。在项目开发正式完成之前,软件测试是必须经历的环节,它能发现软件潜在的错误,从而提高软件的质量。
该项目的测试主要采用黑盒测试,按照需求分析里的对项目的功能和性能要求进行测试。测试参与人员用的测试机是自己的手机,都是在Android 4.1版本以上系统的基础上,在规定时间和情况下,对该应用进行了测试。
6.1 功能测试
(1) 登录和登出

表6.1 登录与登出功能测试表
功能操作 是否成功
输入错误的账号密码不能登录应用,并且有相对应的提示 是
输入正确的账号密码能成功登录应用,并且提示“登陆成功” 是
退出应用后,下次打开应用能够自动登录 是
点击“退出登录”按钮,能成功退出应用,并返回到登录页面,之前登录的账号密码成功删除 是

(2) 查看个人信息

表6.2 查看个人信息功能测试表
功能操作 是否成功
能正确显示用户的相关信息 是

(3) 查看我的课表

表6.3 查看我的课表功能测试表
功能操作 是否成功
能根据校历正确显示当前的周次 是
能正确显示当前周次的所有课程 是
点击某个课程,能正确显示该门课程的相关信息,如所在教室,授课教师 是

(4) 在线学习

表6.4 在线学习功能测试表
功能操作 是否成功
正确获取所有可供在线学习的课程列表 是
点击不开放的课程不进行页面跳转,无更多操作 是
点击开放的课程,能进行页面跳转,成功显示该门课程的所有章节和视频列表 是
点击“选择章节”按钮,能成功弹出章节列表的选择框,进行选择后,视频列表仅显示对应章节的视频 是
点击“全部章节”按钮可显示全部视频列表 是
选中“最新”选择框,仅显示最新的视频 是
点击“练习”按钮,成功跳转到课程对应的的题库列表 是
点击某个题库,成功跳转到答题页面 是
答题后,点击“确定”按钮,成功进行判题 是
点击上一题/下一题,成功进行题目跳转 是
到达第一题/最后一题,点击上一题/下一题成功弹出提示 是
点击目录,成功显示已答题目和未答题目,点击题号成功进行跳转 是
点击“测试”按钮成功弹出提示框 是
成功进入测试页面,能进行答题 是
倒计时功能成功显示 是
点击答题能成功交卷 是
倒计时结束能成功交卷 是
交卷后能对答案进行判卷,并给出成绩 是

(5) 教室预约

表6.5 教室预约功能测试表
功能操作 是否成功
能正确显示所有教室列表 是
点击预约满额的教室不进行页面跳转,无更多操作 是
点击可预约的教室,成功进行页面跳转 是
点击“周次选择”按钮,成功弹出选择周次对话框 是
选择周次后对话框消失,预约页面上显示选择的周次 是
点击“日期选择”按钮,成功弹出选择日期对话框 是
选择日期后对话框消失,预约页面上显示选择的日期 是
点击“节次选择”按钮,成功弹出选择可供选择的节次对话框 是
选择节次后对话框消失,预约页面上显示选择的节次 是
可填写预约的相关信息 是

															续表6.5

功能操作 是否成功
点击“清空”按钮,所有信息清空 是
点击“提交”按钮,能预约成功 是
预约成功/失败后,返回信息告诉用户 是
预约后,教室列表页面自动刷新 是

(6) 我的日程

表6.6 我的日程功能测试表
功能操作 是否成功
进入日历主页面,能正确显示的当前周次日期 是
点击“添加”按钮,能成功弹出日期选择对话框 是
能够滑动选择日程的时间段 是
能够填写日程内容 是
点击“确定”能成功创建日程 是
点击日程能弹出修改日程对话框 是
修改日程后,能成功保存 是
长按日程能够成功删除日程 是
点击上一周/下一周/本周按钮,能成功跳转到对应周次 是
点击“日历”按钮,能成功显示日历 是
选中日历中的某一天,能成功跳转到那一天的日程 是
日程信息能成功保存在本地数据库中 是

(7)查看成绩

表6.7 查看成绩功能测试表
功能操作 是否成功
能正确显示用户所有课程的相关成绩 是

(8) 我的班级

表6.8 我的班级功能测试表
功能操作 是否成功
能成功显示用户所在班级的班级公告 是
点击某个公告能成功跳转到该公告的详细信息页面 是
点击“新增公告”按钮,能成功跳转到新增公告页面 是
能成功填写公告的标题和内容 是
续表6.8
功能操作 是否成功
点击“清空”按钮能成功清空信息 是
点击“提交”按钮,能成功提交公告 是
新建公告成功/失败后,返回信息告诉用户 是
新建公告后,公告列表页面自动刷新 是
能成功显示用户所在班级的班级成员的信息 是
6.2 性能测试
表6.9 性能测试表
性能 内容 是否做到
响应时间 启动应用时间<2S 是
页面切换时间<1S 是
与服务器交互数据时间(网络流畅时)<2S
(与服务器交互数据时间视网络具体情况而定) 是
内存占用 (没有观看视频时)不超过物理内存20% 是
(观看视频时)不超过物理内存50% 是
并发用户数 (未连接服务器)数量不限 测试时可达到20人
(连接服务器)500人 测试时可达到20人
稳定性 持续时间>7*24小时 是
出错率<0.01 是
耗电量 (没有观看视频时)不超过总耗电量的10% 是
(观看视频时)不超过总耗电量的50% 是
6.3 分析与展望
6.3.1 现状分析
该项目基本满足了需求分析里提及的主要功能,有较完善的系统体系,操作简单,界面简洁大方。
我的课表模块中,能成功显示课表,且课表界面较为美观。
我的学习模块中,视频采用的测试视频,能正常播放;练习和测试功能也成功实现。
教室预约模块中,能成功实现预约教室的功能,且操作并不复杂。
我的日程模块中,能成功地实现创建,修改,删除,查看日程功能,并且使用较为方便的wheelview控件来选择时间段,提高了交互感。
我的班级模块中,能成功显示和创建班级公告,提高了应用的实用性。
我的成绩模块中,能成功显示成绩。
总体上,功能基本实现,性能基本达到要求,但仍可以进一步改进。
6.3.2 改进与展望
结合自己的设计过程,测试过程,以及部分同学的使用感受,提出以下几点改进:
(1) 需要注意登录唯一性。即同一时间,一个账号仅可以在一个设备上登录,若在其他设备上登录,需要通知之前登录的用户,并强制下线。
(2) 可以增加一个修改密码功能和找回密码的功能。
(3) 课表只能显示当前周次的课程,应该可以查看所有周次的课表。
(4) 改变视频画面大小的功能可以删掉,并没有很大的用处。
(5) 教室预约选择时间段的时候,应该禁止选择过去的日期。
(6) 可以在班级公告里添加回复功能。
(7) 可以在我的成绩页面添加提醒考试日期的功能。
除此之外,应该增强应用的稳定性和拓展性,还应该要注意信息的安全性。

设 计 总 结

本论文从软件开发的角度,从需求分析,功能分析,数据设计,详细设计等方面,详细介绍了一个移动应用的开发过程。这个应用是针对软院的同学们开发的,为的是能给同学们的日程学习生活提供便利。
该项目从需求分析到详细设计再到编码实现,一直都有着一个迭代的过程,一直在不断地修改和完善,这体现了在软件开发的过程中,需求分析和设计是十分重要的,如果前期的工作和根基没有打好,后面的编码会出现很多问题。
该项目在分析设计的时候,主要考虑移动端,主要考虑和用户的交互,而服务器端主要是用来和移动端数据交互,从数据库提取数据。在后台这一部分,应该要加强,以便后期更多功能的拓展,而移动端,也可多与手机的硬件相结合,例如照相机,定位或者短信功能等。
要想开发出一个好的移动应用,不仅要站在用户的角度上考虑,提高他们的使用感,更应该对Android的框架和机制应该有一个更深刻的了解。Android是很容易上手的,但是学好Android却是非常不容易的。不仅仅要对Android的控件、布局、Activity、Service等有深刻的认识,也要对应用程序框架层,运行库层等有一定的了解。并且,Android的开放性很强,每个人有自己的风格,每个人都会开发出有自己特色的移动应用,所以在开发Android时,不要太拘束于某一种风格,也不要照搬别人的东西,要有自己的想法和创意,一点点去尝试,不要怕失败。我觉得,学习Android就一定要动手做一个完整的项目,这样,才能真正掌握Android。
也许这个应用还存在许多问题,但是它是一个较完善的体系,也实现了基本的功能,希望我能在今后的时间里,更深入地学习Android,对这个项目进行改进和完善,希望有一天这个应用能真正被软院软院的学弟学妹们使用,给他们带来便利。

参 考 文 献

[1] 周杰.Android Studio入门体验[OL]
http://blog.sina.com.cn/s/blog_c001435c0101udh8.html
[2] 卢在权.基于Jade/Node.js的亚新齿科网上商城(移动版)的设计与实现[D].2016
[3] 郭琪.基于nodejs的创新实践辅助教学系统[D].2014
[4] 倪红军. 基于Android平台的消息推送研究与实现[J]. 实验室研究与探索,2014,(05):96-100.
[5] 詹成国,朱伟,徐敏. 基于Android的测控装置人机界面的设计与开发[J]. 电力自动化设备,2012,(01):119-122.
[6] 夏帮贵. 基于Android平台的移动学习系统[J]. 西华大学学报(自然科学版),2011,(05):81-84.
[7] 李杨,冯刚,李亮,罗拥华. 基于Android的多媒体应用开发与研究[J]. 计算机与现代化,2011,(04):149-152.
[8] 解攀科. 基于Android的移动学习系统设计与实现[D].华中师范大学,2011.
[9] 朱婷婷,李惠. 基于Android的应用软件的综述[J]. 电脑与电信,2011,(01):42-43.
[10] 党李成. 基于Google Android智能手机平台的研究与应用[D].安徽大学,2010.
[11] 熊刚. 基于Android的智能手机的设计与实现[D].武汉理工大学,2010.
[12] 孙晓宇. Android手机界面管理系统的设计与实现[D].北京邮电大学,2009.
[13] 马越. Android的架构与应用[D].中国地质大学(北京),2008.
[14] Gordon M I, Kim D, Perkins J H, et al. Information Flow Analysis of Android Applications in DroidSafe[C]//NDSS. 2015.
[15] Burton M, Felker D. Android App Development For Dummies[M]. John Wiley & Sons, 2015.
[16] Do Q, Martini B, Choo K K R. Exfiltrating data from Android devices[J]. Computers & Security, 2015, 48: 74-91.
[17] Tan D J J, Chua T W, Thing V L L. Securing android: a survey, taxonomy, and challenges[J]. ACM Computing Surveys (CSUR), 2015, 47(4): 58.
[18] Smith D, Hellman E. Android recipes: a problem-solution approach[M]. Apress, 2016.
[19] Xia M, Gong L, Lyu Y, et al. Effective real-time android application auditing[C]//Security and Privacy (SP), 2015 IEEE Symposium on. IEEE, 2015: 899-914.
[20] Smith D, Hellman E. Android recipes: a problem-solution approach[M]. Apress, 2016.
[21] Developer A. Android studio overview[J]. Retrieved Jan, 2016, 26: 2016.
[22] Yan Y, Cosgrove S, Anand V, et al. Rtdroid: A design for real-time android[J]. IEEE Transactions on Mobile Computing, 2016, 15(10): 2564-2584.
[23] Developers A. Android Studio: The Official IDE for Android[J]. 2016.

致 谢

首先,我要感谢丁老师,在我选择论文题目的时候,对我的支持,理解以及肯定,并且让我明确开发的过程和目标,定期监督我的进程,让我能在有限的时间内完成这一个之前从来没有接触过的项目,以及何冰心学姐对于我论文的指导。
其次,我要感谢陈同学,在服务器端和数据库方面给我提供的支持与帮助,让我更了解Node.js 和MongoDB 。
然后,还要感谢我的同班同学们,对我的移动应用测试提供的帮助,给了我宝贵的参考意见。
最后,我要感谢大学和软件学院以及学院的老师们,在这四年里对我的悉心栽培,让我能沐浴在知识的阳光在,在学校的土壤里,茁壮成长,让我有机会能面对软件这个博大精深的专业,今后,我一定会继续努力,不断前进,发扬大工精神,在软件领域,在社会,成为优秀的一员。
感谢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/451188.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java guide 八股

Java语言特点 简单易学、面向对象&#xff08;继承、封装、多态&#xff09;、平台无关性&#xff08;Java虚拟机jvm&#xff09;、支持多线程、可靠、安全、高效、支持网络编程、编译与解释共存 JVM&#xff1a;Java虚拟机&#xff08;跨平台的关键&#xff09; JRE&#xff…

【maven下载、安装、配置教程】

一、下载 maven 官网&#xff1a;Maven – Download Apache Maven 注意&#xff1a;idea 和 maven 的版本问题&#xff0c;不然 idea 启动项目会发生兼容性错误。如 2020 版本 idea 支持 3.6.3 左右的 maven 版本&#xff0c;用 3.9版本的 maven 会报错。 二、配置maven全局配置…

探索AI时代“芯”路径 软通动力子公司鸿湖万联助阵第八届瑞芯微开发者大会

3月7日-8日&#xff0c;第八届瑞芯微开发者大会&#xff08;RKDC2024&#xff09;在福州成功举办&#xff0c;大会以“AI芯片AI应用AloT”为主题&#xff0c;通过芯片应用及生态伙伴的技术展示、产品和技术论坛等系列活动串联&#xff0c;吸引数千名开发者、合作伙伴以及行业专…

Linux文件与文件系统的压缩

文章目录 Linux文件与文件系统的压缩Linux系统常见的压缩命令gzip&#xff0c;zcat/zmore/zless/zgrepbzip2&#xff0c;bzcat/bzmore/bzless/bzgreppxz&#xff0c;xzcat/xzmore/xzless/xzgrepgzip&#xff0c;bzip2&#xff0c;xz压缩时间对比打包命令&#xff1a;tar打包命令…

Java基础-接口

文章目录 1.快速入门代码&#xff1a;结果&#xff1a; 2.接口基本介绍1.语法注意&#xff1a;在jdk1.8以后接口才可以有静态方法&#xff0c;默认方法 2.代码实例 3.接口的应用场景1.场景介绍2.代码实例4.接口使用细节 5.接口课堂练习题目&#xff1a;答案&#xff1a;注意&am…

【快速上手QT】08-Buttons组件

我们差不多把QT的基础部分讲差不多了。接下来我们把一些组件介绍一下&#xff0c;最后再开始QT的进阶部分&#xff0c;需要先把基础打牢嘛&#xff0c;也当是练习练习怎么使用QT助手了。 就按照QtDesigner里的顺序&#xff0c;今天我们讲一讲Buttons&#xff0c;也就是按钮组件…

Linux命令深入学习——列出帮助手册,开机关机

linux中有多种方法查看一个不熟悉命令的详细信息&#xff0c;如 ls --help&#xff0c;help ls&#xff0c;man ls&#xff0c;info ls 在linux系统中可以使用命令进行开关机以及相关基础操作 同时在进行写入操作时&#xff0c;可以使用快捷键进行操作

微信小程序(一)

WebView app.是全局配置&#xff0c;app.json是全局配置文件&#xff0c;在页面的.json配置文件中的配置会覆盖我们全局的配置 快捷键&#xff1a; .box 敲回车 ----- <view class"box"></view> .row*8 敲回车&#xff1a; .row{$}*8 敲回车 案例1&…

深入浅出Java泛型

公众号「稀有猿诉」 原文链接 深入浅出Java泛型 温故而知新&#xff0c;可以为师矣&#xff01; 在前面的一篇文章中学习了Kotlin的泛型知识&#xff0c;但总感觉还不够深入&#xff0c;因为一些深入的话题和高级的特性并未有讲清楚。但在继续深入之前还是有必要重温一下…

吴恩达深度学习笔记:神经网络的编程基础2.5-2.8

目录 第一门课&#xff1a;神经网络和深度学习 (Neural Networks and Deep Learning)第二周&#xff1a;神经网络的编程基础 (Basics of Neural Network programming)2.5 导数&#xff08;Derivatives&#xff09; 第一门课&#xff1a;神经网络和深度学习 (Neural Networks an…

04-微服务 面试题

目录 1.Spring Cloud 常见的组件有哪些? 2.服务注册和发现是什么意思?(Spring Cloud 如何实现服务注册发现) 3.你们项目负载均衡如何实现的 ? 4.什么是服务雪崩,怎么解决这个问题? 5.你们服务是怎么监控的? 6.微服务限流(漏桶算法、令牌桶算法) 7.解释一下CAP…

scrapy的基本使用介绍

创建项目 ### 1. 创建虚拟环境 conda create -n spiderScrapy python3.9 ### 2. 安装scrapy pip install scrapy2.8.0 -i https://pypi.tuna.tsinghua.edu.cn/simple### 3. 生成一个框架 scrapy startproject my_spider### 4. 生成项目 scrapy genspider baidu https://www.b…

RabbitMQ - 02 - 基本消息模型

目录 部署demo项目 什么是基本消息模型 实现基本消息模型 部署demo项目 首先配置好一个mq的练习demo,并配置好相关依赖 链接&#xff1a;https://pan.baidu.com/s/1oXAqgoz9Y_5V7YxC_rLa-Q?pwdv2sg 提取码&#xff1a;v2sg 如图 父xml文件已经配置好了 AMQP依赖了 什么…

重学SpringBoot3-集成Thymeleaf

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 重学SpringBoot3-集成Thymeleaf 1. 添加Thymeleaf依赖2. 配置Thymeleaf属性&#xff08;可选&#xff09;3. 创建Thymeleaf模板4. 创建一个Controller5. 运行应用并访问页面Thymeleaf基本语法小技巧 国际化步骤 …

Cassandra 安装部署

文章目录 一、概述1.官方文档2. 克隆服务器3.安装准备3.1.安装 JDK 113.2.安装 Python3.3.下载文件 二、安装部署1.配置 Cassandra2.启动 Cassandra3.关闭Cassandra4.查看状态5.客户端连接服务器6.服务运行脚本 开源中间件 # Cassandrahttps://iothub.org.cn/docs/middleware/…

15. UE5 RPG获取GE应用的回调,并根据Tag设置数据显示到窗口

在上一篇介绍了对标签如何在项目中设置&#xff0c;这一篇先讲解一下如何在GE里面使用GameplayTag标签。 之前我在第十一章节中 11. UE5 RPG使用GameplayEffect修改角色属性&#xff08;二&#xff09;介绍了一些GE的属性&#xff0c;在UE 5.3版本中&#xff0c;修改的配置方式…

SpringBoot中MD5使用

SpringBoot中MD5使用 新建md5类 public final class MD5 {public static String encrypt(String strSrc) {try {char[] hexChars {0, 1, 2, 3, 4, 5, 6, 7, 8,9, a, b, c, d, e, f};byte[] bytes strSrc.getBytes();MessageDigest md MessageDigest.getInstance("MD5…

云游戏发行是什么?云游戏发行的演进历程

云游戏发行是一系列基于云游戏技术的游戏发行策略或行为&#xff0c;融合云试玩、云微端、可玩广告、跨端移植等技术&#xff0c;从而在传统游戏发行生态的基础上实现更为卓越的发行效果。 云游戏发行出现的原因 近年来&#xff0c;游戏市场出现负增长。其原因一方面在于游戏版…

高颜值抓包工具Charles,实现Mac和IOS端抓取https请求

Hi&#xff0c;大家好。在进行测试的过程中&#xff0c;不可避免的会有程序报错&#xff0c;为了能更快修复掉Bug&#xff0c;我们作为测试人员需要给开发人员提供更准确的报错信息或者接口地址&#xff0c;这个时候就需要用到我们的抓包工具。 常见的抓包工具有Fiddler、Char…

LeetCode_Java_二叉搜索树系列(题目+思路+代码)

目录 108.将有序数组转化为二叉搜索树 109.有序链表转换二叉搜索树 876.链表的中间节点 108.将有序数组转化为二叉搜索树 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 平衡二叉搜索树。 示例 1&#xff1a; 输入&#xf…