课程设计报告

Posted congxue

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了课程设计报告相关的知识,希望对你有一定的参考价值。

 

 

 

android应用程序开发

课程设计报告

2019—2020学年 第Ⅰ学期)

基于Android的宠物领养系统

 

 

 

               信息与控制工程           

              计算机科学与技术          

                   1701                 

                                   

指导教师                                

 

 

 

 

 

 

目录

一、 摘要1

二、 需求分析1

(一) 需求分析 1

(二) UML需求用例图及用例分析说明 2

三、 系统设计3

(一) 系统总体设计 3

(二)系统数据库设计 3

系统详细设计 4

各模块功能 4

UML设计 5

、系统测试5

(一)测试登录界面 5

(二)测试页面 6

五、系统实现8

(一)系统实现目标 8

(二)界面布局 9

课设总结31

附件 32

 

 

一、摘要

宠物领养APP是一款针对宠物爱好者专门开发的宠物领养软件平台。将资深萌宠爱好者集结在宠物领养平台,一直专注于宠物领养服务,解决宠物领养,宠物送养,寻找主人等问题。针对于流浪动物,我们应该付出行动,用我们的爱心给予小动物们家的温暖。真正的做到公益事业,这也是一种 很好的方式。宠物领养让每一个宠物爱好者可以在手机上随时随地找到自己需要的关于宠物的信息,让你在快乐中养宠爱宠。

本文主要介绍了基于Android的宠物领养助养系统,该系统凭借Android服务器和客户的手机端,利用网络高效率、低成本、及时更新的特点,为爱心人士提供交易平台,为流浪动物提供一次新生的机会。主要使用技术:Android开发环境,SQLite数据库。

二、需求分析

(一)需求分析

为了解决流浪动物泛滥问题,各省市先后出现了公有或私有的动物救助站,但是因为区域限定、资金短缺、宣传困难等问题,流浪动物的领养、助养发展缓慢。但是随着Internet技术的发展,尤其是电子商务的快速普及,为动物的领养、助养的普及与快速发展提供了良好的条件。虽然网络上已有一些相关的救助网站,但因信息更新不及时、地域限制、人力物力资源匮乏等问题造成有领养意向和条件的爱心人士的不能或者推迟领养;救助站内部又存在动物泛滥、资金紧缺的情况;不能形成一个良性循环。因此开发个在线的宠物领养助养系统就成了当务之急。

针对流浪宠物,设计基于Android的宠物领养系统,本系统主要功能有:用户登录、宠物信息查看,领养宠物,信息录入、等功能。对于领养人领养动物的信息及个人信息进行录入,保证宠物安全同时方便管理者和领养人之间的交流联系。

本系统的安装非常简单且容易掌握,客户机无需使用电脑,通过手机安装即可使用,对于手机的配置要求不是很高,因此在操作上是可行的。

(二)UML需求用例图及用例分析说明

用例分析说明

登录:登录页面用户输入账号和密码进行登录

添加信息:在我要领养页面,用户需要添加自己的姓名、身份证号微信、电话信息,这些数据会被存储到数据库中

查询信息:在我要领养页面,用户可以查询自己的姓名、身份证号、微信、电话信息,这些数据会从数据库中调取出来

修改信息:在我要领养页面,用户可以修改自己的姓名、身份证号、微信、电话信息,这些数据会覆盖原数据库中的信息,达到修改目的

删除信息:在我要领养页面,用户可以删除自己的姓名、身份证号、微信、电话信息,这些数据会从数据库中删除

领养宠物:用户可以查看宠物详情

 

三、系统设计

(一)系统总体设计

 

(二)系统数据库设计

名称

数据类型

长度

约束

说明

_id

INTEGER

0

PRIMARY KEY AUTOINCREMENT

编号

name

VARCHAR

20

 

姓名

people

VARCHAR

20

 

身份证号

wechat

VARCHAR

20

 

微信号

number

VARCHAR

20

 

手机号

 

_id

name

people

wechat

number

1

丛雪

123456

cx123

15147845690

2

郭佳美

155687

129083

15945887623

3

荣瑞瑞

563456

xt765890

15078943567

(三)系统详细设计
1.登录界面

编号

输入

处理

输出

1

账号和密码

