安卓APP源碼和設(shè)計(jì)報(bào)告——購物APP的設(shè)計(jì)與實(shí)現(xiàn)
2021—2022學(xué)年第二學(xué)期期末考試
《Android手機(jī)軟件開發(fā)》實(shí)踐考核
項(xiàng)目設(shè)計(jì)說明書
項(xiàng)目名稱: 購物APP的設(shè)計(jì)與實(shí)現(xiàn)
專 業(yè): 計(jì)算機(jī)科學(xué)與技術(shù)
學(xué) 號(hào):
姓 名:
任課教師:
2022年6月12日
目 錄
1.項(xiàng)目概述11
2.項(xiàng)目需求分析11
3.開發(fā)環(huán)境22
4.界面設(shè)計(jì)22
4.1登錄22
4.2主頁面22
4.3商品詳情頁面33
4.4商品頁面44
4.5購物車頁面55
4.6個(gè)人界面66
5.數(shù)據(jù)存儲(chǔ)77
6.項(xiàng)目開發(fā)與實(shí)現(xiàn)88
6.1登錄88
6.2主頁面88
6.3商品詳情頁面88
6.4商品頁面88
6.5購物車頁面99
6.6個(gè)人界面99
7.開發(fā)總結(jié)99
1.項(xiàng)目概述
如今,隨著互聯(lián)網(wǎng)技術(shù)的日新月異,移動(dòng)互聯(lián)網(wǎng)技術(shù)的提高。電子商務(wù)行業(yè)已經(jīng)成為了當(dāng)今的一個(gè)熱門的話題。雖然,電子商務(wù)行業(yè)在國內(nèi)起步比較晚,但是由于國內(nèi)阿里巴巴、京東等優(yōu)秀的企業(yè),使得我國在電子商務(wù)領(lǐng)域的地位排在世界前列。雖然,電子商務(wù)技術(shù)已經(jīng)趨于成熟,但是對(duì)于市場來說,電子商務(wù)軟件的需求仍然很大。有很高的研究價(jià)值和市場價(jià)值。
隨著科技的進(jìn)步,電子產(chǎn)品的普及,智能手機(jī)品牌不斷擴(kuò)大,功能逐漸完善,使得移動(dòng)應(yīng)用出現(xiàn)了井噴式的產(chǎn)生和爆炸式的發(fā)展。由于移動(dòng)應(yīng)用的多元化人性化,更新快、新鮮度高、使得80后、90成為智能手機(jī),app 的主要用戶。
購物商城App 的設(shè)計(jì)響應(yīng)現(xiàn)代信息化的潮流,跟上時(shí)代發(fā)展的步伐,便利使用安卓設(shè)備進(jìn)行移動(dòng)網(wǎng)上購物作為購物商城設(shè)計(jì)的目的。其中用到類似淘寶商城和京東商城的設(shè)計(jì)原理,創(chuàng)造功能合理、界面友善、滿足使用者簡單的網(wǎng)上購物體驗(yàn)。
該系統(tǒng)共包括六個(gè)主要頁面,其中五個(gè)activity頁面,四個(gè)fragment頁面。
2.項(xiàng)目需求分析
在移動(dòng)互聯(lián)網(wǎng)不普及的時(shí)候,我們需要攜帶大量的現(xiàn)金,去固定的集市購買我們的生活所需。在過去,沒有電子商務(wù)的時(shí)候,如果我們需要購買一件商品顯得非常的不容易,同時(shí),購買的過程中我們需要攜帶現(xiàn)金,這一行為存在著很大的安全隱患。在交易的時(shí)候,賣家和買家需要花很長的時(shí)間清點(diǎn)現(xiàn)金,但還是有少付、多付或者存在支付假幣的情況。
隨著互聯(lián)網(wǎng)技術(shù)的普及,中國電子商務(wù)從起初的舉步維艱的萌芽期,到如今的鼎盛時(shí)期,經(jīng)歷了很長時(shí)間。從1997年我國的B2B中國化工網(wǎng)上線,以及C2C模式的易趣網(wǎng)上線,標(biāo)志著,我國的電子商務(wù)行業(yè)開始進(jìn)入了萌芽期,但是這個(gè)時(shí)候,互聯(lián)網(wǎng)技術(shù)不發(fā)達(dá),大眾對(duì)電子商務(wù)缺乏準(zhǔn)確的認(rèn)識(shí)和了解,這一階段成立的互聯(lián)網(wǎng)公司,顯得有心無力。一直到2003年阿里巴巴成立淘寶,推出支付寶開始,大量的網(wǎng)民開始進(jìn)行網(wǎng)購,這個(gè)時(shí)候騰訊推出了基于C2C模式的拍拍網(wǎng),我國電子商務(wù)三足鼎立的格局形成。
本次項(xiàng)目設(shè)計(jì)的目的在于結(jié)合現(xiàn)在電子商務(wù)發(fā)展的特點(diǎn)和趨勢(shì),市場上電子商務(wù)產(chǎn)業(yè)的有優(yōu)缺點(diǎn),開發(fā)出一款方便快捷安全的購物APP。
3.開發(fā)環(huán)境
本次開發(fā)使用的開發(fā)工具:
操作系統(tǒng):WIN10系統(tǒng)
開發(fā)工具:JDK8 Android Studio 4.0.1
API版本:Android API 30
4.界面設(shè)計(jì)
4.1登錄
用戶可以通過登錄賬號(hào)密碼,來進(jìn)行APP功能使用,同時(shí)查看賬號(hào)訂單,并更改個(gè)人信息。登錄頁面效果如圖4-1所示:

