android毕业设计——基于Android+Java+Python的手机端办公自动化OA系统设计与实现(毕业论文+程序源码)——办公自动化OA系统

基于Android+Java+Python的手机端办公自动化OA系统设计与实现(毕业论文+程序源码)

大家好,今天给大家介绍基于Android+Java+Python的手机端办公自动化OA系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦。需要下载开题报告PPT模板及论文答辩PPT模板等的小伙伴,可以进入我的博客主页查看左侧最下面栏目中的自助下载方法哦

文章目录:

1、项目简介

  1. OA办公自动化系统自从上个世纪企业级应用的诞生以来,在公司内部作为业务流程的载体,员工沟通的平台,一直以来为保证企业的高效率运作起着十分重要的作用。
    OA办公自动化系统一般都拥有固定的业务逻辑,需求以及功能,是学习企业级软件开发或者客户端/服务器软件开发的一个经典实例。随着现代高级编程语言的发展和智能移动终端的普及,也为了提高用户与OA系统的交互能力,手机端的OA系统已经成为企业OA系统不可或缺的一部分。
    本毕业设计论文介绍使用Java语言设计一个Android手机端OA系统的过程,整个系统是一个Android手机端APP应用,使用了标准的Android SDK开发接口以及Google官方标准的UI设计。手机应用设计过程中涉及了应用界面的编写,内部业务逻辑的设计,变量的定义,算法设计实现,以及与服务器之间的数据交换,从而完成一整套从前必须在PC端才能完成的业务流程。另外,论文也介绍了如何使用Python编写一个为本Android应用设计的服务器端程序。
    通过本次毕业设计可以学到开发一个标准的Android手机应用,如何使用标准的模块设计一款手机应用,如何使用Socket完成Android应用程序与Python服务器之间的数据通讯。
    本论文中第一章介绍本课题的来源、目的、内容、要求及作者有关信息;
    第二章介绍了开发工具和开发环境的背景;
    第三章分析该毕业设计的程序业务流程、使用说明、规则、设计思路及其开发的注意事项;
    第四章论述了该毕业设计的思想和总体结构及流程;
    第五章并详细阐述系统的开发步骤及有关重点实现细节;
    第六章进行系统测试并简要介绍测试方法;
    第七章提及了开发过程中心得体会、经验和感想
    最后是参考资料


2、资源详情

项目难度:中等难度
适用场景:相关题目的毕业设计
配套论文字数:14557个字70页
包含内容:全套源码+配整论文
开题报告、论文答辩、课题报告等ppt模板推荐下载方式:
在这里插入图片描述


3、关键词

移动OA;Android; Python网络编程;客户端/服务器;Socket数据通讯

4、毕设简介

提示:以下为毕业论文的简略介绍,项目完整源码及完整毕业论文下载地址见文末。

第一章 绪论
1.1本课题的来源
顾名思义,所谓移动OA就是可以在移动终端上进行的办公自动化操作的应用程序。随着现代高级编程语言的发展和智能移动终端的普及,也为了提高用户与OA系统的交互能力,手机端的OA系统已经成为企业OA系统不可或缺的一部分。手机的性能日新月异的增长,目前部分高端手机的CPU运算能力甚至已经超过了十几年前的PC端,而不仅仅是硬件方面的提升,今年来随着iOS与Android智能手机操作系统平台的兴起,激发了移动终端开发者极大的热情,移动终端应用如雨后春笋般被开发,由此许多从前在PC端才能完成的任务现今只要拥有一款智能手机,这些任务都可以随时随地完成了。智能手机用用是一种新型的产品,企业级计算机软件的开发和一般的产品的开发有着明显的不同,程序设计人员不仅需要掌握程序设计技巧和软件工程方法,还需要有坚实的专业知识,才能有效地生成一个比较完整的应用程序。

OA系统历经几十年的发展之后,应用软件已经相当成熟,功能上也有了很大的扩展,从原来的单一的办公消息服务,转变为现在公司内部各种工作流的运作平台。OA的系统的设计目标是不变的,那就是更快捷和方便的实现公司内部各个部门和分支之间的交流协作,节省工作时间,降低工作成本,有效整合公司各处的有效资源,为提供高效的协作工作平台。

移动终端的OA系统对于传统的OA系统而言,更一步的增加了整体的运作灵活性,使员工的工作时间、区域不仅仅局限与公司内网的PC端,只要有智能手机的存在,就有可能实现随时办公,随地办公,这无疑大大增强了OA系统的实用能力,从而也进一步的提高了员工的工作效率。

1.2本课题的目的、内容、要求及作者主要贡献
1.2.1目的:
获取一次完整的Android项目开发经验,通过对Android SDK文档的阅读和自我学习,加深自我对面向对象概念的理解。这款应用不论是Adnroid客户端还是Python服务器端都有许多细节问题需要解决,比如身份认证时候的非对称密码系统,公钥私钥系统还有防止SQL注入的要求等。除了这些之外作为一款手机应用还必须考虑到系统的流畅度和与用户交互感受等细节问题。

