“生鲜蔬”APP的设计与实现
1.引言
在這個科技與網絡齊頭并進的時代,外賣服務正在飛速發展,人們對外賣APP系統功能需求越來越多,開發APP的人員對自己的要求也要越來越高,要從所做APP外賣系統所實現的功能和用戶的需求來對系統進行設計,還需要與當下所飛速發展的網絡相結合來設計,讓用戶使用方便。所以在當今網絡快速發展的環境下開發一個專為農民售賣蔬菜水果的APP會有很好的發展空間,而且如今外賣APP層出不窮,市面上的外賣APP加上小程序內的就已經上千不止,大型的外賣APP在全國的范圍內大約有1億多人在使用,年輕人占比超過50%,年輕人是最活躍的群體。在學校內也有著各種外賣小程序,經過一段時間的調查,使用率也是非常高,幾乎每個學生都使用過。所以開發一個蔬菜類的外賣APP,很多人都會很快上手,即使是老年人,通過讓自己的子女教學之后,也可以很快上手,而使用簡單又功能齊全這也是對開發生鮮蔬APP的一種挑戰。
整個APP系統主要功能的實現和后期系統的維護,需要結合用戶的實際需求來設計出一個專門售賣蔬菜的APP。此APP系統的設計需要滿足操作簡單的特點。在如今網絡快速發展的當下,網絡帶來的便捷被很多人喜歡,例如現在市場上存在的外賣APP,人們使用的越來越多,發展前景非常好。而且生鮮蔬APP的開發還可以讓很多無業的人去進行配送,可以解決一部分就業問題,商家可以選擇自己配送,雇人配送。利用本APP系統解決了最初目的以外的就業問題。所以,對于這個生鮮蔬APP外賣系統來說,它非常符合需求,很符合當下網絡快速發展的世界。
2.開發技術
2.1 Java語言
Java語言由Sun發布。具有公開源碼的優點。這一優點讓世界各地的編程愛好者對其產生了很大的興趣。Java語言具有很多特性,與其它語言有很大的不同,具體如下:
(1)平臺無關:在編寫出代碼之后,不止可以運行在編寫時所用的平臺上面,即使切換到其他平臺,只要在新的系統中下載官網的編譯環境,就可以同樣執行。
(2)面向對象:面向對象的解決問題思路相比于面向過程,它在編寫代碼初期可能會麻煩但是在后期效率會成倍的提升。
(3)源代碼開源:在編寫Java程序的時候,有時會用到一些比較深的代碼,就可以直接去查看源碼,再去官網尋找相應的中文解釋,就可以很好地理解原理,對其進行使用。
(4)代碼簡單:學習Java語言,只要你自己系統的學習過一門語言,再學習的時候,就會很快的上手,其編寫格式大致相同。即使沒有學習過,對比其他語言來說,也是可以相對很快的上手。
其中面向對象,可以很方便的幫助們解決一些生活中的實際問題[2]。跨平臺性也很實用。在各個操作系統中都可以運行。Java技術它還是一門容易讓人學會和使用的一門服務器語言,可以使用它去鏈接市面上大部分的服務器進行后臺的編寫。
2.2 Node.js和JavaScript
Node.js不是編程語言,是一個平臺,Node.js讓JavaScript出現在后端成為了可能,可以在服務端單獨執行。它的學習曲線非常簡單,經過簡單的學習就可以入門,對其進行簡單使用。
JavaScript不是編程語言,是腳本語言,是web開發人員使用最多的語言之一它需要一個運行環境。在Node.js出現之前,JavaScript只可以在瀏覽器上面運行,Node.js出現之后多了一個新的可以運行的環境,Node.js平臺。
2.3?SQLite數據庫
SQLite不僅具有嵌入式特點還有輕型的特點。占用空間少。在很多主流的系統中都可以進行使用,還可以與很多的語言進行結合。由于擁有占用內存小的優點,處理速度也比一般的數據庫系統快,與之相對應的是,不可以進行大量數據的存儲。
3.功能設計
3.1 總體設計思想
本系統起初開發目標是為售賣蔬菜不方便的農戶開發一個專用APP來進行售賣,并且要易于他們的使用,經過分析之后,不僅可以對蔬菜等進行售賣,還可以對水果等等,農產品。通過本APP農戶們可以不用每天帶著自己的菜品去集市去售賣,只需在家里就可以進行售賣。
本APP系統設計是從數據分析開始的,分析完成之后進行具體的代碼編寫,從一個登錄界面的布局開始,然后是注冊界面,APP主界面,商品列表界面,個人中心界面,將這些界面代碼分成各個布局文件裝在layout文件夾中。對其中需要用到的圖片等信息在網絡上進行搜集,導入drawable中,然后在Activity文件夾中,先定義一些各個布局文件的變量,再對各個布局文件進行獲取。對于店鋪信息和商品信息則是,通過后天的Node.js運行所編寫的js代碼,在dos命令窗口執行對應的文件,在Java代碼內對其中的內容進行獲取,最后導入到相應的布局文件。然后對模塊進行相應功能的編寫,然后將各個獨立的頁面再進行聲明,連接在一起,最后將整個程序的入口代碼,寫在登錄界面的代碼中,就可以將各個模塊連接在一起,形成一個完整的APP系統。
3.2 功能模塊結構圖
(1)用戶登錄:點擊APP圖標進入登錄界面,沒有賬號的話,可以進行注冊,還有記住密碼,自動登錄的功能。
(2)店鋪頁面以及個人中心:登錄成功之后可以看到正在售賣的貨品的店鋪,還可以點擊個人中心圖標,修改個人信息。
(3)貨品列表和詳情:點擊列表中的店鋪可以看到店鋪內正在出售的商品,可以對店鋪內中意的貨品進行購買,點擊相應的貨品會看到商品詳情。
(4)購物車以及進行支付:點擊購買之后會自動放入購物車,挑選完成之后進行支付結算系統結構如圖。
4.功能效果圖
4.1 登錄界面
點擊圖標進入登錄界面,可以通過點擊登陸下方的文字,注冊之后點擊返回進行登錄,登錄之后可以看到正在出售商品的店鋪列表,如圖所示。
?4.2 系統主界面
用戶進入APP,登錄成功之后,可以直觀看到正在售賣的菜品以及水果的店鋪,挑選自己心儀的店鋪,如圖所示。
4.3?商品列表界面
點擊所想進入的店鋪之后,會看到店鋪內正在出售的菜品以及水果,然后對其進行添加購物車,點擊所想買的商品之后,會出來商品的詳情介紹,介紹商品的具體信息,如圖所示。
4.4 購物車界面
?把需要的商品添加到購物車,接著輸入收貨地址,然后進行支付,修改等選擇,點擊支付會彈出一個支付窗口顯示出對應店鋪的收款碼,如圖所示。
?
?4.5 個人中心及修改界面
個人中心可以顯示頭像,賬號,出生日期,個人簽名,常用地址,點擊編輯資料,您可以更改帳號以外的信息,如圖所示。
?
5.核心代碼
public final class BuildConfig {public static final boolean DEBUG = Boolean.parseBoolean("true");public static final String APPLICATION_ID = "com.example.biyesheji";public static final String BUILD_TYPE = "debug";public static final int VERSION_CODE = 1;public static final String VERSION_NAME = "1.0"; } public class MainActivity extends AppCompatActivity {private RelativeLayout rlTitleBar;private TextView tvTitle;private ListView lvShopList;private ShopAdapter adapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();initData();}private void initView(){rlTitleBar = findViewById(R.id.rl_title_bar);tvTitle=findViewById(R.id.tv_title);lvShopList=findViewById(R.id.lv_shop_list);adapter =new ShopAdapter(this);lvShopList.setAdapter(adapter);tvTitle.setText("店鋪");rlTitleBar.setBackgroundColor(getResources().getColor(R.color.blue_color));}private void initData(){OkHttpClient client=new OkHttpClient();Request request=new Request.Builder().url(Constants.WEB_SITE+Constants.REQUEST_SHOP_DATA).build();Call call=client.newCall(request);call.enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {}@Overridepublic void onResponse(Call call, Response response) throws IOException {String json=response.body().string();Log.d("mzxy","json"+json);List<ShopBean> list= JsonParse.getInstance().getShopList(json);runOnUiThread(new Runnable() {@Overridepublic void run() {adapter.setData(list);}});}});} } public class ShopDetailAcitivity extends AppCompatActivity implements View.OnClickListener {private TextView tvShopName,tvTime,tvNotice,tvTile;private ImageView ivShopPic,ivBack;private ShopBean bean;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);//綁定布局文件,把布局文件當作我們這個activity的界面setContentView(R.layout.acitivity_shop_detail);bean= (ShopBean) getIntent().getSerializableExtra("shop");if(bean==null){return;}initView();setData();}private void setData() {tvShopName.setText(bean.getShopName());tvTime.setText(bean.getTime());tvNotice.setText(bean.getShopNotice());Glide.with(this).load(bean.getShopPic()).error(R.mipmap.ic_launcher).into(ivShopPic);}private void initView() {tvShopName=findViewById(R.id.tv_shop_name);tvTime=findViewById(R.id.tv_time);tvNotice=findViewById(R.id.tv_notice);tvTile=findViewById(R.id.tv_title);ivShopPic=findViewById(R.id.iv_shop_pic);ivBack=findViewById(R.id.iv_back);tvTile.setText("店鋪詳情");ivBack.setVisibility(View.VISIBLE);ivBack.setOnClickListener(this);}@Overridepublic void onClick(View view) {switch (view.getId()){case R.id.iv_back:finish();break;}} } public class ShopAdapter extends BaseAdapter {private Context context;private List<ShopBean> data=new ArrayList<>();public ShopAdapter(Context context) {this.context = context;}public void setData(List<ShopBean> data) {this.data.clear();this.data.addAll(data); //我們不能改變this.data的地址,否則會導致無法刷新數據 // 數據有變化,要讓我們的數據進行刷新notifyDataSetChanged();}@Overridepublic int getCount() {return data.size();}@Overridepublic Object getItem(int position) {return data.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder viewHolder=null;if(convertView==null){convertView= LayoutInflater.from(context).inflate(R.layout.shop_item,null);viewHolder=new ViewHolder();viewHolder.tvOfferPrice=convertView.findViewById(R.id.tv_offer_price);viewHolder.tvShopName=convertView.findViewById(R.id.tv_shop_name);viewHolder.tvSaleNum=convertView.findViewById(R.id.tv_sale_num);viewHolder.tvWelfare=convertView.findViewById(R.id.tv_welfare);viewHolder.tvTime=convertView.findViewById(R.id.tv_time);viewHolder.ivShopPic=convertView.findViewById(R.id.iv_shop_pic);convertView.setTag(viewHolder);}else{viewHolder=(ViewHolder) convertView.getTag();}ShopBean shopBean=data.get(position);Glide.with(context).load(shopBean.getShopPic()).error(R.mipmap.ic_launcher).into(viewHolder.ivShopPic);viewHolder.tvTime.setText(shopBean.getTime());viewHolder.tvWelfare.setText(shopBean.getWelfare());viewHolder.tvSaleNum.setText("月售"+shopBean.getSaleNum());viewHolder.tvShopName.setText(shopBean.getShopName());viewHolder.tvOfferPrice.setText("起送"+shopBean.getOfferPrice()+"元,配送"+shopBean.getDistributionCost()+"元");convertView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Intent intent=new Intent(context, ShopDetailAcitivity.class);intent.putExtra("shop",shopBean);context.startActivity(intent);}});return convertView;}class ViewHolder{TextView tvShopName,tvSaleNum,tvOfferPrice,tvWelfare,tvTime;ImageView ivShopPic;} } public class FoodBean implements Serializable{private String foodId;private String foodName;private String taste;private String saleNum;private BigDecimal price;private int count;private String foodPic;public String getFoodId() {return foodId;}public void setFoodId(String foodId) {this.foodId = foodId;}public String getFoodName() {return foodName;}public void setFoodName(String foodName) {this.foodName = foodName;}public String getTaste() {return taste;}public void setTaste(String taste) {this.taste = taste;}public String getSaleNum() {return saleNum;}public void setSaleNum(String saleNum) {this.saleNum = saleNum;}public BigDecimal getPrice() {return price;}public void setPrice(BigDecimal price) {this.price = price;}public Integer getCount() {return count;}public void setCount(Integer count) {this.count = count;}public String getFoodPic() {return foodPic;}public void setFoodPic(String foodPic) {this.foodPic = foodPic;} } public class ShopBean implements Serializable {private Integer id;private String shopName;private int saleNum;private BigDecimal offerPrice;private int distributionCost;private String welfare;private String time;private String shopPic;private String shopNotice;private List<FoodBean> foodList;public List<FoodBean> getFoodList() {return foodList;}public void setFoodList(List<FoodBean> foodList) {this.foodList = foodList;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getShopName() {return shopName;}public void setShopName(String shopName) {this.shopName = shopName;}public Integer getSaleNum() {return saleNum;}public void setSaleNum(Integer saleNum) {this.saleNum = saleNum;}public BigDecimalgetOfferPrice() {return offerPrice;}public void setOfferPrice(BigDecimal offerPrice) {this.offerPrice = offerPrice;}public Integer getDistributionCost() {return distributionCost;}public void setDistributionCost(Integer distributionCost) {this.distributionCost = distributionCost;}public String getWelfare() {return welfare;}public void setWelfare(String welfare) {this.welfare = welfare;}public String getTime() {return time;}public void setTime(String time) {this.time = time;}public String getShopPic() {return shopPic;}public void setShopPic(String shopPic) {this.shopPic = shopPic;}public String getShopNotice() {return shopNotice;}public void setShopNotice(String shopNotice) {this.shopNotice = shopNotice;}} public class ShopListView extends ListView {public ShopListView(Context context) {super(context);}public ShopListView(Context context, AttributeSet attrs) {super(context, attrs);}public ShopListView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {int heightSpec=MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE>>2,MeasureSpec.AT_MOST); //view是用30位進行存儲,那么我們應該給他30位的最大值,Int的最大值是32位,super.onMeasure(widthMeasureSpec, heightSpec);} }6.參考論文
目錄
1引言
1.1課題背景
1.2研究現狀
1.3研究內容
2開發環境
2.1 Java語言介紹
2.2 Node.js與JavaScript介紹
2.3 SQLite數據庫介紹
3系統分析
3.1可行性分析
3.1.1經濟可行性
3.1.2技術可行性
3.1.3操作可行性
3.2 性能需求分析
3.3設計流程分析
4系統設計
4.1系統總體設計思想
4.2系統功能模塊結構圖以及介紹
4.3數據庫設計
5系統功能實現
5.1登陸界面
5.2系統主界面
5.3商品列表界面
5.4購物車界面
5.5個人中心以及修改資料界面
6 APP測試
6.1程序測試
6.2測試具體分析
6.3測試結論
6.4 APP后續展望
結論
參考文獻
7.總結
生鮮蔬APP系統的實現過程中,最常用的技術是Java,JavaScript語言,數據庫是帶SQList數據庫的Android Studio,服務端使用的是Node.js。在測試完成并進行相應不足之處的修改之后,生鮮蔬APP可以完美地運行。用戶通過注冊帳號之后返回登錄界面,登錄進入APP之后對自己所需要的商品添加購物車,然后支付。
在整個生鮮蔬APP開發過程中,大部分內容是自己完成,在遇到問題的時候去請教了同學,和在網上查閱相關資料和例子。最終完成了生鮮蔬APP的設計,整個開發過程讓收獲了許多有用的東西。
在此之前對于的APP并沒有進行過什么深度理解,所以在一開始遇到了一些難題,例如購物車就是在整個研發過程當中所面臨的最大問題,一開始實現時只是完成了界面,但對于添加或者刪除的功能卻存在著很多的問題,這個問題是一大難題,其中涉及到算法,界面交互等,但最終通過同學和查閱網上資料解決了。在解決這個最大的問題之后,心里感覺很開心,增加了自信,在以后遇到難題的時候有信心去克服。在完成畢業設計的過程中學到了,在書本上學到的東西是遠遠不夠的。要想真正的從事這一行業,就必須多上手實操付諸實踐。經過在實踐中的磨練,才可以真正懂得理論,才會真正的掌握書本上的知識。經歷畢業設計過后,發覺自己學到不只有專業知識,還有將實踐與理論相結合的方法,在這整個的設計過程中,其中更多的是遇到困難永不后退的態度。
總結
以上是生活随笔為你收集整理的“生鲜蔬”APP的设计与实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2021Java开发面试解答:靠这份Ja
- 下一篇: 《重学Java系列》之 泛型(上)