基于android实现航空订票系统
研究意义
通过在 Android 系统,进行航空订票系统的设计与实现,充分运用所学的数据库、Java 语言、数据结构、操作系统、设计模式等知识。了解一个较完整的 Android 项目的构建过程,同时,通过较大量的编码提高需求分析、数据库设计、框架搭建、代码设计、编码及制图的能力。
研究现状
随着时代的进步社会分工的不断细化,各个行业联系的不断密切,人们出行越来越多,出行的方式也是百花齐放,作为空中重要的交通工具,飞机航空系统也在不断地得到优化,其中重要的一项就是飞机航空订票系统,因此好的订票系统关系着人们的日常出行方便与否,设计并编制出符合人们需要的航空订票系统是一项繁重而艰巨的任务。订票系统在现实生活中应用很广泛,通过这个系统可以使订票、退票等变得简便。与传统的人工用纸、笔来记录办理订票、退票等相比,使用这个系统也会增加工作效率随着科学技术的不断发展,计算机科学日渐成熟,其强大功能已为人们所深刻认识,它己进入人类社会的各个领域并发挥着越来越重要的作用。采用计算机进行信息化管理已成为衡量各个国家科学化和现代化的重要标志,而交通方式的全面自动化、信息化则是其中重要的组成部分,在很大程度上影响着企业的经济效益和社会效益。因此,本文所研究的航空订票系统具有一定的使用价值和现实意义。随着科技与经济的发展,越来越多的人选择乘飞机,这跟我国的经济增长有很大关系,人们在追求快节奏的生活方式,所以做飞机无疑成了首选。而且随着网络的盛行,航空订票系统就显得尤为重要,这个系统主要是为了方便大家,让大家能够快速、清晰、准确地了解航班信息,而不至于像以前那样排队等候,从而避免耽搁乘客大量的等待时间。完成此系统,需要综合运用数据结构课程中学到的几种典型数据结构,以及程序设计语言(Java 语言),自行实现一个较为完整的应用系统的设计与开发。通过课程设计,自己通过系统分析、系统设计、编程调试,写实验报告等环节,进一步掌握应用系统设计的方法和步骤,灵活运用并深刻理解典型数据结构在软件开发中的应用。学会将知识应用于实际的方法,提高分析和解决问题的能力,增加综合能力。
Android 是一种基于的自由及开放源代码的,主要使用于,如和,由公司和领导及开发。
Android 是运行于 Linux kernel 之上,但并不是/Linux。因为在一般 GNU/Linux 里支持的功能,Android 大都没有支持,包括、、、、、及等都被移除掉了。Android 又以 Bionic 取代 Glibc、以 Skia 取代 Cairo、再以取代等等。Android 为了达到商业应用,必须移除被 GNU GPL 授权证所约束的部份,例如 Android 将驱动程序移到 Userspace,使得 Linux driver 与 Linux kernel 彻底分开。Bionic/Libc/Kernel/ 并非标准的 Kernel header files。Android 的 Kernel header 是利用工具由 Linux Kernel header 所产生的,这样做是为了保留常数、数据结构与宏。
工作内容
课程设计中,将会接触到以下几种工作:
- 需求分析。针对课程项目命题和要求分析其主要和次要功能点。
- 学习调研。由于之前并没用经历过一个完整的 Android 项目的构建,因此学习和调研相关技术是十分必要的。
- 代码设计。杂乱无章的代码会导致程序效率低下、错误百出;而组织严密、结构清晰的代码及设计模式有助于我们理清思路,减少错误。
- 代码编码。这一项直接与编程语言和系统调用相关,想要在这方面有所建树,则必须通过大量的练习来实现。
- 相关技术基础
- AndroidStudio 的基本使用。这一部分主要包括:AndroidStudio 的基本功能,Gradle 构建项目方法,将项目代码托管到 Git 上
- 编译环境搭建及使用。这一部分主要包括:JDK 的安装及配置环境变量,sdk 的下载与安装,代码版本控制工具 Git 命令的配置和使用
- Java 编程。这一部分主要包括:项目框架的基本搭建思路,设计模式的合理运用,变量及方法的设计,各类常见的语法错误,异常处理的合理使用
- XML 界面编程。这一部分主要包括:app 所有界面的注册及设计,图片(icon、logo)、颜色、字符串、数组、等资源的部署,drawable\value\layout 等文件目录的构建
- 本章小结
要实现本次课程设计,首先必要的知识储备是必不可少的。在拥有足够的知识储备后,对编程环境的熟悉,编程工具的熟练使用都有助于我们写出高质量的程序。我在本次课程设计中用到的工具一共有如下几种:
-
- jvm Java 虚拟机
- sdk Android 开发工具
- Android Studio Android 开发目前来讲最好用的 IDE
- gradle Android 项目的构建工具,可以方便的添加第三方依赖
- Git 非常优秀的开源代码版本控制工具,并在云端提供远程代码库
系统需求分析
功能需求
- 实现 Android 客户端,有普通客户和管理员两种身份,普通客户可根据出发地、目的地以及出行日期查询航班相关信息,通过填写姓名、身份证号、航班号以及出行日期来订票,可通过客户姓名、身份证号、出行日期来查询已订机票信息,并选择是否退票。管理员可以检视所有航班及客户信息,并对数据进行增删改查。
- 在浏览器中,可通过登陆 Bmob 云后台来对数据库中数据直接进行操作。
性能需求
尽可能的将代码模块化,封装好完备的功能方法并将它们按功能的不同分别加入不同的类中,以此减少冗余代码命题高性能;通过 Bmob 后端云服务构建数据库,调用先关 API 对数据库进行操作。
本章小结
课程设计中,产出结果应为一个 apk 文件作为客户端安装包,后端数据库可直接通过浏览器进入 Bmob 后端云来操作。
系统设计和实现
总体设计
分包:
Activity
Adapter
Base
Bean
Fragment
Net
Utils
Widget
App
Activity:
MainActivity
AboutActivity
AdminActivity
BoardingActivity
EditClientActivity
EditFlightActivity
GuideActivity
LoginActivity
PlaceListActivity
PriceActivity
Adapter:
AdminClientAdapter
AdminFlightAdapter
DynamicAdapter
Fragment:
AdminClientFragment
AdminFlightFragment
BookFragment
DynamicFragment
MainFragment
QueryFragment
Base:
BaseActivity
BaseFragment
BaseFragment
Bean:
Client
Flight
Utils:
DividerItemDecoration
Widget:
InputDialog
数据库设计

