2021—2022学年第二学期期末考试
《Android手机软件开发》实践考核
项目设计说明书
项目名称: 购物APP的设计与实现
专 业: 计算机科学与技术
学 号:
姓 名:
任课教师:
2022年6月12日
目 录
1.项目概述11
2.项目需求分析11
3.开发环境22
4.界面设计22
4.1登录22
4.2主页面22
4.3商品详情页面33
4.4商品页面44
4.5购物车页面55
4.6个人界面66
5.数据存储77
6.项目开发与实现88
6.1登录88
6.2主页面88
6.3商品详情页面88
6.4商品页面88
6.5购物车页面99
6.6个人界面99
7.开发总结99
1.项目概述
如今,随着互联网技术的日新月异,移动互联网技术的提高。电子商务行业已经成为了当今的一个热门的话题。虽然,电子商务行业在国内起步比较晚,但是由于国内阿里巴巴、京东等优秀的企业,使得我国在电子商务领域的地位排在世界前列。虽然,电子商务技术已经趋于成熟,但是对于市场来说,电子商务软件的需求仍然很大。有很高的研究价值和市场价值。
随着科技的进步,电子产品的普及,智能手机品牌不断扩大,功能逐渐完善,使得移动应用出现了井喷式的产生和爆炸式的发展。由于移动应用的多元化人性化,更新快、新鲜度高、使得80后、90成为智能手机,app 的主要用户。
购物商城App 的设计响应现代信息化的潮流,跟上时代发展的步伐,便利使用安卓设备进行移动网上购物作为购物商城设计的目的。其中用到类似淘宝商城和京东商城的设计原理,创造功能合理、界面友善、满足使用者简单的网上购物体验。
该系统共包括六个主要页面,其中五个activity页面,四个fragment页面。
2.项目需求分析
在移动互联网不普及的时候,我们需要携带大量的现金,去固定的集市购买我们的生活所需。在过去,没有电子商务的时候,如果我们需要购买一件商品显得非常的不容易,同时,购买的过程中我们需要携带现金,这一行为存在着很大的安全隐患。在交易的时候,卖家和买家需要花很长的时间清点现金,但还是有少付、多付或者存在支付假币的情况。
随着互联网技术的普及,中国电子商务从起初的举步维艰的萌芽期,到如今的鼎盛时期,经历了很长时间。从1997年我国的B2B中国化工网上线,以及C2C模式的易趣网上线,标志着,我国的电子商务行业开始进入了萌芽期,但是这个时候,互联网技术不发达,大众对电子商务缺乏准确的认识和了解,这一阶段成立的互联网公司,显得有心无力。一直到2003年阿里巴巴成立淘宝,推出支付宝开始,大量的网民开始进行网购,这个时候腾讯推出了基于C2C模式的拍拍网,我国电子商务三足鼎立的格局形成。
本次项目设计的目的在于结合现在电子商务发展的特点和趋势,市场上电子商务产业的有优缺点,开发出一款方便快捷安全的购物APP。
3.开发环境
本次开发使用的开发工具:
操作系统:WIN10系统
开发工具:JDK8 Android Studio 4.0.1
API版本:Android API 30
4.界面设计
4.1登录
用户可以通过登录账号密码,来进行APP功能使用,同时查看账号订单,并更改个人信息。登录页面效果如图4-1所示:
图4-1 登录页面
4.2主页面
用户浏览网上商城,可以在网上商城首页查看产品详细信息,并点击进入商品详情查看,可通过点击事件设置喜欢,并添加购物车。主页面效果如图4-2所示:
图4-2 主页面
4.3商品详情页面
此页面用来展示商品详情及介绍。商品详情页面效果如图4-3所示:
图4-3商品详情页面
4.4商品页面
在商品界面,可以通过点击左侧分类通知栏,进入商品分类,并进行添加购物车。商品页面效果如图4-4所示:
图4-4 商品页面
4.5购物车页面
选择完商品后可进入购物车页面,查看自己要购买的商品,可修改某一商品数量、取消购买某商品和清空整个购物车。购物车页面效果如图4-5所示:
图4-5购物车页面
4.6个人界面
用户在个人界面登录后,可在此页面查看订单,并进行个人信息的修改。个人界面效果如图4-6所示:
图4-6登录页面
5.数据存储
Android提供了四种数据存储方式:
- 使用Preference存储数据:Preference采用“键-值”对方式组织和管理数据,其数据存储在XML文件中。相对于其他方式,它是一个轻量级的存储机制。该方式实现比较简单,适合简单数据的存储。
- 使用File存储数据:文件存储的特点介于Preference与SQLite之间。从存储量来看,文件存储是一个“重量级”存储机制,比Preference方式更适合存储较大的数据;从存储结构化来看,这种方式不同于SQLite,不适合结构化的数据存储。
- 使用SQLite存储数据:SQLite使用数据库作为存储方式,它是一个重量级的存储机制,适合大数据量的数据存储,通过这种方式能够很容易的对数据进行增加、插入、删除、更新等操作。相比Preference和文件存储,使用SQLite较为复杂。
- ContentProvider:数据共享,四大组建之一。
本次项目开发使用了使用File存储数据,代码如下:
public class DataServer {
private static List<String> snackOrderList;
private static List<Snack> homeList;
private static List<Snack> fujianList;
private static List<Snack> guangxiList;
private static List<Snack> guangzhouList;
private static List<Snack> beijingList;
private static List<Snack> chongqingList;
private static List<User> accountList;
public static List<Snack> getHomeList() {
if (homeList == null) {
homeList = new ArrayList<Snack>() {{
add(new Snack("苹果13", 5999, R.mipmap.sp1, "苹果13一般指iPhone 13。"));
add(new Snack("华为mate40", 5888, R.mipmap.sp2, "华为Mate40一般指HUAWEI Mate 40。"));
add(new Snack("联想Y9000P", 8999, R.mipmap.sp3, "联想Y9000P采用了双面金属设计,搭载16英寸四边窄边框屏,支持杜比视界。"));
}
return homeList;
}
6.项目开发与实现
6.1登录
此页面显示登录页面的信息,布局文件在activity_login.xml,顶部使用LinearLayout组件来进行LOGO展示,下方使用EditText组件来显示登录账号及密码,使用户进行账号登录功能。
6.2主页面
此页面显示主页面的信息,布局文件在activity_main.xml,顶部用了有个ImageView配件来进行页面展示,下面用fragment组件来进行商品展示,通过点击事件可以调用DetailActivity页面,同时跳转到activity_detail.xml来对用户进行商品页面展示。
6.3商品详情页面
此页面显示商品详情页面的信息,布局文件在activity_detail.xml,顶部用ImageView来进行商品图片展示,在下面用两个TextView组件来进行商品详情展示,并添加了一个Button按钮调用通过onCreate功能来进行添加到购物车的功能。
6.4商品页面
此页面显示商品页面的信息,布局文件在fragment_snack.xml,左边使用LinearLayout组件写了一个分类布局,来进行商品分类的实现,在右边则用LinearLayout组件展示添加到购物车的实现,通过调用BaseQuickAdapter方法来对购物车功能进行实现及提示。
6.5购物车页面
此页面显示购物车页面的信息,布局文件在fragment_place.xml,页面下方使用LinearLayout组件来进行商品金额的显示,右侧用Button来实现下单功能,通过AppCompatActivity调用OrderActivity页面对添加到购物车的商品进行展示,使用户来对挑选的商品进行炒作。
6.6个人界面
此页面显示个人页面的信息,布局文件在fragment_my.xml,此页面用了多个LinearLayout组件来进行设计,在ScrollView配件中,添加了一个图像组件及两个TextView组件,来进行用户的登录功能。下面用一个LinearLayout中设定了查看订单及未来得及添加的功能,在下方设置了多个TextView组件来进行个人信息的添加和修改。
7.开发总结
在这学期Android的学习中不仅学习了相关的专业知识,更让我对Android系统有了一个更加深入的了解,在Android编程过程中巩固熟悉了Java的编程。由于Android应用程序的开发离不开Java的支持,所以基础的Java知识是必须的。但在期末项目开发中,功能设计并不是很完善,还有许多地方需要进行修改改进,时间有限是因素之一,其次是因为对于技术开发仍然有些不足。
回顾以前所走的路,太多的是无奈和迷茫,这次跟随老师的安卓学习就像是我人生道路上的航标,为我指明了前进的方向,使我对自己的前途充满了信心,同时也知道了自己的前进方向。
我会在接下来的学习时间里,认真学习,充分利用时间完成相应的学科作业,并合理安排时间进行复习,以此更好的完成接下来的期末考试。
附录:
1.登录
DBHelper(MainActivity.this,"db_project",null,1);
Button btn_login=findViewById(R.id.btn_login);
EditText login_username=findViewById(R.id.login_username);
EditText login_password=findViewById(R.id.login_password);
btn_login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//1.获取输入的用户名和密码
String username=login_username.getText().toString();
String password=login_password.getText().toString();
//2.去数据库里进行查询
Cursor cursor=helper.getReadableDatabase().query("tb_user",null,"username=? and password=?",new String[]{username,password},null,null,null);
if (cursor.moveToNext()){
//跳转
Intent intent=new Intent(MainActivity.this,MActivity.class);
Bundle bundle=new Bundle();
bundle.putCharSequence("username",cursor.getString(2));
bundle.putCharSequence("id",cursor.getString(0));
intent.putExtras(bundle);
// Toast.makeText(MainActivity.this,cursor.getString(2),Toast.LENGTH_SHORT).show();
startActivity(intent);
}else {
//没有查询到
Toast.makeText(MainActivity.this, "请输入正确的用户名和密码", Toast.LENGTH_SHORT).show();
}
}
});
2.主界面
public class WelcomeActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_welcome);
View decorView = getWindow().getDecorView();
// Hide the status bar.
int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN;
decorView.setSystemUiVisibility(uiOptions);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
Intent intent = new Intent(WelcomeActivity.this, MainActivity.class);
startActivity(intent);
finish();
}
}, 800);
}
3.商品详情页面
public class DetailActivity extends AppCompatActivity {
@BindView(R.id.detailImage)
ImageView image;
@BindView(R.id.detailName)
TextView name;
@BindView(R.id.detailPrice)
TextView price;
@BindView(R.id.detailContent)
TextView detail;
@BindView(R.id.detailAddCartBtn)
Button addCart;
@BindView(R.id.detailFavorite)
ImageView favorite;
public static void actionStart(Context context, Snack snack) {
Intent intent = new Intent(context, DetailActivity.class);
intent.putExtra("snack", snack);
context.startActivity(intent);
}
4.商品页面
public class SnackRightAdapter extends BaseQuickAdapter<Snack, BaseViewHolder> {
public SnackRightAdapter(List<Snack> snacks) {
super(R.layout.item_snack_right, snacks);
}
@Override
protected void convert(@NotNull BaseViewHolder baseViewHolder, Snack snack) {
baseViewHolder.setImageResource(R.id.snackRightImage, snack.getImage())
.setText(R.id.snackRightName, snack.getName())
.setText(R.id.snackRightPrice, "¥" + snack.getPrice());
}
}
5.购物车页面
public class PlaceOrderAdapter extends BaseQuickAdapter<Snack, BaseViewHolder> {
public PlaceOrderAdapter(List<Snack> snacks) {
super(R.layout.item_place_order, snacks);
}
@Override
protected void convert(@NotNull BaseViewHolder baseViewHolder, Snack snack) {
baseViewHolder.setImageResource(R.id.placeOrderImage, snack.getImage())
.setText(R.id.placeOrderName, snack.getName())
.setText(R.id.placeOrderPrice, "¥" + snack.getPrice())
.setText(R.id.orderCountBtn, String.valueOf(snack.getCount()));
}
}
6.个人页面
private void initView() {
if (MyApplication.isLogin()) {
User user = MyApplication.getUser();
image.setImageResource(user.getHeadImage());
nickname.setText(user.getNickname());
username.setText("账号: " + user.getUsername());
}
}
@OnClick(R.id.myUserHead)
void clickImage() {
if (MyApplication.isLogin()) {
Tips.show("已登录");
} else {
LoginActivity.actionStart(getActivity());
}
}
@OnClick(R.id.constraintLayout)
void clickcslayout() {
if (MyApplication.isLogin()) {
Tips.show("已登录");
} else {
LoginActivity.actionStart(getActivity());
}