与设定值相等

登陆成功进入首页

2

账号和密码

与设定值不等

登陆失败

2.我要领养界面

编号

输入

处理

输出

1

姓名、身份证号、身份证号、电话信息

将数据存入数据库

显示添加成功

2

点击查询

将数据库信息调取出来

显示信息

3

点击修改

输入修改内容,将修改后的内容存入数据库

显示已修改

4

点击删除

将数据从数据库中删除

显示删除成功

3.宠物分类界面

编号

输入

处理

输出

1

点击“狗”按钮

跳转到详情页面

显示详情页面

2

点击“猫”按钮

跳转到详情页面

显示详情页面

3

点击“兔子”按钮

跳转到详情页面

显示详情页面

 

(四)各模块功能

登录模块:登录页面上会显示账户和密码,使用EditText组件,让用户输入账户和密码,使用onCreat方法,实现页面跳转,设置原始密码后,如果用户输入的密码和账户与其相同,则触发跳转动作,若不同,则显示“登陆失败”

首页模块:首页主要由三部分组成,用户可通过领养品种模块快速选择想要领养的宠物;也可以在了解更多模块中查询更多的有关宠物领养的知识;最后是底部导航栏,这一部分是实现点击图片跳转到对应的页面的功能

宠物领养模块:使用了SQLite数据库,实现了用户信息的添加、查询、修改、删除的功能,同时查询显示用户信息时调适配器实现了Listview

宠物分类模块:实现了Activity之间的跳转,显示了宠物的种类,方便领养者了解宠物类型和信息

查看宠物详情模块:使用了listview,显示宠物的详细信息

(五)UML设计
1.UML时序图

 

2.系统类图
 
   

四、系统测试

本次课程设计所用的开发环境为:eclipse

开发技术:Android

数据库:SQLite数据库

(一)测试登录页面

点击登录,显示登陆成功或登陆失败

 

(二)测试主界面
1. 添加测试

添加信息后显示“添加成功”

 

2. 删除测试

删除信息后显示“信息已删除”

 

3. 修改测试

根据输入姓名查找,删除信息,显示“已删除”

 

五、系统实现

(一)系统实现目标

对于流浪的小动物,在很多地方是有宠物领养所的,但是在二三线城市大多是少见的,那么要领养一只小动物就很困难了。本软件安装便捷,使用简单,正好可以解决这一问题,给流浪动物一个温暖的家。本系统是基于Android系统的宠物领养系统,主要实现的用户领养宠物,了解宠物和信息的增加、查询、删除、修改,页面跳转的功能。

(二)界面布局

AndroidManifest.xml

<?xml version="1.0"encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.cong"
android:versionCode="1"
android:versionName="1.0">

<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="21"/>

<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:label="@string/app_name">

<!--            设置MainActivity为主页面,优先显示-->
<intent-filter>
<action android:name="android.intent.action.MAIN"/>

<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity android:name=".MainActivity2">
</activity>
<activity android:name=".MainActivity3">
</activity>
<activity android:name=".MainActivity4">
</activity>
<activity android:name=".MainActivity5">
</activity>
<activity android:name=".MainActivity6">
</activity>
<activity android:name=".MainActivity7">
</activity>
</application>

</manifest>

 

1.登录页面

 

代码:

//相对布局

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingBottom="@dimen/activity_vertical_margin">
//使用组件InageView插入图片

<ImageView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:background="@drawable/face"/>
//线性布局
<LinearLayout
android:id="@+id/linearLayout1"
android:layout_width="300dp"
android:layout_height="50dp"
android:layout_marginLeft="90dp"
android:layout_marginTop="330dp"
android:background="#ffffff"
android:orientation="horizontal">
//使用组件TextView输入文字

//实现账户输入框

<TextView
android:id="@+id/tv1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="账号:"
android:textSize="25sp"/>

<EditText
android:id="@+id/et1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#ffffff"/>
</LinearLayout>

<LinearLayout
android:id="@+id/linearLayout2"
android:layout_width="300dp"
android:layout_height="50dp"
android:layout_marginLeft="90dp"
android:layout_marginTop="400dp"
android:background="#ffffff"
android:orientation="horizontal">
//实现密码输入框
<TextView
android:id="@+id/tv2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="密码:"
android:textSize="25sp"/>