1.2.2内容:
一个相对完整的手机手机OA系统。主要包括:身份认证,权限系统,流程管理,邮件系统,日程管理,通讯录,即时通讯,信息发布,统计报表,内部会议申请预约等功能。 要求使用图形用户界面,界面色彩、布局要求美观,操作流畅。

1.2.3要求:
主要涉及程序业务逻辑流程的控制,整个手机程序用户界面采用Activity对用户的操作进行响应,主要使用多线程和Service组件来进行相对耗时以及需要在后台运行的耗时操作。在代码的编写上要考虑代码重用的思想,要深入理解抽象类的作用、接口的作用等。

1.2.4作者的主要贡献:
由吴金辉导师认真、负责的指导,本人才能完成了此课题的研究与开发,包括调研、分析、设计、编码、测试、文档编写等内容。

第二章 Android 应用程序开发环境与工具的选择
2.1本课题开发环境的选择
在为开发手机应用时选择编程语言和运行平台时有几个必须考虑的问题:执行平台、开发难易度、语言本身的功能、可使用的外部支持功能与可使用的开发环境、执行速度等。
⒈ 就执行平台而言,考虑到iOS平台必须运行在Apple的设备上,而Apple设备普遍价格较高,对于大多数的中小型企业如果全面实现iOS设备的普及还是有一定难度的。相对而言Android平台大多数针对的是中低端客户,对公司来说实现的成本也较低。而且Android平台上的工具发展也很循序,Google对于自家的平台更新速度也较快,所以目前在Android平台上实现一个相对稳定和安全的企业级应用也是可能的。
⒉ 再者是开发难易程度的问题,C/C++使用较为复杂,设计程序时若不小心将可能导致应用的执行错误,甚至程序终止等情况发生,在测试除错时所花的成本有时并不比开发程序少。Android原生采用Java进行设计,并且Android平台对JVM做了深度的定制和优化,暴露给开发者的接口也都有十分详细的文档来解释。
⒊ 在设计时另一个重要的考虑是程序语言本身的功能,以及其可使用的外部支持。C/C++本身提供有标准函数库,且可调用操作系统本身所提供的一些组件功能。而Java程序语言以C++的语法关键字为基础,由Sun公司所提出,其计划一度面临停止的可能性,然而后来却因为因特网的兴起,这说明了Java程序在因特网平台上拥有极大的优势。
⒋ 执行速度永远是应用运行时的一个重要因素,Android唯一不足的可能就是执行速度方面,不过本应用没有太多十分耗费CPU使用时间的事务,另外相对耗时的事务可以考虑采用Service和多线程来实现。最后,如果速度还是不够理想,Android还可以灵活地使用NDK(Android-Native-Develop-Kit)在Java中嵌入C/C++代码来直接对内存进行操作,从而提高系统的执行速度,不过这样也增加了系统的实现难度,增大了系统出现错误的概率。
在历经数个不同版本的改进与功能加强之后,Android程序本身无论是在绘图、网络、多媒体等方面都提供有相当多的API链接库,甚至包括了3D领域。所以使用Android程序来设计程序可以获得相当多的资源。Android平台的相对平民度,Android开发资源的易获得度,以及实现一个功能可以采用方案的多样性,都是我选择Android平台的重要原因。

2.2本课题开发工具的选择
开发工具的给我们的选择似乎不多,Google官方提倡使用Eclipse配合Android开发套件进行开发。Eclipse几乎是目前世界上最强大的IDE,拥有强大的可定制能力,丰富的插件库,跨平台,支持最新的Java标准,配合Android开发套件能够很好的完成开发以及调试的需求。
Eclipse的可视化集成开发环境包括文本编辑器、工程创建工具、对象浏览器和调试器等。用户可以在集成开发环境中创建工程和打开工程,建立、打开和编辑文件,并可以编译、运行和调试应用程序。可以说在Eclipse中开发Android程序,快速而且高效。

