0. 人员分工

任务 姓名
编码规范、前期调查与功能设计、面向对象设计 余智康
代码检查,功能矫正,博客制作 喻文康

1. 前期调查

购物车程序的面向对象设计_i++

购物车程序的面向对象设计_git_02

根据在京东商城的体验和调查,列出个人观点:商品应有对应的全部商品的列表或清单,供顾客挑选
以及记录商品剩余量(即确认是否缺货),购物车用于存放用户选择的所有商品信息,包含商品名称
数量价格(单类商品价格和购物车所有商品总价格)等等。

2. 系统功能结构图

系统结构及功能脑图描述

3. 系统描述

4. UML类图

购物车程序的面向对象设计_2d_03
购物车程序的面向对象设计_系统功能_04
购物车程序的面向对象设计_java_05

5. 项目包结构与关键代码

系统菜单:

package Page;
import java.util.Scanner;

import Item.ItemsList;
import Item.ShopCart;

public class Menu {
	public static void begin(ItemsList itemsList, ShopCart cart) {		
		Scanner sc = new Scanner(System.in);
		
		while(true) {
			System.out.println("欢迎使用购物车系统(0.1版)!");
			System.out.println("-----1.进入商品选购页面------");
			System.out.println("-----2.进入“购物车”页面------");
			System.out.println("-----3.退出-----------------");
			System.out.print("请输入你的选择(1或2或3): ");
			String chose = sc.next();
			switch (chose) {
			case "1":
				SelectPage.shopWindow(itemsList, cart);
				break;

			case "2":
				CartPage.cartWindow(itemsList, cart);
				break;
			
			case "3":
				sc.close();
				System.out.println("欢迎下次再来!");
				System.exit(0);
				break;
				
			default:
				System.out.println("\n输出错了!请输入数字 1 或 2 或 3");
				System.out.print("请输入你的选择(1或2或3): ");
				break;
			}
		}
	}
}

购物车:

package Item;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class ShopCart {
	Map<Integer,Integer> shopCart = new HashMap<Integer, Integer>();	
	List<Integer> itemsShop = new ArrayList<>();
	
	public int getNumber(int id) {
		return shopCart.get(id);
	}
	
	public int calculatePrice(ItemsList itemsList) {
		int sum = 0;
		for(int i=0; i<itemsShop.size(); i++) {
			int id = itemsShop.get(i);
			sum += shopCart.get(id) *  itemsList.getPrice(id);
		}
		return sum;
	}
	
	public void putItems(int id, int number, ItemsList itemsList) {
		if(itemsShop.contains(id)) {	//存在 数量增加
			int old = shopCart.get(id);
			shopCart.put(id, old+number);
		}
		else {		
			itemsShop.add(id);
			shopCart.put(id, number);
		}
		
		int stock = itemsList.getStoke(id) - number;
		itemsList.setStoke(id, stock);
	}
	
	//扩展:可以在购物车里面没有东西的时候,输出“购物车是空的,快去选择心仪的物品吧!”之类的。实现进一步的交互
	public void showCart(ItemsList itemsList) {
		System.out.println("       商品ID       商品名称            单价           个数");
		for(int i=0; i<itemsShop.size(); i++) {
			int id = itemsShop.get(i);
			System.out.printf("%12d %12s %12s元 %12s个\n", id, itemsList.getName(id), itemsList.getPrice(id), shopCart.get(id));
		}
	}
}

商品选择功能:

package Page;
import java.util.Scanner;

import Item.Items;
import Item.ItemsList;
import Item.Protect;
import Item.ShopCart;

public class SelectPage {
	public static void shopWindow(ItemsList itemsList, ShopCart cart) {
		String choose = new String();
		Scanner sc = new Scanner(System.in);
		System.out.println("正在导入目前已有的商品信息...");
		
		System.out.println("导入完毕!");
		//System.out.println("若要输入新的商品信息,请输入 Y  ;若不需要录入新的信息,请输入 N。");
		//System.out.print("(选N选N,录入的代码还没写0.0)您的选择:");
		//choose = sc.next();
		choose = "N";
		if(choose.equals("Y")) {
			System.out.println("输入格式如:悠悠球 15 火力店 2021/10/06");
			System.out.println("请开始输入:");
		}
		
		Items item = new Items();
		
		choose = "N";
		int id, number;
		String str = new String();
		while(!(choose.equals("Y")||(choose.equals("y")))) {
			SelectPage.showItems(itemsList);
			System.out.print("购物车(“ 请输入某一件商品的ID ”):");
			
			str = sc.next();
			while(!Protect.isLegal(str, 0, item.getCount())) {
				System.out.printf("\n抱歉,你输入有误,请输入范围 0 到 %d 的商品数字ID!\n",item.getCount()-1);
				System.out.print("购物车(“ 输入某一件商品的ID ”):");
				str = sc.next();
				//System.out.print(str);
			}
			id = Integer.parseInt(str);
			
			System.out.println();
			System.out.printf("你的选择是%s,请选择想要的数量:",itemsList.getName(id));		
			str = sc.next();
			while(!Protect.isLegal(str, 0, itemsList.getStoke(id))) {
				System.out.printf("\n抱歉,你输入有误,请输入范围 0 到 %d 的商品个数!\n",itemsList.getStoke(id));
				System.out.printf("你需要多少个%s: ",itemsList.getName(id));
				str = sc.next();
			}
			number = Integer.parseInt(str);
			
			cart.putItems(id, number, itemsList);
			
			System.out.println();
			System.out.print("\n若要展示当前购物车内的商品,请输入 Y , 否则输入其它任意键继续购物:");
			if((choose = sc.next()).equals("Y") || choose.equals("y"))
				cart.showCart(itemsList);
			System.out.print("\n输入Y,则停止购物返回主菜单;否则输入任意键继续购物:");
			choose = sc.next();
		}	
		System.out.println("\n欢迎下次再使用我们的购物系统!");
		//sc.close();
	}
	