<EditText
android:id="@+id/et2"
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="#ffffff"
android:password="true"/>
</LinearLayout>
//实现登录按钮,跳转页面
<Button
android:id="@+id/button"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="156dp"
android:onClick="onclick"
android:text="登录"
android:background="#FFD700"/>

</RelativeLayout>

2.首页

 

代码:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/lingyang"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin">

<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="290dp">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="领养品种"
android:textColor="#ffd306"
android:textSize="20sp"/>
</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp">

<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"/设置垂直排列
android:layout_weight="1"//权重占一份

android:layout_marginLeft="20dp">

<ImageView
android:id="@+id/tv1"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"//设置居中位置
android:background="@drawable/pat"/>

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="猫"
android:textSize="20sp"/>
</LinearLayout>

<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_weight="1"
android:layout_marginRight="20dp">

<ImageView
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:background="@drawable/pat"/>

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="兔子"
android:textSize="20sp"/>
</LinearLayout>

<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">

<ImageView
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:background="@drawable/pat"/>

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="狗"
android:textSize="20sp"/>
</LinearLayout>
</LinearLayout>

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:text="了解更多"
android:textColor="#ffd306"
android:textSize="20sp"/>

<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:orientation="vertical">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="什么样的狗粮适合什么品种的狗狗"
android:textSize="15sp"//设置文字大小

/>

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="多久该给爱宠打疫苗"
android:textSize="15sp"/>
</LinearLayout>

<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="200dp"
android:orientation="horizontal">

<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
android:layout_marginLeft="10dp">
//设置按钮bt_first为首页按钮
<Button
android:id="@+id/bt_first"
android:layout_width="45dp"
android:layout_height="45dp"
android:background="@drawable/tubiao1"/>

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="首页"
android:textSize="15sp"/>
</LinearLayout>

<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
android:layout_marginLeft="105dp">
/设置按钮bt_second为领养中心按钮
<Button
android:id="@+id/bt_second"
android:layout_width="45dp"
android:layout_height="45dp"
android:background="@drawable/tubiao1"/>

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="领养中心"
android:textSize="15sp"/>
</LinearLayout>

<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
android:layout_marginLeft="100dp">
/设置按钮bt_third为领养宠物分类
<Button
android:id="@+id/bt_third"
android:layout_width="45dp"
android:layout_height="45dp"
android:background="@drawable/tubiao1"/>

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="宠物分类"
android:textSize="15sp"/>
</LinearLayout>
</LinearLayout>

</LinearLayout>

3.我要领养

 

代码:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/lingyang"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin">

<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="20dp"
android:orientation="horizontal">

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="宠物领养"
android:textSize="25sp"/>
</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:orientation="horizontal">
//设置姓名输入框
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_weight="2"
android:text="姓      名:"
android:textSize="20sp"/>

<EditText
android:id="@+id/et_name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="4"
android:hint="请输入您的姓名"/>
</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:orientation="horizontal">
//设置身份证输入框
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_weight="2"
android:text="身份证:"
android:textSize="20sp"/>

<EditText
android:id="@+id/et_people"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="4"
android:hint="请输入身份证号码"/>
</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:orientation="horizontal">
//设置微信输入框
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_weight="2"
android:text="微信:"
android:textSize="20sp"/>

<EditText
android:id="@+id/et_weichat"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="4"
android:hint="请输入微信号"/>
</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:orientation="horizontal">
//设置电话输入框
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_weight="2"
android:text="电话:"
android:textSize="20sp"/>

<EditText
android:id="@+id/et_number"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="4"
android:hint="请输入电话号码"/>
</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
//设置添加输入框
<Button
android:id="@+id/btn_add"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginRight="2dp"
android:layout_weight="1"
android:background="#FFFACD"
android:text="添加"
android:textSize="18sp"/>
//设置查询输入框
<Button
android:id="@+id/btn_query"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginRight="2dp"
android:layout_weight="1"
android:background="#FFFACD"
android:text="查询"
android:textSize="18sp"/>
//设置修改输入框
<Button
android:id="@+id/btn_update"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginRight="2dp"
android:layout_weight="1"
android:background="#FFFACD"
android:text="修改"
android:textSize="18sp"/>
//设置删除输入框
<Button
android:id="@+id/btn_delete"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="#FFFACD"
android:text="删除"
android:textSize="18sp"/>
</LinearLayout>