第三章 需求分析
3.1 OA系统企业级需求调研
OA系统就是人体中的神经网络系统,传递领导理念、指令,协调全身肌肉、四肢和谐运行,愉快工作,使企业充满生命力和战斗力,为企业提供一种管理新境界。
总体上讲,它是指一切可满足于企事业单位的、综合型的、能够提高单位内部信息交流、共享、流转处理的和实现办公自动化和提高工作效率的各种信息化设备和应用软件;它不是孤立存在的,而是与企事业单位其它各类管理系统(如电子政务系统、电子商务系统、CRM系统、ERP系统、财务系统)密切相关、有机整合。
OA应该是一个企业除了生产控制之外的一切信息处理与管理的集合。它面向不同层次的使用者,便有不同的功能表现:
对于企业高层领导而言:OA是决策支持系统。OA运用科学的数学模型,结合企业内部/外部的信息为条件,为企业领导提供决策参考和依据;
对于中层管理者而言:OA是信息管理系统,OA利用业务各环节提供的基础“数据”,提炼出有用的管理“信息”,把握业务进程,降低经营风险,提高经营效率;
对于普通员工而言:OA是事务/业务处理系统。OA为办公室人员提供良好的办公手段和环境,使之准确、高效,愉快地工作。
技术范畴:OA是计算机技术在办公业务中的合理应用。计算机技术是OA的前提。如果脱离计算机技术面阔谈OA,无异于痴人说梦。没有计算机技术,OA便成无源之水、无本之木。计算机对信息的存储与处理能力极大地改变了人们的办公方式,提高了工作效率。如:要建立决策支持系统,则需要数据仓库、OLAP等技术;要建立信息管理系统,则要有数据库、程序设计语言等技术;要建立事务/业务处理系统,则离不开数据库、设计良好的人机界面和工作流控制、OLTP等技术。
以上这些探索,都是OA系统需要解决的问题,包括:针对不同的使用者,有不同的管理权限,也有不同的功能需求;对于企业内部业务数据的持久化存储,需要用不同的数据库来实现;而内部工作流的处理,则需要对流程精准的处理方式。

3.2程序需要实现的功能
3.2.1 用户安全登陆、退出应用程序
3.2.2 流程管理
考勤、人事调动、项目申报、发起活动等
3.2.3 日程管理
对项目的持续时间以及工作安排进行监控
3.2.4 邮件系统
企业内部邮件发送
3.2.5 通讯录
企业内部人员的联系方式和通讯信息
3.2.6 即时通讯系统
企业内部即时通讯,交流沟通
3.2.7 信息发布
发布通知,员工第一时间了解到公司的活动与信息
3.2.8 统计报表
定期发送企业内部统计与总结信息
3.3 程序实现方案选择
整个应用尽可能的采用MVC的模式进行架构。
用户界面:
使用各类型的View对象为用户呈现实际内容,并配合使用XML写成的Layout配置文件设定设定页面控件的布局。

业务逻辑:
前台业务逻辑使用Activity控制程序流程走向,并且对用户的触控、点击等操作进行响应。

数据存储:
Android应用使用SQLite数据库进行数据的持久化存储,在程序中使用SQLiteDatabseHelper对象封装对数据的操作。Android客户端数据大部分从服务器端同步获得,并且在客户端作为暂时存储。

第四章 概要设计
4.1 系统的简单设计
4.1.1 登录与身份认证
用户输入账户密码,程序向服务器端验证,验证失败提示失败信息,验证成功则进入下一级界面。
4.1.2 公告发布
在经过成功的用户验证后,应用程序在后台会去获取最新的公司公告信息,并将公告呈现出来,这个页面用户在查看完了之后就可以进入下一页面,当然用户也可以点击跳过按钮,直接进入功能菜单。关于公告是否显示,用户可以在设置菜单中进行选择是否在程序的开始显示公告信息。
在用户点击跳过之后,程序进入功能菜单界面。
4.1.3 功能菜单
经过成功的身份认证后,将进入系统的功能菜单,这里将会看到应用程序所能提供的功能。包括:
 流程管理
 日程管理
 通讯录
 即时通讯
 公告信息
 统计报表
 系统设置
4.2系统的效果说明
本Android应用程序是一个遵循Android开发UI规则的应用程序,程序在各个方面都与当前Android手机ROM的UI风格保持一致。
程序使用Google的标准界面显示,使用GridView、GridLayout来显示块状的界面button分布。
程序使用Fragment来动态显示需要显示的块状数据。
程序使用ListView、ScrollView等来动态生成拥有特定行数的显示列表,比如说如果在数据中查询得到了20行数据,那么ListView会生成一个只有20行的List并显示给用户。
程序不同页面之间的切换,使用StartActivity来进行不同界面的数据传输。
一下是系统基本流程图:

程序的基本结构与流程图如下所示:
在这里插入图片描述
在这里插入图片描述

图4-1 程序流程图

第五章 系统详细设计
5.1 系统功能的详细设计
5.1.1 登录与身份认证
系统由登陆界面开始,首先要求用户输入登录名和密码,登录名和密码由服务器端预先生成。在这个页面开始的同时,后台Service将会检查网络通讯情况,如果手机此时没有连接互联网,那么就会提示用户:手机此时不能连接互联网,所以不能正常使用。并且提示用户进行连接互联网的操作。
如果网络连接正常,当用户输入帐号密码并且点击提交按钮之后,会将用户名和密码提交给后台运行的Service,Service将要开启一个新的线程,将用户名加密,将用户的身份验证信息打包加入Socket发送到服务器端。
在服务器接收到需要进行用户信息验证的请求之后,服务器会对用户名进行分析,查询出数据库中的密码,然后将密码进行加密,发送到手机应用程序。
在手机端接收到服务器返回的加密数据后,与用户输入的密码进行比对,如果密码匹配,那么验证成功,为用户展示系统公告。
在上面的过程中需要保持网络的连接,如果在上述过程中出现网络错误,那么在隔一定的时间后,再次向服务器发送用户身份验证请求,如果还是有异常发生,那么就提示用户:网络环境出现错误,并将程序退回到用户的输入信息的阶段。

