设计性实验报告Word格式文档下载.docx
《设计性实验报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《设计性实验报告Word格式文档下载.docx(56页珍藏版)》请在冰豆网上搜索。
通过本综合设计,让学生们巩固有关Android平台软件开发的知识,也考查学生的学习情况。
二、实验内容
使用eclipse编写android的代码。
本软件为图书管理员通过移动平台来对图书进行一系列的操作,方便用户随时查看图书情况。
图书管理系统总的来说分为图书类别管理和图书信息管理。
图书类别管理主要编辑图书的类别,查询图书类别,删除图书类别;
图书信息管理,主要包括添加图书,查询图书,返回主界面,并且每个图书都有详细描述,包括条形码、图书类别、图书名称、图书图片。
3、实验截图、操作步骤
1、图书管理的数据库设计
图1数据库设计图
数据库说明:
此图书管理一共分了三个数据表,第一个为图书表,里面包含了条形码(主键)、图书名称、图书类别,价格,库存数量、出版日期、图书封面等属性;
第二个为用户表,里面包含了,用户ID(主键),用户名称、用户密码、电话和地址;
第三个是图书类别表,包含了图书类别ID(主键),图书类别名称,它的主键图书类别ID是图书表的外键。
2、程序框架
图2程序框架图
程序框架说明:
左侧为服务器的数据操作框架,对前台页面传入的数据在后台进行增删改查操作,并且对前台传过来的用户信息在数据库中进行对比,对比成功之后才可以进行登录;
右侧为用户端的设计,就是用户能看见的安卓页面设计都在这里进行编写,界面设计都在layout里面,然后对界面的相应控件进行绑定,把适配器代码写在activity包里。
在服务端和客户端相结合这才能很好地完成整个项目。
3、用户登录,用户可以输入用户名和密码通过登录进入主页面,然后在进行图书的操作,登录的效果图如下:
图3用户登录图
图4登录成功图
实现功能:
用户登录
实现方法:
此模块为登录模块,使用了TextView、EditText、Button等控件来实现整体布局。
在此布局中,采用了线性布局的结构来对页面的基本控件进行排布。
在LoginActivity.java中声明登录,重置按钮:
privateButtoncancelBtn,loginBtn,然后再去声明用户名和密码框登录:
privateEditTextuserEditText,pwdEditText;
接着在设置顶部标题:
setTitle(手机客户端-登录);
之后设置当前Activity页面布局:
setContentView(R.layout.login_system);
通过这个FindViewById方法实例化四个组件:
loginBtn、cancelBtn、userEditText、pwdEditText。
然后给loginBtn、cancelBtn绑定OnClickListener()事件,通过url=HttpUtil.BASE_URL+"
Login-
Servlet?
userName="
+URLEncoder.encode(....)将数据传到后台,后台判断此用户是否存在并判断密码是否正确,在后台的LoginServlet.java中运用spl语句查询用户表,如果存在返回0,如不存在返回空。
如果用户登录成功,则调用Toast.make
Text(getApplicationContext(),"
登入成功"
1).show()打印数据,然后进入根据intent.setClass(LoginActivity.this,MainMenuActivity.class);
这个语句进入MainMenuActivity的页面。
4、查询功能,此块为模糊查询,用户可以根据小的信息量进行图书的查询,效果图如下:
图5模糊查询图
图6查询结果图
查询功能
模糊查询,即输入一个字符,输出所有存在该字符的路径。
在BookListActivity.java中,创建了三个按钮,“添加图书”、“查询图书”、“返回主界面”,点击“查询图书”按钮,通过intent.setClass(BookListActivity.this,BookQueryActivity.class);
启动BookQueryActivity,并将BookListActivity先finish,等待之后在使用。
加载BookQueryActivity,设置当前Activity界面布局setContentView(R.layout.book_query)。
设置页面布局,为实现多种查询,我们设置了条形码、图书名称、图书类别和出版日期四个TextView,条形码和图书名称,使用EditText输入查询字符;
图书类别则使用Spinner控件,Spinner提供了从一个数据集合中快速选择一项值的办法;
出版日期,使用日期控件DatePicker;
创建复选框CheckBox,可选择出版日期是否参与查询。
最后创建“查询”Button完成布局。
在BookQueryActivity中初始化book_query.xml布局中的几个控件。
判断获取到的几个重要字段对应的组件EditView填入的值不是为空,并通过queryConditionBook.set
Barcode(ET_barcode.getText().toString());
queryConditionBook.setBookName
(ET_bookName.getText().toString());
获取查询参数,通过DatepublishDate=newDate(dp_publishDate.getYear()-1900,dp_publishDate.getMonth(),dp_publishDate.getDayOfMonth());
获取出版日期。
将可选内容与ArrayAdapter连接起来,bookClassId_adapter=newArrayAdapter<
String>
(this,android.R.layout.simple_spinner_item,m);
设置图书类别下拉列表的风格,spinner_bookClassId.setAdapter
(bookClassId_adapter);
添加事件Spinner事件监听,pinner_bookClassId.setOn
ItemSelectedListener(newBookClassIdSpinnerSelectedListener());
设置默认值,pinner_bookClassId.setVisibility(View.VISIBLE);
添加图书按钮,btnQuery.set
OnClickListener(newOnClickListener()。
5、添加图书信息功能,把图书添加进来,效果如下:
图7添加图书信息图
图书添加功能
在BookListActivity.java中,创建了三个按钮,添加图书、查询图书、返回主界面点击添加图书按钮,通过Intent.setClass(BookListActivity.this,BookAddActivity.class)启动BookAddActivity,并将BookListActivity先finish,等待之后在使用。
加载BookAddActivity,设置当前Activity界面布局setContentView(R.Layout.book_add)。
在BookAddActivity中初始化xml布局中的几个控件。
判断获取到的几个重要字段对应的组件EditView填入的值不是为空,并通过bookService.AddBook(book),将页面上获取到的Book对象作为参数传递,并调用Service层中的方法。
AddBook()中,使用HttpUtil.SendPostRequest(url,params,
”UTF-8”);
向服务器发送一条Http报文,类型为Post请求,并创建一个字节数组对象byte[]resultByte,获取从服务端响应回的数据。
一般做更新操作时,服务端传回的result数据是一个字符串,例如“图书添加成功!
”或“图书添加失败!
”。
然后将result传回Activity,并通过Toast.makeTest()在布局中打印出来。
6、添加图书类别功能,增添图书的多样性,实现效果如下:
图8图书类别页面
图9进入添加页面
图10添加成功图
添加图书类别
在BookClassListActivity.java中创建选项菜单,分别是“添加图书类别”、“返回主界面”两个选项,点击“添加图书类别”选项,通过intent.setClass(BookClassListActivity.this,BookClassAddActivity.class);
启动BookClassAddActivity,并将BookClassListActivity先关闭,等待之后再使用。
加载BookClassAddActivity.java,设置当前activity界面布局setContentView(R.layout.bookclass_add)。
在BookClassAddActivity中初始化xml布局中的控件。
有两个Button控件“确定”、“重新填写”和一个EditText控件。
在EditText控件中填写添加的书籍类别,点击“确定”按钮。
判断获取类别名称的控件EditText填入的值是否为空,使用HttpUtil.SendPostRequest(url,params,"
UTF-8"
);
向服务器发送一条Http报文,类型为post请求,将params里的类别名称作为参数传递,并调用Service层中的方法。
在Service层中,BookClassDAO中的AddBookClass()方法,将BookClassAddActivity中通过post请求获取到的值,通过SQL语句添加到数据库中,并通过在BookClassAddActivity中创建的字节数组对象byte[]resultByte,获取从服务端响应回的数据。
从服务端传回的的result数据为一个字符串,“图书类别添加成功”或“图书类别添加失败”。
7、删除图书类别功能,把不喜欢的图书分类删除掉,实现效果如下:
图11长按显示上下问菜单图
图12成功删除图
删除图书类别
在BookClassListActivity.java中创建上下文菜单,分别是“添加图书类别”、“返回主界面”两个选项“删除图书类别”、“编辑图书类别”,这里我负责的是删除图书类别这一部分。
添加长按点击功能lv.setOnCreateContextMenuListener(bookClassListItemListener);
长按想要删除的图书类别,会弹出上下文菜单,点击“删除图书类别”选项,先通过contextMenuInfo.position获取选中行位置,再通过选中行的位置用hashMap.get("
bookClassId"
).toString()获取它的图书类别编号。
最后调用dialog()方法,会有提示弹出框弹出“确认删除吗?
”字样。
点击“确认”,用HttpUtil.SendPostRequest(url,params,"
在Service层中,BookClassDAO中的DeleteBookClass()方法,将BookClassAddActivity中通过post请求获取到的值,通过SQL语句从数据库中删除,并通过在BookClassAddActivity中创建的字节数组对象byte[]resultByte,获取从服务端响应回的数据。
从服务端传回的的result数据为一个字符串,“图书类别删除成功!
”或“图书类别删除失败”。
8、编辑图书信息功能,用户可以对图书的信息进行修改,实现效果如下:
图13选编辑图书信息图
图14进行编写图
图15图书更新图
修改图书信息
长按菜单,触发响应函数onContextItemSelected(MenuItemitem),点击编辑图书信息按钮,调用BookEditActivity.Java文件,初始化当前Activity界面布局,通过findViewById方法实例化组件,将图书信息回显到EditText中,图书的类别通过调用bookClassService.GetAllBookClass();
获取所有图书类别。
点击确定按钮时触发监听事件,事件中对图书的名称、价格、库存、图片进行验证,
使用HttpUtil.SendPostRequest(url,params,”UTF-8”);
上传图书信息时调用业务层UpdateBook(book);
操作完成后返回到图书管理界面。
9、编辑图书类别功能,用户可以对图书的类别进行修改,实现效果如下:
图16选择编辑图书类别图
图17编辑图书类别图
图18更新成功图
修改图书类别
界面上有四个数据,“计算机类”“历史类”“法律类”“文学类”,长按其中任何一个数据都会触发btnUpdate.setOnClickListener(newOnClickListener()方法,跳到bookclass_edit.xml,弹出子菜单,子菜单里有两个按钮<
Buttonandroid:
text="
更新"
android:
id="
@+id/BtnUpdate"
....../>
<
取消"
@+id/BtnCancle"
......./>
选择更新选项,弹出"
手机客户端-修改图书信息”页面,程序跳到BookEditActivity.java调用的onCreate方法,通过setContentView(R.layout.book_edit);
设置当前Activity界面布局,通过findViewById方法实例化组件,使用btnUpdate=(Button)findViewById(R.id.BtnUpdate);
修改图书类别,在类别名称选择框里面把第八个“法律类”进行修改为“法律类啊”。
点击更新按钮,程序会使用HttpUtil.SendPostRequest(url,params,”UTF-8”);
做更新操作成功后时,服务端传回的result数据是一个字符串,“图书类别更新成功!
然后将result传回Activity,并通过printStackTrace()在布局中打印出来。
四、实验代码
1、后台BookDAO.java的代码:
publicclassBookDAO{
publicList<
Book>
QueryBook(Stringbarcode,StringbookName,
intbookClassId,TimestamppublishDate){
List<
bookList=newArrayList<
();
DBdb=newDB();
Stringsql="
select*fromBookwhere1=1"
;
if(!
barcode.equals("
"
))
sql+="
andbarcodelike'
%"
+barcode+"
%'
bookName.equals("
andbookNamelike'
+bookName+"
if(bookClassId!
=0)
andbookClassId="
+bookClassId;
if(publishDate!
=null)
andpublishDate='
+publishDate+"
'
try{
ResultSetrs=db.executeQuery(sql);
while(rs.next()){
Bookbook=newBook();
book.setBarcode(rs.getString("
barcode"
));
book.setBookClassId(rs.getInt("
book.setBookImage(rs.getString("
bookImage"
book.setBookName(rs.getString("
bookName"
book.setCount(rs.getInt("
count"
book.setPrice(rs.getFloat("
price"
book.setPublishDate(rs.getTimestamp("
publishDate"
bookList.add(book);
}
}catch(Exceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}finally{
db.all_close();
}
returnbookList;
}
/*传入图书对象,进行图书的添加业务*/
publicStringAddBook(Bookbook){
Stringresult="
/*如果所有验证通过就执行sql插入新商品信息*/
StringsqlString="
insertintoBook(barcode,bookName,bookClassId,price,count,publishDate,bookImage)values('
sqlString+=book.getBarcode()+"
'
sqlString+=book.getBookName()+"
"
sqlString+=book.getBookClassId()+"
sqlString+=book.getPrice()+"
sqlString+=book.getCount()+"
sqlString+=book.getPublishDate()+"
sqlString+=book.getBookImage()+"
)"
db.executeUpdate(sqlString);
result="
图书添加成功!
图书添加失败"
returnresult;
/*删除图书*/
publicStringDeleteBook(Stringbarcode){
deletefromBookwherebarcode='
+barcode
+"
图书删除成功!
图书删除失败"
/*根据条形码获取到图书信息*/
publicBookGetBook(Stringbarcode){
Bookbook=null;
select*fromBookwherebarcode='
if(rs.next()){
book=newBook();
returnbook;
/*更新图书信息*/
publicStringUpdateBook(Bookbook){
Stringsql="
updateB