<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
//设置需要删除人的姓名
<EditText
android:id="@+id/et_input"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="请输入需要删除人的姓名"
android:layout_marginTop="20dp"/>
</LinearLayout>

<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_marginTop="20dp">

<ListView
android:id="@+id/listView"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</ListView>
</LinearLayout>

</LinearLayout>

 

4.宠物种类

 

代码:

<?xml version="1.0"encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/lingyang"
android:orientation="vertical">

<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="330dp"
android:orientation="horizontal">

<ImageView
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_marginLeft="90dp"
android:background="@drawable/cat1"/>
//设置猫的种类

<Button
android:id="@+id/bt_dog"
android:layout_width="230dp"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:background="#FFFACD"
android:text="查看猫的种类"/>
</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:orientation="horizontal">

<ImageView
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_marginLeft="90dp"
android:background="@drawable/dog1"/>
//设置狗输入框
<Button
android:id="@+id/bt_cat"
android:layout_width="230dp"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:background="#FFFACD"
android:text="查看狗的种类"/>
</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:orientation="horizontal">

<ImageView
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_marginLeft="90dp"
android:background="@drawable/rabbit1"/>
//设置兔子输入框
<Button
android:id="@+id/bt_rabbit"
android:layout_width="230dp"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:background="#FFFACD"
android:text="查看兔子的种类"/>
</LinearLayout>

</LinearLayout>

 

5.详情页面——

 

代码:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
>

//设置listview
<ListView
android:id="@+id/listView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
>
</ListView>

</RelativeLayout>

6.详情页面——

 

代码:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
>
<ListView
android:id="@+id/listView2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
>
</ListView>

</RelativeLayout>

7.详情页面——兔子

 

代码:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
>
<ListView
android:id="@+id/listView3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
>
</ListView>

</RelativeLayout>

 

list_item1.xml

<?xml version="1.0"encoding="utf-8"?>

//设置狗的listview的样式
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp">
<ImageView
android:id="@+id/iv"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_alignParentLeft="true"
/>
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:layout_toRightOf="@+id/iv"
android:layout_centerVertical="true"
>
<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
android:textColor="#000"

/>

</RelativeLayout>
</RelativeLayout>

 

list_item2.xml

<?xml version="1.0"encoding="utf-8"?>

//设置猫的listview的样式
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp">
<ImageView
android:id="@+id/iv2"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_alignParentLeft="true"
/>
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:layout_toRightOf="@+id/iv2"
android:layout_centerVertical="true"
>
<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
android:textColor="#000"

/>

</RelativeLayout>
</RelativeLayout>

list_item3.xml

<?xml version="1.0"encoding="utf-8"?>

//设置兔子的listview的样式
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp">
<ImageView
android:id="@+id/iv3"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_alignParentLeft="true"
/>
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:layout_toRightOf="@+id/iv3"
android:layout_centerVertical="true"
>
<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
android:textColor="#000"

/>

</RelativeLayout>
</RelativeLayout>

list_item.xml

<?xml version="1.0"encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="10dp">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="15sp"/>

<TextView
android:id="@+id/tv_people"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="15sp"/>

</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">

<TextView
android:id="@+id/tv_number"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="15sp"/>

<TextView
android:id="@+id/tv_wechat"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="15sp"/>

</LinearLayout>


</LinearLayout>

 

List_cat.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.homework6.MainActivity">

//设置猫的listview
<ListView
android:id="@+id/iv_cat"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
>
</ListView>

</RelativeLayout>

六、课设总结