5.1.2 功能菜单
经过成功的身份认证后,将进入系统的功能菜单,这里将会看到应用程序所能提供的功能。包括:
 流程管理
 日程管理
 通讯录
 即时通讯
 公告信息
 统计报表
 系统设置
上述这些功能的图标以九宫格的形式分布在功能菜单界面。在用户点击某一个按钮之后,相应按钮的监听器将会捕获到用户的点击事件,并对此事件进行相应,引导用户进入二级菜单进行更为详细的设定。
这里以流程管理为例进行说明。
在用户点击流程管理的图标后,进入流程管理的界面,并且在顶部的标题中显示的是“我的工作区”。

在这个页面依旧是以九宫格的形式来显示能为用户提供的功能。
这些功能包括:
 发起流程
 待处理流程
 申请记录
 审批记录
 待处理任务
 待参加会议
 待阅读收文
此处再以发起流程为例,点击发起流程之后,系统会显示出各种流程在ListView中,作为可选项,例如工资业务流程、考勤请假流程、考勤加班流程、资产租用流程等等。这些都可以在服务器端自己定义。
点击某一个流程之后,会显示下一个界面,需要用户填写关于此流程的详细信息,而根据流程的不同,界面中需要填写的详细信息也会有所不同。但大多数的流程都有时间、详细说明等选项需要填写。

5.1设计应用程序框架

5.1.1编写应用程序框架
使用Eclipse建立项目,在建立项目之前需要已经在Google下载了最近的Eclipse对Android开发的最新插件,Eclipse只是个开发环境的载体,真正组成Android应用程序的组件都是由Google提供的开发组件来完成的。
5.1.1.1新建项目

在这里插入图片描述

5.1.1.2选择开发环境需要的手机操作系统版本

在这里插入图片描述

5.1.1.3设定应用程序的名字,包名,以及应用程序运行所需要的操作系统最低的版本号

在这里插入图片描述

5.1.1.4选择模拟Android手机环境的Android模拟器

在这里插入图片描述

5.1.1.5下载开发需要的Android Software Development Kit(SDK)
在这里插入图片描述

5.1.1.6准备工作结束,我们看到了Android开发工具之一DDMS
在这里插入图片描述

5.1.2为应用程序编写开始界面
下图是应用程序的登录界面。

在这里插入图片描述

图5-3 程序登录界面
登录界面的菜单包含“登录”、“注册” 2个按钮,以及两个输入框,分别输入帐号和密码。
我们使用XML对菜单进行绘制。
XML的layout:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="用户登录"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="5dp"
            android:layout_weight="1"
            android:text="用户帐号"
            android:textAppearance="?android:attr/textAppearanceMedium" />

        <EditText
            android:id="@+id/editText1"
            android:layout_width="166dp"
            android:layout_height="wrap_content"
            android:layout_margin="5dp"
            android:layout_weight="0.18"
            android:ems="10"
            android:text="abc123" >

            <requestFocus />
        </EditText>
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <TextView
            android:id="@+id/textView2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="5dp"
            android:layout_weight="0.78"
            android:text="用户密码"
            android:textAppearance="?android:attr/textAppearanceMedium" />

        <EditText
            android:id="@+id/editText3"
            android:layout_width="166dp"
            android:layout_height="wrap_content"
            android:layout_margin="5dp"
            android:layout_weight="0.18"
            android:ems="10"
            android:inputType="textPassword"
            android:text="abc123" >
        </EditText>
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:baselineAligned="true"
        android:orientation="horizontal" >

        <Button
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_margin="5dp"
            android:text="提交" />

        <Button
            android:id="@+id/button2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_margin="5dp"
            android:text="重新输入" />

        <Button
            android:id="@+id/button3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_margin="5dp"
            android:text="退出" />
    </LinearLayout>

</LinearLayout>

5.1.3为界面按钮增加事件处理
上面己经做好了界面,下面要为每个菜单都增加事件响应。
我们用setOnClickListener接口来做菜单的事件响应。setOnClickListener是用来接受一个动作事件的。用来处理这些动作事件的类要实现这个接口里的方法,这个类要被发生动作的事件的类用CreateListener ( )方法来注册。当动作事件发生后,用来处理这些动作事件相应的方法将被调用。
下面添加菜单的事件响应函数代码。部分的代码如下:
下为登录界面的登录按钮所绑定的按钮,点击后会开启新线程loginThread并在线程中进行验证帐号密码之后会跳转至公告界面。

Button loginButton = (Button) findViewById(R.id.button01);
loginButton.setOnClickListener(new loginButtonListener());

	class loginButtonListener implements OnClickListener {
		@Override
		public void onClick(View v) {
			Thread loginThread = new Thread(new LoginFailureHandler());
			loginThread.start();
		}
}