圖4-1 登錄頁面
4.2主頁面
用戶瀏覽網(wǎng)上商城,可以在網(wǎng)上商城首頁查看產(chǎn)品詳細(xì)信息,并點(diǎn)擊進(jìn)入商品詳情查看,可通過點(diǎn)擊事件設(shè)置喜歡,并添加購物車。主頁面效果如圖4-2所示:
圖4-2 主頁面
4.3商品詳情頁面
此頁面用來展示商品詳情及介紹。商品詳情頁面效果如圖4-3所示:
圖4-3商品詳情頁面
4.4商品頁面
在商品界面,可以通過點(diǎn)擊左側(cè)分類通知欄,進(jìn)入商品分類,并進(jìn)行添加購物車。商品頁面效果如圖4-4所示:

圖4-4 商品頁面
4.5購物車頁面
選擇完商品后可進(jìn)入購物車頁面,查看自己要購買的商品,可修改某一商品數(shù)量、取消購買某商品和清空整個(gè)購物車。購物車頁面效果如圖4-5所示:

圖4-5購物車頁面
4.6個(gè)人界面
用戶在個(gè)人界面登錄后,可在此頁面查看訂單,并進(jìn)行個(gè)人信息的修改。個(gè)人界面效果如圖4-6所示:

圖4-6登錄頁面
5.數(shù)據(jù)存儲(chǔ)
Android提供了四種數(shù)據(jù)存儲(chǔ)方式:
使用Preference存儲(chǔ)數(shù)據(jù):Preference采用“鍵-值”對(duì)方式組織和管理數(shù)據(jù),其數(shù)據(jù)存儲(chǔ)在XML文件中。相對(duì)于其他方式,它是一個(gè)輕量級(jí)的存儲(chǔ)機(jī)制。該方式實(shí)現(xiàn)比較簡單,適合簡單數(shù)據(jù)的存儲(chǔ)。
使用File存儲(chǔ)數(shù)據(jù):文件存儲(chǔ)的特點(diǎn)介于Preference與SQLite之間。從存儲(chǔ)量來看,文件存儲(chǔ)是一個(gè)“重量級(jí)”存儲(chǔ)機(jī)制,比Preference方式更適合存儲(chǔ)較大的數(shù)據(jù);從存儲(chǔ)結(jié)構(gòu)化來看,這種方式不同于SQLite,不適合結(jié)構(gòu)化的數(shù)據(jù)存儲(chǔ)。
使用SQLite存儲(chǔ)數(shù)據(jù):SQLite使用數(shù)據(jù)庫作為存儲(chǔ)方式,它是一個(gè)重量級(jí)的存儲(chǔ)機(jī)制,適合大數(shù)據(jù)量的數(shù)據(jù)存儲(chǔ),通過這種方式能夠很容易的對(duì)數(shù)據(jù)進(jìn)行增加、插入、刪除、更新等操作。相比Preference和文件存儲(chǔ),使用SQLite較為復(fù)雜。
ContentProvider:數(shù)據(jù)共享,四大組建之一。
本次項(xiàng)目開發(fā)使用了使用File存儲(chǔ)數(shù)據(jù),代碼如下:
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("聯(lián)想Y9000P", 8999, R.mipmap.sp3, "聯(lián)想Y9000P采用了雙面金屬設(shè)計(jì),搭載16英寸四邊窄邊框屏,支持杜比視界。"));
}
return homeList;
}
6.項(xiàng)目開發(fā)與實(shí)現(xiàn)
6.1登錄
此頁面顯示登錄頁面的信息,布局文件在activity_login.xml,頂部使用LinearLayout組件來進(jìn)行LOGO展示,下方使用EditText組件來顯示登錄賬號(hào)及密碼,使用戶進(jìn)行賬號(hào)登錄功能。
6.2主頁面
此頁面顯示主頁面的信息,布局文件在activity_main.xml,頂部用了有個(gè)ImageView配件來進(jìn)行頁面展示,下面用fragment組件來進(jìn)行商品展示,通過點(diǎn)擊事件可以調(diào)用DetailActivity頁面,同時(shí)跳轉(zhuǎn)到activity_detail.xml來對(duì)用戶進(jìn)行商品頁面展示。
6.3商品詳情頁面
此頁面顯示商品詳情頁面的信息,布局文件在activity_detail.xml,頂部用ImageView來進(jìn)行商品圖片展示,在下面用兩個(gè)TextView組件來進(jìn)行商品詳情展示,并添加了一個(gè)Button按鈕調(diào)用通過onCreate功能來進(jìn)行添加到購物車的功能。
6.4商品頁面
此頁面顯示商品頁面的信息,布局文件在fragment_snack.xml,左邊使用LinearLayout組件寫了一個(gè)分類布局,來進(jìn)行商品分類的實(shí)現(xiàn),在右邊則用LinearLayout組件展示添加到購物車的實(shí)現(xiàn),通過調(diào)用BaseQuickAdapter方法來對(duì)購物車功能進(jìn)行實(shí)現(xiàn)及提示。
6.5購物車頁面
此頁面顯示購物車頁面的信息,布局文件在fragment_place.xml,頁面下方使用LinearLayout組件來進(jìn)行商品金額的顯示,右側(cè)用Button來實(shí)現(xiàn)下單功能,通過AppCompatActivity調(diào)用OrderActivity頁面對(duì)添加到購物車的商品進(jìn)行展示,使用戶來對(duì)挑選的商品進(jìn)行炒作。
6.6個(gè)人界面
此頁面顯示個(gè)人頁面的信息,布局文件在fragment_my.xml,此頁面用了多個(gè)LinearLayout組件來進(jìn)行設(shè)計(jì),在ScrollView配件中,添加了一個(gè)圖像組件及兩個(gè)TextView組件,來進(jìn)行用戶的登錄功能。下面用一個(gè)LinearLayout中設(shè)定了查看訂單及未來得及添加的功能,在下方設(shè)置了多個(gè)TextView組件來進(jìn)行個(gè)人信息的添加和修改。
7.開發(fā)總結(jié)
在這學(xué)期Android的學(xué)習(xí)中不僅學(xué)習(xí)了相關(guān)的專業(yè)知識(shí),更讓我對(duì)Android系統(tǒng)有了一個(gè)更加深入的了解,在Android編程過程中鞏固熟悉了Java的編程。由于Android應(yīng)用程序的開發(fā)離不開Java的支持,所以基礎(chǔ)的Java知識(shí)是必須的。但在期末項(xiàng)目開發(fā)中,功能設(shè)計(jì)并不是很完善,還有許多地方需要進(jìn)行修改改進(jìn),時(shí)間有限是因素之一,其次是因?yàn)閷?duì)于技術(shù)開發(fā)仍然有些不足。
回顧以前所走的路,太多的是無奈和迷茫,這次跟隨老師的安卓學(xué)習(xí)就像是我人生道路上的航標(biāo),為我指明了前進(jìn)的方向,使我對(duì)自己的前途充滿了信心,同時(shí)也知道了自己的前進(jìn)方向。
我會(huì)在接下來的學(xué)習(xí)時(shí)間里,認(rèn)真學(xué)習(xí),充分利用時(shí)間完成相應(yīng)的學(xué)科作業(yè),并合理安排時(shí)間進(jìn)行復(fù)習(xí),以此更好的完成接下來的期末考試。
附錄:
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.去數(shù)據(jù)庫里進(jìn)行查詢
Cursor cursor=helper.getReadableDatabase().query("tb_user",null,"username=? and password=?",new String[]{username,password},null,null,null);
if (cursor.moveToNext()){
//跳轉(zhuǎn)
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, "請(qǐng)輸入正確的用戶名和密碼", 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.個(gè)人頁面
private void initView() {
if (MyApplication.isLogin()) {
User user = MyApplication.getUser();
image.setImageResource(user.getHeadImage());
nickname.setText(user.getNickname());
username.setText("賬號(hào): " + 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());
}