这次课程设计做的时间比较久,从总也学习了很多东西,同时也遇到了很多困难。实现页面的基本功能的时候,使用了很多书本上的知识和语句,对书本的掌握也有了进一步的了解。一开始我先设计的是页面,页面的背景图片使我用ps做的,我觉得这样可以更清楚的表达我先要传达的信息,也更契合我软件的初衷,效果会更好。页面布局我使用了线性布局和相对布局,根据不同页面的不同需求,有针对性的设计页面。页面完成后,我开始实现页面的跳转,期初页面与页面的跳转还有些生疏,然后我请教了同学,并查找资料、翻阅书籍,使用OnCreateLinster方法,Click、Intent方法实现页面跳转。实现页面的跳转之后,我加入了listview,因为这一部分比较难,对弈适配器这里问题比较大,所以在这里耗时很久,在同学的帮助下,这一功能也实现了。最后我加入了数据库sqlite,链接数据库以后,对软件开始进行测试,在测试的工程中发现问题,无论是软件本身程序的问题,还是界面位置和不美观的问题,通过自己的努力,一次又一次的修改,都得以解决。

Android课程设计的整个过程,让我感到自己对于编程这一方面还是有很多的不足,需要弥补和改进的地方还是很多的。想要成为一名真正的码农,还需要很长一段时间的学习。

附件:

一、课设题目

基于Android的宠物领养系统

、技术说明

1.Activity之间的跳转

实现页面跳转

2. Sqlite数据库

实现数据的添加,查询,修改,删除功能

3.控件的使用

Textview 、Button、Edittext、ImageView 等

4.Listview的使用

两个适配器的调试

5.事件的监听

OnClickListener()方法实现监听

6.页面布局

使用线性布局(LinearLayout)、相对布局(RelativeLayout)

7.OnClickliskListener接口

用来相应button按钮的操作

三、UML类图

 

四、代码

清单文件:

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

    package="com.example.cong"

    android:versionCode="1"

    android:versionName="1.0" >

 

    <uses-sdk

        android:minSdkVersion="8"

        android:targetSdkVersion="21" />

 

    <application

        android:allowBackup="true"

        android:icon="@drawable/ic_launcher"

        android:label="@string/app_name"

        android:theme="@style/AppTheme" >

        <activity

            android:name=".MainActivity"

            android:label="@string/app_name" >

            //设置优先显示页面

            <intent-filter>

                <action android:name="android.intent.action.MAIN" />

 

                <category android:name="android.intent.category.LAUNCHER" />

            </intent-filter>

        </activity>

        <activity android:name=".MainActivity2" >

        </activity>

        <activity android:name=".MainActivity3" >

        </activity>

        <activity android:name=".MainActivity4" >

        </activity>

        <activity android:name=".MainActivity5" >

        </activity>

        <activity android:name=".MainActivity6" >

        </activity>

        <activity android:name=".MainActivity7" >

        </activity>

    </application>

 

</manifest>

布局文件:

  1. 布局文件

 

2.Java文件

 

Java原码

Adapter.java

//设置listview

package com.example.cong;

import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import java.util.List;

public class Adapter extends BaseAdapter {
private List<Bean>list;
private LayoutInflater layoutInflater;

public Adapter(Context context, List<Bean> list) {
this.layoutInflater = LayoutInflater.from(context);
this.list = list;
    }

@Override
public int getCount() {
return list.size();
    }

@Override
public Object getItem(int position) {
return null;
    }

@Override
public long getItemId(int position) {
return 0;
    }

@Override

//  适配器的使用
public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder;
if (convertView == null) {
            convertView = layoutInflater.inflate(R.layout.list_ltem, null);
            viewHolder = new ViewHolder(convertView);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        Bean Bean = list.get(position);
        viewHolder.tv_name.setText("姓名:"+ Bean.getName());
        viewHolder.tv_wechat.setText("手机号:"+ Bean.getWechat());
        viewHolder.tv_number.setText("身份证号:"+ Bean.getNumber());
        viewHolder.tv_people.setText("微信:"+ Bean.getPeople());
return convertView;
    }

class ViewHolder {
        TextView tv_name;
        TextView tv_people;
        TextView tv_number;
        TextView tv_wechat;

public ViewHolder(View view) {
tv_name = (TextView) view.findViewById(R.id.tv_name);
tv_number = (TextView) view.findViewById(R.id.tv_number);
tv_people = (TextView) view.findViewById(R.id.tv_people);
tv_wechat = (TextView) view.findViewById(R.id.tv_wechat);

        }
    }

}

 

Bean.java