5.2 应用程序代码的包的设计
在这里插入图片描述

整个应用程序的代码分为7个包:
包括Acitivity、Service、Util、Bean、Constent、Network、Adapter
分别介绍一下其中各个包及其中类的作用
5.2.1 Package org.hexor.oa
这个包中的类为各种Activity, 负责整个程序用户界面的逻辑流程,负责将设计好的视图显示在用户界面上,并监听用户所有的动作,从而对用户的各个操作进行相应的回馈和响应。
5.2.2 Package org.hexor.oa.bean
这个包中的类为各种在程序中使用的对象,将对象封装在Bean中方便这些对象在各个实体类中的使用和数据交换,这与企业级Java开发中的JavaBean是类似的,其中也设置了各种Set/Get、以及重载过数个构造方法,方便对对象的操作,也确保了对象实例内部数据的安全性。
5.2.3 Package org.hexor.oa.constant
定义各种常量,服务器地址,应用程序程序安装路径,缓存路径,缓存大小等,在这个包中的类中大多静态常量,一经定义就不再变化。
5.2.4 Package org.hexor.oa.network
这个包中的模块负责与服务器的初始化连接,数据的通讯等工具类。
5.2.5 Package org.hexor.oa.service
这个包中的类为Service类,以及一些线程的构造等,主要负责后台逻辑与任务的实现,在不打扰用户的情况下完成一系列操作,同时保证了UI线程的顺畅,以实现用户更流畅的操作体验。Service中设计了多个线程以实现不同的任务,线程都是在Service中被初始化去完成特定的任务,比如后台的数据库存储或者调用数据通讯模块在新线程完成数据通讯并动态更新UI线程。
5.2.6 Package org.hexor.oa.util
包含对一些主要对象的构建和生成工作。
5.2.7 Package org.hexor.oa.adapter
Adapter的存在就是为了将数据库中的内容按照读取出来的行动态的呈现给用户,这个包中的类设计了各种adapter通过不同的样式呈现给用户

5.3应用程序内容的设计
5.3.1用户身份验证

package org.hexor.oa;

import java.io.DataInputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.Toast;
import android.widget.CompoundButton.OnCheckedChangeListener;

public class Login extends Activity {

	private String userName;
	private String password;

	private EditText view_userName;
	private EditText view_password;
	private CheckBox view_rememberMe;
	private Button view_loginSubmit;
	private Button view_loginRegister;
	private static final int MENU_EXIT = Menu.FIRST - 1;
	private static final int MENU_ABOUT = Menu.FIRST;
	private final String SHARE_LOGIN_TAG = "MAP_SHARE_LOGIN_TAG";

	private String SHARE_LOGIN_USERNAME = "MAP_LOGIN_USERNAME";

	private String SHARE_LOGIN_PASSWORD = "MAP_LOGIN_PASSWORD";

	private boolean isNetError;

	private ProgressDialog proDialog;