详细设计和实现
增加客户信息
private void addClient(String name, String idCard, String flightNo,String data) {
Client client = new Client();
client.setName(name);
client.setIdCard(idCard);
client.setFlightNo(flightNo);
client.setData(data);
client.save(new SaveListener<String>() {
@Override
public void done(String s, BmobException e) {
if (e==null) {
isBooked = true;
} else {
Toa("网络繁忙,请稍后再试");
Log.e("Bmob","save error:"+e.getMessage());
}
}
});
}
更新航班票量
BmobQuery<Flight> query = new BmobQuery();
query.addWhereEqualTo("flightNo", flightNo);
query.findObjects(new FindListener<Flight>() {
@Override
public void done(List<Flight> list, BmobException e) {
if (e == null) {
String id = list.get(0).getObjectId();
int booked = list.get(0).getBookedTickets();
int surplus = list.get(0).getSurplusTickets();
Flight flight = list.get(0);
flight.setBookedTickets( booked + 1);
flight.setSurplusTickets( surplus - 1);
flight.update(id, new UpdateListener() {
@Override
public void done(BmobException e) {
if (e == null) {
isUpdated = true;
startActivity(new Intent(getActivity(), MainActivity.class));
getActivity().finish();
} else {
Toa("网络繁忙,请稍后再试");
Log.e("Bmob", "update error:" + e.getMessage());
}
}
});
} else {
Toa("网络繁忙,请稍后再试");
Log.e("Bmob", "change error:" + e.getMessage());
}
}
});
查询航班信息
BmobQuery<Flight> query = new BmobQuery<>();
query.addWhereEqualTo("originPlace", origin);
query.addWhereEqualTo("destinationPlace", destination);
query.addWhereEqualTo("data", day);
query.findObjects(new FindListener<Flight>() {
@Override
public void done(List<Flight> list, BmobException e) {
loading.setVisibility(View.GONE);
if (e == null) {
if (list.size() > 0) {
adapter.replaceData(list);
} else {
Toa("暂无航班");
}
} else {
Toa("网络繁忙,请稍后再试");
Log.e("Bmob", "error:" + e.getMessage());
}
}
});
删除客户信息
Client c = new Client();
setObjectId(client.getObjectId());
delete(new UpdateListener() {
@Override
public void done(BmobException e) {
if (e == null) {
Toast.makeText(mContext,"删除成功!",Toast.LENGTH_SHORT).show();
} else {
Log.e("Bmob","delete error:"+e.getMessage());
}
}
});
删除航班信息
Flight f = new Flight();
setObjectId(flight.getObjectId());
delete(new UpdateListener() {
@Override
public void done(BmobException e) {
if (e==null) {
Toast.makeText(mContext,"删除成功!",Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(mContext,"网络繁忙,请稍后再试",Toast.LENGTH_SHORT).show();
Log.e("Bmob","delete error:"+e.getMessage());
}
}
});
新增及修改航班信息
private void commitFlight(String mOrigin, String mDestination, String mDate, String mStart, String mEnd,
String mFlight, String mType, int mPrice, int mBooked, int mSurplus) {
commit.setText("请等待");
commit.setEnabled(false);
Flight flight = new Flight();
flight.setOriginPlace(mOrigin);
flight.setDestinationPlace(mDestination);
flight.setData(mDate);
flight.setStartTime(mStart);
flight.setEndTime(mEnd);
flight.setFlightNo(mFlight);
flight.setFlightType(mType);
flight.setPrice(mPrice);
flight.setBookedTickets(mBooked);
flight.setSurplusTickets(mSurplus);
if (isNew) {
createFlight(flight);
} else {
updateFlight(flight);
}
}
private void updateFlight(Flight flight) {
flight.update(objectId, new UpdateListener() {
@Override
public void done(BmobException e) {
if (e==null) {
finish();
} else {
Toa("网络繁忙,请稍后再试");
commit.setText("提交");
commit.setEnabled(true);
Log.e("Bmob","save error:"+e.getMessage());
}
}
});
}
private void createFlight(Flight flight) {
flight.save(new SaveListener<String>() {
@Override
public void done(String s, BmobException e) {
if (e==null) {
finish();
} else {
Toa("网络繁忙,请稍后再试");
commit.setText("提交");
commit.setEnabled(true);
Log.e("Bmob","save error:"+e.getMessage());
}
}
});
}
日期选择器
pickerPopWin = new DatePickerPopWin.Builder(getContext(), new DatePickerPopWin.OnDatePickedListener() {
@Override
public void onDatePickCompleted(int year, int month, int day, String dateDesc) {
data.setText(year+"-"+month+"-"+day);
}
})
.textConfirm("选择")
.textCancel("取消")
.btnTextSize(16)
.viewTextSize(25)
.colorCancel(Color.parseColor("#999999"))
.colorConfirm(Color.parseColor("#7C4DEF"))
.minYear(1970)
.maxYear(2020)
.dateChose("2016-07-02")
.build();
城市选择列表
private void startCityList(int code) {
Intent intent = new Intent(getActivity(),PlaceListActivity.class);
intent.putExtra("type",code);
startActivityForResult(intent,code);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode==REQUEST_ORIGIN) {
originPlace.setText(data.getStringExtra("place"));
} else {
destinationPlace.setText(data.getStringExtra("place"));
}
}
gradle app
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "23.0.3"
useLibrary 'org.apache.http.legacy'
defaultConfig {
applicationId "com.levent_j.airlinebooksystem"
minSdkVersion 14
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.3.0'
compile 'com.jakewharton:butterknife:7.0.1'
compile 'com.android.support:design:23.3.0'
compile 'com.android.support:cardview-v7:23.2.0'
compile 'com.android.support:recyclerview-v7:23.2.0'
compile 'cn.bmob.android:bmob-sdk:3.5.0'
compile 'cn.bmob.android:bmob-push:0.8'
compile 'com.brucetoo.pickview:library:1.1.1'
compile 'com.wang.avi:library:1.0.5'
compile 'com.nineoldandroids:library:2.4.0'
compile 'com.squareup.picasso:picasso:2.5.2'
}
gradle project
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.3.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
maven { url "https://raw.github.com/bmob/bmob-android-sdk/master" }
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
本章小结
在所有代码中,最重要的莫过于 Activity 和 Fragment 中的代码。主要包含了界面管理与控制,云数据获取,网络交互等功能。整个项目由 gradle 构建,结构清晰明了。
系统测试
测试环境
- 小米 3C
- 系统:Android 6.0
测试用例和结果




