package com.example.cong;
public class Bean {
private String name;
private String people;
private String number;
private String wechat;

public String getWechat() {
return wechat;
   }

public void setWechat(String wechat) {
this.wechat = wechat;
   }

public String getName() {
return name;
    }

public void setName(String name) {
this.name = name;
    }

public String getPeople() {
return people;
   }

public void setPeople(String people) {
this.people = people;
   }

public String getNumber() {
return number;
    }

public void setNumber(String number) {
this.number = number;
    }

 

MainActivity.java

package com.example.cong;

import android.support.v7.app.ActionBarActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
//继承
public class MainActivity extends ActionBarActivity {
private EditText et1;
private EditText et2;
private Button bt;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
bt=(Button)findViewById(R.id.button);
et1=(EditText)findViewById(R.id.et1);
et2=(EditText)findViewById(R.id.et2);
    }

//设置输入原始密码和账号
public void onclick(View v) {
        String ID="123456";
        String PassWord="123123";
        String s1=et1.getText().toString();
        String s2=et2.getText().toString();
if (ID.equals(s1)&&PassWord.equals(s2)) {
            Toast.makeText(MainActivity.this, "登录成功", 1).show();
            Intent intent=new Intent(MainActivity.this,MainActivity2.class);
            intent.putExtra("zh",s1);
            intent.putExtra("mm",s2);
            startActivity(intent);
        }
else {
            Toast.makeText(MainActivity.this, "登录失败", 1).show();
        }

    }
}

MainActivity2.java

package com.example.cong;

import android.support.v7.app.ActionBarActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity2 extends ActionBarActivity implements OnClickListener {

//  底部导航三个按钮命名
   Button bt_first;
   Button bt_second;
   Button bt_third;

   @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main2);
      bt_first=(Button) findViewById(R.id.bt_first);
      bt_second=(Button) findViewById(R.id.bt_second);
      bt_third=(Button) findViewById(R.id.bt_third);
      bt_first.setOnClickListener(this);
      bt_second.setOnClickListener(this);
      bt_third.setOnClickListener(this);
   }
//  实现底部导航跳转
   @Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.bt_second:
         Intent intent1=new Intent(this, MainActivity3.class);
         startActivity(intent1);
break;
case R.id.bt_third:
         Intent intent2=new Intent(this, MainActivity4.class);
         startActivity(intent2);
break;

default:
break;
      }
   }

}

 

MainActivity3.java

package com.example.cong;

import android.support.v7.app.ActionBarActivity;
import android.text.TextUtils;

import java.util.ArrayList;
import java.util.List;
import android.content.ContentValues;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;

public class MainActivity3 extends ActionBarActivity implements OnClickListener {
    MyHelper sqlite;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
       //  实现事件监听,点击按钮

        setContentView(R.layout.activity_main3);
        Button btn_add = (Button) findViewById(R.id.btn_add);
        Button btn_delete = (Button) findViewById(R.id.btn_delete);
        Button btn_query = (Button) findViewById(R.id.btn_query);
        Button btn_update = (Button) findViewById(R.id.btn_update);
        btn_add.setOnClickListener(this);
        btn_delete.setOnClickListener(this);
        btn_query.setOnClickListener(this);
        btn_update.setOnClickListener(this);
sqlite = new MyHelper(this);
    }

@Override