	Handler loginHandler = new Handler() {
		public void handleMessage(Message msg) {
			isNetError = msg.getData().getBoolean("isNetError");
			if (proDialog != null) {
				proDialog.dismiss();
			}
			if (isNetError) {
				Toast.makeText(Login.this, "登陆失败:\n1.请检查您网络连接.\n2.请联系我们.!",
						Toast.LENGTH_SHORT).show();
			}
			else {
				Toast.makeText(Login.this, "登陆失败,请输入正确的用户名和密码!",
						Toast.LENGTH_SHORT).show();
				clearSharePassword();
			}
		}
	};

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.login);
		findViewsById();
		initView(false);
		setListener();
	}

	private void findViewsById() {
		view_userName = (EditText) findViewById(R.id.loginUserNameEdit);
		view_password = (EditText) findViewById(R.id.loginPasswordEdit);
		view_rememberMe = (CheckBox) findViewById(R.id.loginRememberMeCheckBox);
		view_loginSubmit = (Button) findViewById(R.id.loginSubmit);
		view_loginRegister = (Button) findViewById(R.id.loginRegister);
	}

	private void initView(boolean isRememberMe) {
		SharedPreferences share = getSharedPreferences(SHARE_LOGIN_TAG, 0);
		String userName = share.getString(SHARE_LOGIN_USERNAME, "");
		String password = share.getString(SHARE_LOGIN_PASSWORD, "");
		Log
				.d(this.toString(), "userName=" + userName + " password="
						+ password);
		if (!"".equals(userName)) {
			view_userName.setText(userName);
		}
		if (!"".equals(password)) {
			view_password.setText(password);
			view_rememberMe.setChecked(true);
		}
		if (view_password.getText().toString().length() > 0) {
		}
		share = null;
	}

	private boolean validateLocalLogin(String userName, String password,
			String validateUrl) {
		boolean loginState = false;
		HttpURLConnection conn = null;
		DataInputStream dis = null;
		try {
			URL url = new URL(validateUrl);
			conn = (HttpURLConnection) url.openConnection();
			conn.setConnectTimeout(5000);
			conn.setRequestMethod("GET");
			conn.connect();
			dis = new DataInputStream(conn.getInputStream());
			if (conn.getResponseCode() != HttpURLConnection.HTTP_OK) {
				Log.d(this.toString(),
						"getResponseCode() not HttpURLConnection.HTTP_OK");
				isNetError = true;
				return false;
			}
			int loginStateInt = dis.readInt();
			if (loginStateInt > 0) {
				loginState = true;
			}
		} catch (Exception e) {
			e.printStackTrace();
			isNetError = true;
			Log.d(this.toString(), e.getMessage() + "  127 line");
		} finally {
			if (conn != null) {
				conn.disconnect();
			}
		}
		if (loginState) {
			if (isRememberMe()) {
				saveSharePreferences(true, true);
			} else {
				saveSharePreferences(true, false);
			}
		} else {
			if (!isNetError) {
				clearSharePassword();
			}
		}
		if (!view_rememberMe.isChecked()) {
			clearSharePassword();
		}
		return loginState;
	}

	private void saveSharePreferences(boolean saveUserName, boolean savePassword) {
		SharedPreferences share = getSharedPreferences(SHARE_LOGIN_TAG, 0);
		if (saveUserName) {
			Log.d(this.toString(), "saveUserName="
					+ view_userName.getText().toString());
			share.edit().putString(SHARE_LOGIN_USERNAME,
					view_userName.getText().toString()).commit();
		}
		if (savePassword) {
			share.edit().putString(SHARE_LOGIN_PASSWORD,
					view_password.getText().toString()).commit();
		}
		share = null;
	}

	private boolean isRememberMe() {
		if (view_rememberMe.isChecked()) {
			return true;
		}
		return false;
	}

	private OnClickListener submitListener = new OnClickListener() {
		@Override
		public void onClick(View v) {
			proDialog = ProgressDialog.show(Login.this, "连接中..",
					"连接中..请稍后....", true, true);
			Thread loginThread = new Thread(new LoginFailureHandler());
			loginThread.start();
		}
	};

	private OnCheckedChangeListener rememberMeListener = new OnCheckedChangeListener() {

		@Override
		public void onCheckedChanged(CompoundButton buttonView,
				boolean isChecked) {
			if (view_rememberMe.isChecked()) {
				Toast.makeText(Login.this, "如果登录成功,以后账号和密码会自动输入!",
						Toast.LENGTH_SHORT).show();
			}
		}
	};

	private OnClickListener registerLstener = new OnClickListener() {
		@Override
		public void onClick(View v) {
			Intent intent = new Intent();
			intent.setClass(Login.this, Register.class);
			startActivity(intent);
		}
	};

	private void setListener() {
		view_loginSubmit.setOnClickListener(submitListener);
		view_loginRegister.setOnClickListener(registerLstener);
		view_rememberMe.setOnCheckedChangeListener(rememberMeListener);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		super.onCreateOptionsMenu(menu);
		menu.add(0, MENU_EXIT, 0, getResources().getText(R.string.MENU_EXIT));
		menu.add(0, MENU_ABOUT, 0, getResources().getText(R.string.MENU_ABOUT));
		return true;
	}

	@Override
	public boolean onMenuItemSelected(int featureId, MenuItem item) {
		super.onMenuItemSelected(featureId, item);
		switch (item.getItemId()) {
		case MENU_EXIT:
			finish();
			break;
		case MENU_ABOUT:
			alertAbout();
			break;
		}
		return true;
	}

	private void alertAbout() {
		new AlertDialog.Builder(Login.this).setTitle(R.string.MENU_ABOUT)
				.setMessage(R.string.aboutInfo).setPositiveButton(
						R.string.ok_label,
						new DialogInterface.OnClickListener() {
							public void onClick(
									DialogInterface dialoginterface, int i) {
							}
						}).show();
	}

	private void clearSharePassword() {
		SharedPreferences share = getSharedPreferences(SHARE_LOGIN_TAG, 0);
		share.edit().putString(SHARE_LOGIN_PASSWORD, "").commit();
		share = null;
	}

	class LoginFailureHandler implements Runnable {
		@Override
		public void run() {
			userName = view_userName.getText().toString();
			password = view_password.getText().toString();
			String validateURL="http://192.168.1.229:8080/android_server/LoginValidate?userName="
				+ userName + "&password=" + password;
			boolean loginState = validateLocalLogin(userName, password,
					validateURL);
			Log.d(this.toString(), "validateLogin");

			if (loginState) {
				Intent intent = new Intent();
				intent.setClass(Login.this, IndexPage.class);
				Bundle bundle = new Bundle();
				bundle.putString("MAP_USERNAME", userName);
				intent.putExtras(bundle);
				startActivity(intent);
				proDialog.dismiss();
			} else {
				Message message = new Message();
				Bundle bundle = new Bundle();
				bundle.putBoolean("isNetError", isNetError);
				message.setData(bundle);
				loginHandler.sendMessage(message);
			}
		}

	}
}

