《Android应用开发综合实训》指导任务书
题 目: Android通讯录
学 院: 电子与信息工程学院
专业班级: 19计算机 (1) (2)
指导老师: 黄
姓 名:
学 号:
使用学期: 2020—2021—2
月 日至 月 日 共 1 周
系主任(签字)
一、设计目的、要求及步骤
1、设计目的
1.巩固和掌握android应用程序开发的基本理论和知识,加深对课程知识的理解;
2.掌握常用应用程序的设计方法,培养学生设计、分析问题和解决问题的综合能力;
3.培养学生对工程设计的思维方式和步骤,培养学生分析能力以及独立学习的能力;
4.掌握对android应用程序开发环境的使用;
2、基本要求
设计一个基于Android的手机通讯录,此通讯录包括添加、搜索、修改、删除联系人的功能。
点击通讯录主界面选项菜单中的“添加联系人”菜单项,进入添加联系人界面,输入联系人的基本信息,包括姓名、手机号码、家庭地址、单位名称、Email、QQ号这些信息,姓名和手机号码必须不为空,且唯一。点击通讯录中一个已存在的联系人,进入编辑界面,可修改联系人的资料或进行删除操作,完成后返回到主界面。
点击通讯录选项菜单中的“查找联系人”菜单项,进入搜索界面,能通过姓名、手机号码、单位名称等信息查找联系人,将所有符合查询条件的联系人通过列表控件显示。
在联系人主界面上长按一个已存在的联系人,能弹出一个快捷菜单,菜单项包括拨打电话、发送短信、修改联系人、删除联系人。点击菜单项能跳转到相应的界面。
3、设计步骤
(1)复习《android应用程序设计》的相关知识;
(2)思考,上网查资料,对设计方案进行论证,确定设计方案;
(3)根据任务书的要求,写出需求分析,模块功能,数据库设计,用户界面;
(4)按需求分析和功能模块编写程序代码;
(5)对程序进行调试,并写出设计报告。
4、设计要求
(1)制作通讯录APP,要求界面美观,功能完整;
(2)撰写设计报告一份。
二、进程安排
星期一:完成设计步骤第(1)、(2)项内容;
星期二:完成设计步骤第(3)项内容;
星期三、星期四:完成设计步骤第(4)项内容;
星期五:完成设计步骤第(5)项内容。
三、主要参考资料
[1]. 《Android应用程序开发》第3版 出版社:清华大学出版社
[2]. 《android 开发入门与实战》 出版社:人民邮电出版社 2009.9
[3]. 《Android应用开发解密》 出版社:机械工业出版社 2010.5
[4]. 《Android应用开发完全学习手册》. 出版社:清华大学出版社 2015.1
四、课程设计报告
该设计报告的内容应包括200字左右的摘要;主要内容包括软件开发步骤、所用到的相关知识,软件开发过程中所解决的问题,分析方法;测试结果;心得体会等。
五、评分标准
对本课程设计项目的评价采用优、良、中、及格、不及格五个等级
1、优:对软件的所有功能都能正确完成,界面美观,代码完整清楚,口头答辩流畅,课程设计报告内容丰富具体,语言流畅,表达清晰,分析思路清楚。
2、良:对软件的大部分功能都能正确完成,代码完整;口头答辩流畅,课程设计报告内容丰富具体,语言流畅,表达清楚,有自己的分析思路。
3、中:对软件的部分功能都能正确完成,代码基本完整;能对部分设计内容进行答辩,课程设计报告内容基本符合要求,语言基本流畅,表达基本清楚。
4、及格:对软件的基本功能都能完成;能对基本设计内容进行答辩,课程设计报告内容基本符合要求,语言基本流畅,表达基本清楚。
5、不及格:未达到合格要求,不合格者须重做本项目。
源码有偿可私信
看来没人会了,那只好求自己了,给自己看看哈
9:38:34
这是购物系统首页,是仿照华为商城设计的,当然也可以说是仿照小米商城,这二者的页面设计并无本质区别,具体实现借助于Bootstrap,商品信息通过后台数据库读取
如果此时点击加入购物车会调用Servlet中的doPost方法,进而通过登陆信息是否读取成功判断登陆状态,如果未登录则转至登录界面并提示相关信息,背景渐变色借助于
webgradients选取,同时实现正则验证与验证码相关功能
我们先注册再登录,这里注册的相关信息
之后我们登录并将心仪的商品加入购物车,查看购物车,这里会一致显示当前登录用户信息
提交订单后查看订单,这里借助jQuery做了一个下拉框,可以查看后台数据库关于此订单的全部信息,这里提交订单相当于付款,所以未设退货功能,因此数据删除只能借助于后台数据库。
遇到的问题就是在修改index的时候报错
还有在添加tomcat时遇到问题
9:42:56
JdbcUtils.java
用于加载驱动并获得与数据库的连接的工具类
package common;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class JdbcUtil {
static Connection connection;
public static Connection getCon() {
//加载驱动
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String url = "jdbc:mysql://localhost:3306/shoppingsystem?characterEncoding=utf-8";
String username = "root";
String password = "123";
//获得连接
try {
connection = DriverManager.getConnection(url, username, password);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return connection;
}
public static void closeAll(Connection connection, PreparedStatement preparedStatement, ResultSet resultSet) {
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (preparedStatement != null) {
try {
preparedStatement.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
9:44:57
People.java
与数据库中用户表相匹配的用户类
package entity;
public class People {
private String id;
private String password;
private String name;
private String email;
private String address;
public People() {
super();
// TODO Auto-generated constructor stub
}
public People(String id, String password, String name, String email, String address) {
super();
this.id = id;
this.password = password;
this.name = name;
this.email = email;
this.address = address;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "People [id=" + id + ", password=" + password + ", name=" + name + ", email=" + email + ", address="
+ address + "]";
}
}
InterfacePeopleDao.java
对用户信息进行相关操作的接口
package dao;
import java.util.List;
import entity.People;
public interface InterfacePeopleDao {
public abstract int insertPeople(String id, String password, String name, String email, String address);
public abstract int deletePeople(String id);
public abstract int updatePeople(String id, String password, String name, String email, String address);
public abstract People checkPeople(String id, String password);
public abstract List<People> findAllPeople();
}
9:46:05
PeopleDao.java
对上述接口的实现
package dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import common.JdbcUtil;
import entity.People;
public class PeopleDao implements InterfacePeopleDao {
private Connection connection;
private PreparedStatement preparedStatement;
private ResultSet resultSet;
@Override
public int insertPeople(String id, String password, String name, String email, String address) {
String sql = "mistake";
if (id != "" && password != "" && name != "" && email != "" && address != "") {
sql = "insert into people (id, password, name, email, address)" + "values('" + id + "','" +
password + "','" + name + "','" + email + "','" + address + "');";
}
System.out.println("insertPeople()的sql语句:" + sql);
int result = 0;
connection = JdbcUtil.getCon();
try {
preparedStatement = connection.prepareStatement(sql);
} catch (SQLException e) {
e.printStackTrace();
}
try {
result = preparedStatement.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
JdbcUtil.closeAll(connection, preparedStatement, resultSet);
return result;
}
@Override
public int deletePeople(String id) {
// TODO Auto-generated method stub
return 0;
}
@Override
public int updatePeople(String id, String password, String name, String email, String address) {
// TODO Auto-generated method stub
return 0;
}
@Override
public People checkPeople(String id, String password) {
String sql = null;
if (id != null && password != null) {
sql = "select * from people where id = '" + id + "' and password = '" + password + "'";
}
System.out.println("checkPeople()的sql语句:" + sql);
People people = null;
connection = JdbcUtil.getCon();
try {
preparedStatement = connection.prepareStatement(sql);
resultSet = preparedStatement.executeQuery();
if (resultSet.next()) {
people = new People();
people.setId(resultSet.getString(1));
people.setPassword(resultSet.getString(2));
people.setName(resultSet.getString(3));
people.setEmail(resultSet.getString(4));
people.setAddress(resultSet.getString(5));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
JdbcUtil.closeAll(connection, preparedStatement, resultSet);
}
return people;
}
@Override
public List<People> findAllPeople() {
// TODO Auto-generated method stub
return null;
}
}
9:46:53
InterfacPeopleService.java
在业务逻辑层中将表现层与数据访问层进行连接,由于项目本身并不复杂,所以只是简单实现了方法传递
package service;
import java.util.List;
import entity.People;
public interface InterfacePeopleService {
public abstract int insertPeople(String id, String password, String name, String email, String address);
public abstract int deletePeople(String id);
public abstract int updatePeople(String id, String password, String name, String email, String address);
public abstract People checkPeople(String id, String password);
public abstract List<People> findAllPeople();
}
PeopleService.java
9:47:10
对上述接口的实现
package service;
import java.util.List;
import dao.InterfacePeopleDao;
import dao.PeopleDao;
import entity.People;
public class PeopleService implements InterfacePeopleService {
private InterfacePeopleDao peopleDao;
public PeopleService() {
peopleDao = new PeopleDao();
}
@Override
public int insertPeople(String id, String password, String name, String email, String address) {
return peopleDao.insertPeople(id, password, name, email, address);
}
@Override
public int deletePeople(String id) {
// TODO Auto-generated method stub
return 0;
}
@Override
public int updatePeople(String id, String password, String name, String email, String address) {
// TODO Auto-generated method stub
return 0;
}
@Override
public People checkPeople(String id, String password) {
return peopleDao.checkPeople(id, password);
}
@Override
public List<People> findAllPeople() {
// TODO Auto-generated method stub
return null;
}
}
CheckCode.java
在内存中生成验证码图片并输出到客户端
package servlet;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@WebServlet("/CheckCode")
public class CheckCode extends HttpServlet {
private static final long serialVersionUID = 1L;
private static int width=70;
private static int height=25;
public CheckCode() {
super();
// TODO Auto-generated constructor stub
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/**
* request是客户端浏览器发出的请求被封装形成的一个HttpServletRequest公共接口类对象
* session对象存储特定用户会话所需的属性及配置信息, 这样当用户在应用程序的Web页之间跳转时, 存储在session对象中的变量将不会丢失, 而是在整个用户会话中一直存在下去
* getSession()与getSession(true)一样, 获取request对象关联的session对象, 如果没有session, 则返回一个新的session
*/
HttpSession session=request.getSession();
response.setContentType("image/jpeg");// 设置生成的文档类型为jpg
ServletOutputStream servletOutputStream = response.getOutputStream();
/*设置浏览器不要缓存此图片*/
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
/**
* 创建内存图片并获得其图形上下文
* Image是一个抽象类, BufferedImage是其实现类, 是一个带缓冲区图像类, 主要作用是将一幅图片加载到内存中
* BufferedImage生成的图片在内存里有一个图像缓冲区, 利用这个缓冲区我们可以很方便地操作这个图片
*/
BufferedImage image=new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics graphics=image.getGraphics();
char[] rands=generCode();// 产生随机的验证码
drawRands(graphics, rands);// 产生图像
graphics.dispose();// 结束图像的绘制过程,完成图像
/*将图像输出到客户端*/
ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream();
ImageIO.write(image, "jpeg", byteArrayOutputStream);
byte[] buf=byteArrayOutputStream.toByteArray();
response.setContentLength(buf.length);
servletOutputStream.write(buf);
byteArrayOutputStream.close();
servletOutputStream.close();
session.setAttribute("checkcode", new String(rands));// 将当前的验证码写入到session中
}
private char[] generCode() {
//定义验证码的字符表
String chars="0123456789";
char[] rands=new char[5];
for(int i=0;i<5;i++) {
int rand=(int)(Math.random()*10);
rands[i]=chars.charAt(rand);
}
return rands;
}
private void drawRands(Graphics g,char[] rands) {
g.setColor(Color.WHITE);
g.setFont(new Font(null, Font.ITALIC|Font.BOLD, 18));
/*在不同高度上输出验证码的每个字符*/
g.drawString("" + rands[0], 0, 18);
g.drawString("" + rands[1], 14, 18);
g.drawString("" + rands[2], 28, 18);
g.drawString("" + rands[3], 42, 18);
g.drawString("" + rands[4], 56, 18);
System.out.print("当前验证码:");
System.out.println(rands);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}}
总结,经历了这么多天的浴血奋战以及和小伙伴共同的努力,终于把这段代码以及其中页面效果给运行出来了,真的很开心。我的内心充满了无比的喜悦,毕竟是和小伙伴一起完成的。当然编程这件事情靠自己的努力是完全不够的。合作的力量真的是很伟大。
这个学期让我收获最大的便是自己能够和小伙伴一起来探讨编程的乐趣。小到一个字母,大到一堆项目。每每一步都代表着希望,代表着我们的努力。
每当我感慨世界末日就要来了,感觉那肯定是做不完的,结果每次都是到最后的时候,我和小伙伴相互鼓励相互加油,慢慢的发现出原来合作的力量是这么的奇思妙想的。虽然我个人的编程能力并不咋地,甚至有可能还是属于小白中的小白,还在摸索当中。
不过小伙伴给了我努力编下去的意义。每次我看到那些边惩大佬,我都会感觉他们很厉害。这让我知道了自身的不足。但是编程这个东西本身就是靠一个人,基本上很难,完全要靠大家的努力一起来实现这个目标,一起奋斗。这样子才能显示出其中的意义。
当然了,知道这个实训仅仅是为了来检测一下我们平时的学习状况是如何,我相信这只是一个小小的测试,因为在未来的路上我们还有很长很长的路需要走。有时候不会的东西就会发到网上去,向老师提问,向同学帮助。最终东拼西凑勉强搞回来了。当然所做的一切并不只是为了凑字数,或者说为了应付考试,当然内心其实还是有这么一点点想法。现在想起实属罪恶。但是不用害怕,每一步路都会有一步脚印的一步一步去做,脚踏实地的去完成任何力所能及的事情。
有的人在编程的道路上越走越远,有的人却还是个小白,当然我也有点还是小白,但我还是会加油会努力的。而且关于编程让我意义最深刻的就是动手能力要强,很多代码都需要靠自己的双手去打出来。没想到小小的代码居然会产生如此巨大的效果,这真是一件令人难以置信的事情,但是也是有点小小的神奇。不过这也在情理之中。
我相信靠我们共同的能力能够创造出辉煌的未来。加油,在编程的路上越走越远。