//  数据库
public void onClick(View v) {
// TODO Auto-generated method stub
EditText et_name = (EditText) findViewById(R.id.et_name);
        EditText et_number = (EditText) findViewById(R.id.et_number);
        EditText et_people = (EditText) findViewById(R.id.et_people);
        EditText et_weichat = (EditText) findViewById(R.id.et_weichat);
        EditText et_input = (EditText) findViewById(R.id.et_input);
        ListView listView = (ListView) findViewById(R.id.listView);
        String one = et_name.getText().toString();
        String two = et_number.getText().toString();
        String three = et_people.getText().toString();
        String four = et_weichat.getText().toString();
        String input = et_input.getText().toString();
        SQLiteDatabase db;
        ContentValues values;
        values = new ContentValues();
        db = sqlite.getWritableDatabase();
        db = sqlite.getReadableDatabase();
switch (v.getId()) {
case R.id.btn_add:

//  保证输入信息不为零
if (one.length() == 0 || two.length() == 0 || three.length() == 0 || four.length() == 0) {
                    Toast.makeText(this, "添加错误", 0).show();
                } else {
                    values.put("name", one);
                    values.put("number", two);
                    values.put("people", three);
                    values.put("wechat", four);
                    db.insert("animal", null, values);
                    Toast.makeText(this, "添加成功", 0).show();

                }
                db.close();
break;

//  查询内容不为空,若为空显示查询错误
case R.id.btn_query:
                List<Bean> list = new ArrayList();
                Cursor cursor = db.query("animal", null, null, null, null, null, null);
if (cursor.getCount() == 0) {
                    Toast.makeText(this, "查询错误", 0).show();
                }
while (cursor.moveToNext()) {
                    Bean Bean = new Bean();
int nameIndex = cursor.getColumnIndex("name");
int numberIndex = cursor.getColumnIndex("number");
int peopleIndex = cursor.getColumnIndex("people");
int wechatIndex = cursor.getColumnIndex("wechat");
                    String name = cursor.getString(nameIndex);
                    String number = cursor.getString(numberIndex);
                    String people = cursor.getString(peopleIndex);
                    String wechat = cursor.getString(wechatIndex);
                    Bean.setName(name);
                    Bean.setNumber(number);
                    Bean.setPeople(people);
                    Bean.setWechat(wechat);
                    list.add(Bean);

                }
                Adapter adapter = new Adapter(MainActivity3.this, list);
                listView.setAdapter(adapter);
                adapter.notifyDataSetChanged();
                cursor.close();
                db.close();
break;
case R.id.btn_update: // 修改数据
if (one.length() == 0 || two.length() == 0 || three.length() == 0 || four.length() == 0) {
                    Toast.makeText(this, "修改错误", 0).show();
                } else {
                    values = new ContentValues(); // 要修改的数据
values.put("name", et_name.getText().toString());
                    values.put("number", et_number.getText().toString());
                    values.put("people", et_people.getText().toString());
                    values.put("wechat", et_weichat.getText().toString());
                    db.update("animal", values, null, null); // 更新并得到行数

Toast.makeText(this, "已修改", 0).show();
                    db.close();
                }

break;
case R.id.btn_delete: // 删除数据
if (TextUtils.isEmpty(input)) {
                    Toast.makeText(this, "删除错误", 0).show();
                } else {
                    db.delete("animal", "name=?", new String[] { input });
                    Toast.makeText(this, "信息已删除", 0).show();
                    db.close();
                    db.close();
                }

break;

default:
break;
        }

    }
}

 

MainActivity4.java

package com.example.cong;

import android.support.v7.app.ActionBarActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity4 extends ActionBarActivity implements OnClickListener {


   @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main4);
      Button bt_cat=(Button) findViewById(R.id.bt_cat);
      Button bt_dog=(Button) findViewById(R.id.bt_dog);
      Button bt_rabbit=(Button) findViewById(R.id.bt_rabbit);
      bt_cat.setOnClickListener(this);
      bt_dog.setOnClickListener(this);
      bt_rabbit.setOnClickListener(this);

   }

   @Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.bt_cat:
         Intent intent3=new Intent(this, MainActivity5.class);
         startActivity(intent3);
break;
case R.id.bt_dog:
         Intent intent4=new Intent(this, MainActivity6.class);
         startActivity(intent4);
break;

//  设置页面跳转
case R.id.bt_rabbit:
         Intent intent5=new Intent(this, MainActivity7.class);
         startActivity(intent5);
break;

default:
break;
      }
   }



   }

MainActivity5.java

package com.example.cong;
import android.support.v7.app.ActionBarActivity;

import java.util.List;

import android.media.Image;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity5 extends ActionBarActivity {
private String[] name = { "苏格兰折耳猫", "布偶猫", "英国短毛猫", "伯曼猫", "蒂凡尼猫", "美国卷毛猫","法老王猫"};
private int[] picture= { R.drawable.cat1, R.drawable.cat2,R.drawable.cat3, R.drawable.cat4,
            R.drawable.cat5,R.drawable.cat6,R.drawable.cat7};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main5);
        ListView lv = (ListView) findViewById(R.id.listView1);
        Myadapter myadapter= new Myadapter();
        lv.setAdapter(myadapter);
    }