本章小结
以上就是测试数据及其截图
总结
在本次课程设计中,我充分利用了 androidstudio+linux 终端 +gradle+git 这一组工具,极大地提升了编程效率。AndroidStudio 下进行编程,代码提示、目录结构等非常束缚,让我的精力可以集中于解决眼前的问题。在界面设计中,采用了 Google 官方推荐的 Material Design 设计风格以及 Material Design 颜色,控件方面,用了 RecyclerView 作为列表显示,FloatingActionButton 作为图特殊按钮,NavigationDrawerLayout 作为策划菜单,同时单个 Activity 配合多个 Fragment 一起使用,极大的减少了冗余工作量的同时,使代码结构清晰而完整。后台数据库采用了 Bmob 云端数据库,免去了自己搭建后台服务器写 API 的繁琐以及购买服务器的花费,能更高效而便捷的操作数据,同时 Bmob 后端云在硬件和软件层面都为大家建立了安全机制。增加了数据安全隔离,分布式存储架构,多租户虚拟化技术,密钥匹配,访问权限控制等功能,进一步保障了数据的安全,降低风险。最后关于 gradle,Gradle 是一个基于 Apache Ant 和 Apache Maven 概念的项目自动化建构工具。它使用一种基于 Groovy 的特定领域语言(DSL)来声明项目设置,抛弃了基于 XML 的各种繁琐配置。gradle 对多工程的构建支持很出色,工程依赖是 gradle 的第一公民。 gradle 支持局部构建。支持多方式依赖管理:包括从远程仓库、私服、ivy 仓库以及本地文件系统的 jars 或者 dirs 轻松迁移:gradle 适用于任何结构的工程(Gradle can adapt to any structure you have.)gradle 的整体设计是以作为一种语言为导向的,而非成为一个严格死板的框架。免费开源。
更多推荐
所有评论(0)