5.3.2数据库存取操作
省略

5.3.3流程对象的设计
省略

5.3.4应用程序与服务器之间的通讯
省略

5.3.5服务器端接收请求的设计
5.3.6应用程序线程的设计
省略

5.3.7应用程序后台Service的设计
省略

5.4添加应用程序的其它功能
5.4.1设计关于对话框

<?xml version="1.0" encoding="utf-8"?>
<resources>
	<string name="loginUserNameLabel">用户名</string>
	<string name="loginPasswordLabel">密码</string>

	<string name="loginSubmit">登陆</string>
	<string name="loginRegister">注册</string>

	<string name="loginTitle">登陆</string>
	<string name="loginRememberMe">记住我的账号和密码</string>
	<string name="MENU_EXIT">退出</string>
	<string name="MENU_ABOUT">关于</string>
	<string name="aboutInfo">
		制作人:张哲 \n邮    箱: cupsoda@gmail.com \n本应用为毕业设计测试应用!
	</string>
	<string name="ok_label">确认</string>
</resources>

5.5系统主要界面效果

第六章 系统测试
为了确保本应用能够正常运行,需要在发布之后做一次较全面的测试。现将具体操作及过程举例说明如下:
6.1测试举例
6.1.1测试程序登录页面
打开程序后,首先出现的是登录页面,如果没有提示说网络连接失败或者其他异常情况,证明登录界面成功
6.1.2测试程序主页面
登录成功后进入公告界面,点击跳过按钮,会进入主页面,主页面会显示系统的功能列表,包括流程管理、日程管理、邮件系统、通讯录、即时通讯、信息发布、统计报表。当点击某一个功能选项之后,这个界面就会切换到相应功能的界面,应用程序撤销功能列表页面并平滑过度到下一个页面,等待用户进行详细的操作。在操作过程中会有需要用户进行确认的动作,如果用户在操作过程中点击了后退按钮且有为保存的数据,则会跳出提示用户是否保存当前未完成的数据,如果用户点击了保存,则当用户下一次使用此功能时,应用程序会自动为用户填充上次的未填写完成的数据。
6.1.3测试程序退出页面
当用户结束某一项功能之后,则此项功能完成,系统会再次跳入功能列表的界面,用户可以继续点击其他的功能来继续使用本应用程序。
如果用户再次点击后退按钮,那么会提示用户是否退出本应用程序。点击确定则退出应用,否则继续停留在本界面。
经过以上各项的测试,证明本系统完全可以正常运行,至此测试成功!
6.2测试项目
由于实际开发过程中还是不可避免地会产生差错,应用中通常可能隐藏着错误和缺陷,不经周密测试的系统投入运行,将会造成难以想象的后果,因此系统测试是软件开发过程中为保证软件质量必须进行的工作。
从测试本身看,分为单元测试,组合测试,确认测试等。测试对象是随不同阶段而异的,最基本、最初的测试是单元测试,后面的组合测试、确认测试都是以被测过的模块作为测试对象的。
6.2.1单元测试
单元测试也称模块测试或程序测试,单元测试是对每个模块单独进行的,验证模块接口与设计说明书是否一致,对模块的所有主要处理路径进行测试且与预期的结构进行对照,还要对所有错误处理路径进行测试。对源码进行审查,对照设计说明书,表态地检查源程序是否符合功能的逻辑要求,是进行单元测试前的重要工作工。单元测试一般是由程序员完成,也称程序调试。
6.2.2组合测试
组合测试也称集成测试或子系统测试,通常采用自顶向下测试和自底向上测试两种测试方法。组合测试的对象是指已经通过单元测试的模块,不是对零散模块进行单个测试,而是用系统化的方法装配和测试软件系统,是一个严格的过程,必须认真地进行,其计划的产生和单元模块测试的完成日期要协调起来,这种测试应在系统目标机上进行,造成系统应用的环境条件,除了开发部分项目负责人参加以外,还应该有相应系统的用户参加,给评审员进行演示。
6.2.3确认测试
确认测试是对通过组合测试的软件进行的,这些软件已经存于系统目标设备的介质上,确认测试的目的是表明软件是可以工作的,并且符合“软件需求说明书”中规定的全部功能和性能要求。确认测试是按照这些要求定出的“确认测试计划”进行的。测试工作是由一个独立的组织进行,而且测试要从用户的角度出发。
6.2.4系统测试
系统测试是对整体性能的测试,主要解决各子系统之间的数据通信和数据共享问题以及检测系统是否达到用户的实际要求,系统测试的依据是系统分析报告。系统测试应在系统的整个范围内进行,这种测试不只对软件进行,而是对构成系统的硬、软件一起进行。系统测试与建构同时进行或略慢。系统测试需要确认从头到尾的功能正常才算完成,应当尽量避免系统测试延到项目末尾进行。
6.2.5用户验收测试
在系统测试完成后,进行用户的验收测试,它是用户在实际应用环境中所进行的真实数据测试。
6.3测试方法
一般来说,对程序测试有两种测试方法:如果已经知道了软件系统应具有的功能,可通过测试来对每个功能是否都能正常使用;如果知道程序的内部工作过程,可以通过测试来检测程序内部是否按照规格说明书的规定正常进行。前一种方法称为黑盒测试,后一种方法称为白盒子测试。黑盒测试又称为功能测试,白盒子测试又称为结构测试。
这次毕业设计并不是一个具有实际意义的大系统,所以没有完全按照上述的测试方法进行系统的测试,但经过一些简单的步骤的测试,证明本应用具有一定的稳定性。