class Myadapter extends BaseAdapter{

@Override
public int getCount() {
// TODO Auto-generated method stub
return name.length;
        }

@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return name[position];
        }

@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
        }
//  加载布局文件
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
View view=View.inflate(MainActivity5.this, R.layout.list_item1, null);
            TextView tv=(TextView)view.findViewById(R.id.name);
            ImageView iv=(ImageView)view.findViewById(R.id. iv);
            tv.setText(name[position]);
            iv.setBackgroundResource(picture[position]);
return view;
        }

    }

 

MainActivity6.java

package com.example.cong;
import android.support.v7.app.ActionBarActivity;

import java.util.List;

import android.media.Image;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity6 extends ActionBarActivity {
private String[] name = { "阿拉斯加", "哈士奇", "泰迪犬", "比熊犬", "蝴蝶犬", "拉布拉多","萨摩耶"};
private int[] picture= { R.drawable.dog1, R.drawable.dog2,R.drawable.dog3, R.drawable.dog4,
            R.drawable.dog5,R.drawable.dog6,R.drawable.dog7};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main6);
        ListView lv2 = (ListView) findViewById(R.id.listView2);
        Myadapter myadapter= new Myadapter();
        lv2.setAdapter(myadapter);
    }
class Myadapter extends BaseAdapter{

@Override
public int getCount() {
// TODO Auto-generated method stub
return name.length;
        }

@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return name[position];
        }

@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
        }

@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
View view=View.inflate(MainActivity6.this, R.layout.list_item2, null);
            TextView tv=(TextView)view.findViewById(R.id.name);
            ImageView iv=(ImageView)view.findViewById(R.id. iv2);
            tv.setText(name[position]);
            iv.setBackgroundResource(picture[position]);
return view;
        }

    }

MainActivity7.java

package com.example.cong;

import android.support.v7.app.ActionBarActivity;

import java.util.List;

import android.media.Image;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity7 extends ActionBarActivity {
private String[] name = { "侏儒兔", "迷你垂耳兔", "荷兰垂耳兔", "荷兰兔", "法国垂耳兔", "海棠兔","英国垂耳兔"};
private int[] picture= { R.drawable.rabbit1, R.drawable.rabbit2,R.drawable.rabbit3, R.drawable.rabbit4,
            R.drawable.rabbit5,R.drawable.rabbit6,R.drawable.rabbit7};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main7);
        ListView lv3 = (ListView) findViewById(R.id.listView3);
        Myadapter myadapter= new Myadapter();
        lv3.setAdapter(myadapter);
    }
class Myadapter extends BaseAdapter{

@Override
public int getCount() {
// TODO Auto-generated method stub
return name.length;
        }

@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return name[position];
        }

@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
        }

@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
View view=View.inflate(MainActivity7.this, R.layout.list_item3, null);
            TextView tv=(TextView)view.findViewById(R.id.name);
            ImageView iv=(ImageView)view.findViewById(R.id. iv3);
            tv.setText(name[position]);
            iv.setBackgroundResource(picture[position]);
return view;

 

MyHelper.java

package com.example.cong;
//  数据库
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

class MyHelper extends SQLiteOpenHelper {
public MyHelper(Context context) {
super(context, "animal.db", null, 1);
   }

   @Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
db.execSQL(
"CREATE TABLE animal(_id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR(20),people VARCHAR(20), wechat VARCHAR(20),number VARCHAR(20))");
   }

   @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub

}
}

类说明

Adapter.java——设置查询时的listview

Bean.java——设置查询时的listview

MainActivity.java——设置登录页面

MainActivity2.class——设置首页

MainActivity3.java——设置我要领养页面

MainActivity4.java——设置宠物分类页面

MainActivity5.java——设置狗的详情页面

MainActivity6.java——设置猫的详情页面

MainActivity7.java——设置兔子的详情页面

MyHelper.java——建立数据库表

 

 

以上是关于课程设计报告的主要内容,如果未能解决你的问题,请参考以下文章

课程设计|MFC火车票售票系统(含课程报告+源码)

课程设计|MFC火车票售票系统(含课程报告+源码)

课程设计报告

在线抢购平台_课程设计报告

java课程设计

20155211课程设计个人结题报告