	public static void showItems(ItemsList itemsList) {
		System.out.println("接下来将展示可供选择的商品:");
		Items item = new Items();
		System.out.println("        商品ID       商品名称         商品价格         店铺         生产日期           库存");
		for(int i=0; i<item.getCount(); i++) {
			System.out.printf("%12d %12s %12s元 %12s %16s %12d\n",i ,itemsList.getName(i), itemsList.getPrice(i), itemsList.getStore(i), itemsList.getDateMake(i), itemsList.getStoke(i));
		}
		System.out.println("来吧!正在进入选购操作,你将可以挑选你喜欢的商品!(注意:输入时请输入商品ID)");
	}
}

购物车编辑页面:

package Page;
import java.util.Scanner;

import Item.ItemsList;
import Item.Protect;
import Item.ShopCart;

public class CartPage {
	public static void cartWindow(ItemsList itemsList, ShopCart cart) {
		Scanner sc = new Scanner(System.in);
		String chose = new String();
		String str = new String();
		String stop = new String();
		int id;
		cart.showCart(itemsList);
		
		while(true) {
			System.out.println("以下是对购物车商品的操作:");
			System.out.println("----1.输入 D 进行删除购物车商品操作");
			System.out.println("----2.输入 M 进行添加已有商品的个数");
			System.out.println("----3.输入 C 计算购物车里全部商品总价");
			System.out.println("----4.输入 R 返回主菜单");
			
			chose = sc.next();
			switch (chose) {

			case "D" :
			case "M" :
				String strDM = new String();
				int change = 1;	//删除是变为 -1, 添加时为 1;
				if(chose.equals("D")) {
					change = -1;
					strDM = "删除";
				}
				if(chose.equals("M")) {
					change = 1;
					strDM = "添加";
				}
					
				
				String mChose = new String();
				mChose = "N";
				while(!mChose.equals("Y")) {
					cart.showCart(itemsList);
					System.out.print("请输入要选择的商品的ID:(只能选择在购物车中出现的ID)");	
					str = sc.next();
					
					while(!Protect.isLegal(str, cart)) {
						System.out.println("你的输入有误!请输入正确的ID!(只能选择在购物车中出现的ID)");
						System.out.print("请输入要选择的商品的ID:");
						str = sc.next();
					}	
					id = Integer.parseInt(str);
					
					System.out.printf("要%s多少个%s呢?  ",strDM ,itemsList.getName(id)); //
					
					str = sc.next();					
					if(chose.equals("M"))
						while(!Protect.isLegal(str, itemsList.getStoke(id))) {
							System.out.printf("你的输入有误!请输入范围从0到%d之间的数字\n",itemsList.getStoke(id));
							System.out.printf("请输入要添加的%s的数量:",itemsList.getName(id));
							str = sc.next();
						}
					if(chose.equals("D"))
						while(!Protect.isLegal(str, cart.getNumber(id))) {
							System.out.printf("你的输入有误!请输入范围从0到%d之间的数字\n",cart.getNumber(id));
							System.out.printf("请输入要删除的%s的数量:",itemsList.getName(id));
							str = sc.next();
						}
					
					int number = Integer.parseInt(str);
					System.out.printf("\n确定要%s%d个%s吗? ", strDM, number, itemsList.getName(id)); //库存
					
					System.out.printf("\n输入 Y 确定%s,其它键取消\n",strDM);
					
					String flag = sc.next();
					if(flag.equals("Y")) {	
						cart.putItems(id, number * change, itemsList);
						System.out.printf("%s成功!\n", strDM);
					}
					else {
						System.out.printf("%s失败!\n", strDM);
					}		
					
					System.out.printf("输入 Y 确定结束%s,其它键继续操作!\n",strDM);
					mChose = sc.next();
				}		
				break;
				
			case "C":
				System.out.printf("\n你的购物车里所有商品的总价为 %d元 \n", cart.calculatePrice(itemsList));
				System.out.println("输入任意键继续!");
				stop = sc.next();
				break;
				
			case "R":
				return;
				
			default:
				System.out.println("\n输出错了!请输入字符 D 或 M 或 C 或 R");
				System.out.print("请输入你的选择: ");
				break;
			}
		}
	}
}

输入合法检测功能:

package Item;

public class Protect {
	private static boolean isDigit(String str){
		char[] cList = str.toCharArray();
		for (char c : cList) {
			if(!Character.isDigit(c)) {
				return false;
			}
		}
		return true;
	}
	
	private static boolean isExtent(int low, int high, int number) {
		if(number > high)
			return false;
		if(number < low)
			return false;
		
		return true;
	}
	
	//输入str,检查是否合法
	public static boolean isLegal(String str, int low, int high) {
		if(!Protect.isDigit(str)) 
			return false;
		
		Integer number = Integer.parseInt(str);
		if(!Protect.isExtent( low, high, number))
			return false;
			
		return true;
	}
	
	public static boolean isLegal(String str, ShopCart cart) {	//判断ID是否存在在购物车中
		if(!Protect.isDigit(str))
			return false;
		
		for(int i=0; i<cart.itemsShop.size(); i++) {
			int id = cart.itemsShop.get(i);
			if(Integer.parseInt(str) == id)
				return true;
		}
		return false;
	}
	
	public static boolean isLegal(String str, int stock) {
		if(!Protect.isDigit(str))
			return false;
		
		if(Integer.parseInt(str) > stock)
			return false;
		
		return true;
	}
}