第七章 总 结
首先,我选择了本课题是因为这是一个我没有接触过的领域,在我们的毕业设计可选题目中,多数是图书管理系统,酒店管理系统之类的课题,而这些多多少少在之前的校内实习和大作业中使用过,而对于OA系统的设计从来都没有接触过。而我又想能通过毕业设计增长更多的对软件技术的了解,抱着对OA系统设计的好奇心,所以选择了OA系统的设计作为我毕业论文的课题。
在设计过程中,我并没有采用J2EE或者ASP.NET等企业级WEB开发框架作为主要实现方式。在最近一些年来,随着iPhone手机、Android手机的兴起,人们对移动互联网的需求也越来越大,认识也越来越广泛,而近些年来的手机硬件的发展更是日新月异。而这些原因加在一起,就形成了一股企业级应用移动平台话的趋势。

在这股趋势中,iOS平台与Android平台上的开发则是中流砥柱般的推进力量。相对与iOS平台较高的开发门槛(只能使用Mac OS X平台作为研发操作系统,需要购买应用程序开发包的使用权限等),Android平台则更加大众化,较便宜的价格,较易配置的开发环境,这些都是我选择Android平台进行本应用开发的重要原因。
除了上面这些原因之外,作为Android平台主要的开发语言,Java这门语言也是我所掌握的编程语言,之前在大作业中,例如中间件课程的Java 远程方法调用 (RMC),还有JavaWeb编程课程中的J2EE项目设计,都使用过Java这门语言的一些方面。Java是一门应用广泛的语言,在不同的领域有不同的应用,
不论是服务器,客户端,WebApplet,还是分布式计算,都有他的身影。但是万变不离其宗,Java的基本语法和一些基本的数据结构是不会变的,再者像Android SDK 这种Google为开发者封装的开发包,都会有非常详细的文档来说明各个函数以及对象、模块的使用方法以及继承关系。综上,了解JavaSE的基本构造,再加上对Android开发者文档的仔细阅读,就拥有了Android开发的基础。

在之前的程序设计或者大作业中,大多时候都是设计一个程序的一个小模块,或者通过团队的合作来完成一个小项目的建立。但是作为毕业设计,是一个单人进行开发的过程,而代码量相对与以往的项目来讲有了很大的增长。而在开发的时候,如果面对问题,也是只能通过互联网和开发者文档来寻找答案,虽然对于学习速度来说,是一个比较慢的学习过程,但是参考文档来学习一门编程语言或者是技术无疑是最好的,也是最扎实的。

通过这次的设计,我对Android的设计有了更大的兴趣,我已经初步尝试了一些简单的开发,使用了一些Android基础的模块,例如Activity、Service、Provider、Broadcast Receiver、Content Provider,也对Java进行了部分的深入探索,例如使用了JNI(Java Native Interface)来加快程序的执行速度,用多线程来保证应用程序界面的流畅以及对用户操作的响应速度。

参考文献(References)
[1] 杜春华 《什么是OA系统》 价值中国 (http://www.chinavalue.net/Biz/Article/2009-3-2/162334.html)
[2] 童虎科技 《OA系统的发展方向》 (http://www.toohuu.com/release/article1317.htm)
[3] 陈立伟等. 精通Java手机应用与应用程序设计[M]. 北京:中国青年电子出版社,2005
[4] 米川英树. J2ME MIDP手机应用程序设计[M]. 北京:中国铁道出版社,2005
[5] Martin J. Wells(美). J2ME应用编程[M]. 北京:清华大学出版社,2005
[6] 李振鹏等. J2ME手机应用开发技术详解 [M]. 北京:清华大学出版社,2006
[7] 黄聪明. Java移动通信程序设计–J2ME MIDP[M]. 北京:清华大学出版社,2002
致 谢
省略

附件:源代码


5、资源下载

本项目源码及完整论文如下,有需要的朋友可以点击进行下载。如果链接失效可点击下方卡片扫码自助下载。

序号毕业设计全套资源(点击下载)
本项目源码基于Java+Android+Python的手机端办公自动化OA系统设计与实现(源码+文档)_Java__手机端办公自动化OA系统.zip

6、更多android毕业设计项目

精选android毕业设计8套——源码+论文完整资源

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

毕业设计方案专家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值