订单管理系统
某购物商场,想做一个在线购物的程序,客户可以通过程序自助购物,要求有显示商品、选购商品、购物车、历史订单等功能。
学习目的
通过这个案例我们想到达的学习目的是 以下几点- -1.熟练使用BufferedReader和BufferedWriter读写数据
- -2.熟练使用ArrayList集合停止增、删、改、查等操作
- -3.理解面向对象和实际场景的结合使用
- -4.理解购物类项目的业务流程
复制代码 1. 需求分析
- 所有的商品信息以固定的格式(商品编号,商品名称,商品价格,商品库存)保管在product.txt文件中
- 格式如下:
- 001,小米手机,1999,10
- 002,华为手机,3999,10
- 003,乐事薯片,5,100
- 004,小米锅巴,5,200
- 005,格力空调,5000,5
- ...
- 1.显示商品功能:
- 读取product.txt文件,将每一行打印在控制台即可
- 2.选购商品功能:
- 键盘录入购置的商品编号和数量,将商品信息添加到购物车,并提示是否继续购置。
- 如下:
- 录入购置的商品编号:
- 001
- 录入购置的商品数量
- 5
- 已添加到购物车,是否继续购置(Y/N)?
- 选择Y: 继续购物
- 选择N: 完毕购物
- 3.购物车功能:
- 显示购物车中每个商品的名称,数量和金额,以及购物车总金额,并提示是否生成订单。
-
- 查看购物车格式如下:
- 商品名称:小米手机, 价格:1999, 数量:3, 金额:5997
- 商品名称:乐视薯片, 价格:5, 数量:3, 金额:15
- 总金额:6012元
- ---------------------------------------------
- 是否生成订单?(Y/N)
- 选择Y:
- 1)会有一个唯一的订单号,并且把订单的购物清单写到orderlist文件中
- 2)商品库存减少相应的数量
- 3)清空购物车
- 选择N: 什么都不做
-
- 4.历史订单功能:每一个订单信息,以如下格式保管到orderlist.txt文件中。
- 订单编号:92a9502f-cbd8-40f3-af1d-87a387a9fada
- 商品名称:小米手机, 价格:1999, 数量:3, 金额:5997
- 商品名称:乐视薯片, 价格:5, 数量:3, 金额:15
- 总金额:6012元
- ---------------------------------------------
- 订单编号:00785cce-394c-4788-9313-af5b3cd4a863
- 商品名称:小米手机, 价格:1999, 数量:3, 金额:5997
- 商品名称:乐视薯片, 价格:5, 数量:3, 金额:15
- 总金额:6012元
- ---------------------------------------------
复制代码 2. 准备数据
在Shopping模块目录下,新建一个product.txt文件。将以下商品信息复制到文件中。每一行从左往右分别表示商品编号、商品名称、商品价格、商品库存- 001,小米手机,1999,10002,华为电视,3999,10003,乐事薯片,5,100004,小米锅巴,5,200005,格力空调,5000,5006,海尔冰箱,2500,10007,公牛插座,50,250008,长虹电视,3500,200009,南孚电池,5,1000010,大桥鸡精,9000,100
复制代码 3. 功能菜单
- publicstaticvoidmain(String[] args)throws IOException {while(true){
- System.out.println("**************欢送来到黑马商城***************");
- System.out.println("1.查看商品 2.选购商品 3.我的购物车 4.我的订单");
- Scanner sc =newScanner(System.in);
- String choose = sc.next();switch(choose){case"1"://查看所有商品信息showAllProduct();break;case"2"://选购商品buyProduct(shoppingcart);break;case"3"://查看购物车showShoppingCart(shoppingcart);break;case"4"://查看订单showOrderList();break;default:
- System.out.println("你选择有误,请重新输入");}}}
复制代码 4. Product类
- publicclassProduct{private String id;//编号private String name;//名称privateint price;//单价privateint stock;//库存//自己补全get和set方法,以及构造方法...}
复制代码 5. 查看商品
- 查看商品的思路:
- 1.编写方法readProductToList(),读取所有的商品信息到集合
- 2.遍历集合中的所有数据,并打印输出
复制代码- - 使用BufferedReader读取product.txt文件
- - 使用把每一行使用","停止切割,得到一个字符串数组
- - 字符串数组中的元素分别表示:商品编号、商品名称、商品价格、商品库存
- 注意:其中商品的价格和库存需要转换为整数
- //如: 把"123"转换为123int price=Integer.parseInt("123");- 把商品信息封装为Product对象
- - 把对象存储到ArrayList集合中
复制代码- //读取文件到集合publicstatic ArrayList<Product>readProductToList()throws IOException {//创建流对象,关联day15/product.txt文件
- BufferedReader br =newBufferedReader(newFileReader("Shoppping/product.txt"));//创建集合,用于存储商品对象
- ArrayList<Product> list =newArrayList<>();//line用来记录读取的每一行
- String line;//读取readLine()方法返回null,则表示读取到文件末尾while((line = br.readLine())!= null){//对每一行使用","停止切割,得到一个数组
- String[] array = line.split(",");//数组中的元素分别表示:商品编号、商品名称、商品价格、商品库存
- String productId = array[0];//商品id
- String productName = array[1];//商品名称
- String productPrice = array[2];//商品价格
- String productStock = array[3];//商品库存//每一个元素封装为Product对象
- Product p =newProduct(productId, productName, Integer.parseInt(productPrice), Integer.parseInt(productStock));
- list.add(p);}//关闭流
- br.close();return list;}
复制代码- //显示所有商品privatestaticvoidshowAllProduct()throws IOException {//1.读取product.txt文件到集合
- ArrayList<Product> list =readProductToList();//2.打印集合
- System.out.println("id,名称,价格,库存");for(int i =0; i < list.size(); i++){
- Product p = list.get(i);
- System.out.println(p.getId()+","+ p.getName()+","+ p.getPrice()+","+ p.getStock());}}
复制代码 6. 选购商品
- 选购商品的思路:
- 1.键盘录入要选购的商品编号,假设不存在给出提示,并完毕选购;
- 2.键盘录入要选购的商品数量,假设库存缺乏给出提示,并完毕选购
- 3.假设商品编号正确、库存也足够,就将商品添加到购物车。
- 4.提示是否继续选购(Y/N),输入Y表示继续,N表示不继续。
复制代码根据id获取Product对象,没有获取到返回null
- //获取id对应的产品privatestatic Product getProductById(String productId)throws IOException {
- ArrayList<Product> list =readProductToList();for(int i =0; i < list.size(); i++){
- Product p = list.get(i);if(p.getId().equals(productId)){return list.get(i);}}return null;}
复制代码 每次选购一个商品,会在购物车中添加一个购物条目- publicclassBuyItem{private String id;private String name;privateint price;privateint number;privateint money;//get和set方法自动生成,以及构造方法}
复制代码- //购物车publicstatic ArrayList<BuyItem> shoppingcart =newArrayList<>();privatestaticvoidbuyProduct()throws IOException {//1.读取所有的商品信息
- ArrayList<Product> list =readProductToList();//2.键盘录入选购商品编号,判断商品编号是否存在
- Scanner sc =newScanner(System.in);while(true){
- System.out.println("键盘录入选购的商品编号:");
- String id = sc.next();//获取id对应的商品
- Product product =getProductById(list, id);if(product == null){
- System.out.println("选购的商品不存在");return;//完毕选购}//3.键盘录入选购商品数量,判断库存是否充足
- System.out.println("请录入选购的商品数量:");int number = sc.nextInt();//获取该商品的库存if(product.getStock()< number){
- System.out.println("商品库存缺乏,剩余库存为:"+ product.getStock());return;}//4.创建选购商品条目int money = number * product.getPrice();
- BuyItem item =newBuyItem(id, product.getName(), product.getPrice(), number, money);//5.将选购的商品条目添加到购物车
- shoppingcart.add(item);
- System.out.println("选购商品胜利,已将"+ product.getId()+"号商品添加到购物车");
- System.out.println("是否继续选购(Y/N)");
- String isContinue = sc.next();if(isContinue.equalsIgnoreCase("Y")){continue;//继续选购}else{
- System.out.println("已经完毕选购,请到购物车结算!");break;//完毕选购}}}
复制代码 7. 查看购物车
- 查看购物车思路:
- 1.遍历购物车集合,假设没有要给出提示
- 2.打印购物车商品信息
- 3.计算购物车总金额
- 4.是否生成订单(Y/N),Y表示生成订单;N表示不生成订单
- Y: 生成订单,并产生一个唯一的订单号,把购物车清空
- N: 不做任何处置
复制代码- privatestaticvoidshowShoppingCart()throws IOException {//判断购物车是否为空if(shoppingCart.isEmpty()){
- System.out.println("购物车什么都没有,选购商品后再来看看吧");return;}//打印购物车清单int totalMoney =0;for(int i =0; i < shoppingCart.size(); i++){
- BuyItem buyItem = shoppingCart.get(i);//打印清单信息//商品名称:小米手机, 价格:1999, 数量:3, 金额:5997
- System.out.println("商品名称"+ buyItem.getName()+","+"价格:"+ buyItem.getPrice()+","+"数量:"+ buyItem.getNumber()+","+"金额:"+ buyItem.getMoney());//计算购物清单总金额
- totalMoney += buyItem.getMoney();}
- System.out.println("总金额:"+ totalMoney);
- System.out.println("---------------------------------------------");
- System.out.println("是否生成订单?(Y/N)");
- Scanner sc =newScanner(System.in);
- String confirm = sc.next();//是否生成订单if(confirm.equalsIgnoreCase("y")){//生成订单
- Order order =createOrder(shoppingCart);//将订单写入到orderlist.txt文件中writeOrderToFile(order);//生成订单后,更新商品库存updateProductStock(order);//购物车清空
- shoppingCart.clear();}}
复制代码 8. 生成订单
- /*
- 订单类分析:
- 一个订单有一个唯一的订单编号
- 一个订单包含多选购的商品条目
- 一个订单有一个订单金额
- */publicclassOrder{private String orderId;//订单编号private ArrayList<BuyItem> list;//该订单选购的商品privateint money;//订单金额publicOrder(){}publicOrder(String orderId, ArrayList<BuyItem> list,int money){this.orderId = orderId;this.list = list;this.money=money;}//自动生成get和set方法,自己补全}
复制代码- //生成订单privatestatic Order createOrder()throws IOException {//创建订单
- Order order =newOrder();//设置订单ID
- order.setOrderId(UUID.randomUUID().toString());//设置订单商品列表
- order.setList(shoppingCart);//计算订单金额,购物车的所有商品的金额相加,就是订单金额int money=0;for(int i =0; i < shoppingCart.size(); i++){
- money+=shoppingCart.get(i).getMoney();}//设置订单金额
- order.setMoney(money);return order;}
复制代码 9. 订单写入到文件
- 订单编号:92a9502f-cbd8-40f3-af1d-87a387a9fada
- 商品名称:小米手机, 价格:1999, 数量:3, 金额:5997
- 商品名称:乐视薯片, 价格:5, 数量:3, 金额:15
- 总金额:6012元
- ---------------------------------------------
复制代码- //写入订单信息到文件privatestaticvoidwriteOrderToFile(Order order)throws IOException {//创建输出流对象
- BufferedWriter bw =newBufferedWriter(newFileWriter("Shoppping/orderlist.txt",true));
- bw.write("订单号:"+ order.getOrderId());
- bw.newLine();//获取订单商品条目
- ArrayList<BuyItem> list = order.getList();for(int i =0; i < list.size(); i++){
- BuyItem buyItem = list.get(i);
- bw.write("商品名称:"+ buyItem.getName()+","+"价格:"+ buyItem.getPrice()+","+"数量:"+ buyItem.getNumber()+","+"金额:"+ buyItem.getMoney());
- bw.newLine();}
- bw.write("订单金额:"+ order.getMoney());
- bw.newLine();
- bw.write("---------------------------------------------");
- bw.newLine();
- bw.close();}
复制代码 10. 更新库存
- //更新商品库存privatestaticvoidupdateProductStock(Order order)throws IOException {//获取订单中购置的产品条目
- ArrayList<BuyItem> orderItems = order.getList();//获取所有的产品
- ArrayList<Product> allProducts =readProductToList();//订单中每一个商品的库存for(int i =0; i < orderItems.size(); i++){
- BuyItem buyItem = orderItems.get(i);//根据id获取产品for(int j =0; j < allProducts.size(); j++){
- Product product = allProducts.get(j);if(buyItem.getId().equals(product.getId())){
- product.setStock(product.getStock()- buyItem.getNumber());}}}//重新把产品信息写到product.txt文件中writeProductToFile(allProducts);}
复制代码- //重新写入产品信息到文件privatestaticvoidwriteProductToFile(ArrayList<Product> allProducts)throws IOException {
- BufferedWriter bw =newBufferedWriter(newFileWriter("Shoppping/product.txt"));for(int i =0; i < allProducts.size(); i++){
- Product product = allProducts.get(i);
- bw.write(product.getId()+","+ product.getName()+","+ product.getPrice()+","+ product.getStock());
- bw.newLine();}
- bw.close();}
复制代码 11.查看订单
- //查看订单privatestaticvoidshowOrderList()throws IOException {
- BufferedReader br=newBufferedReader(newFileReader("Shopping/orderlist.txt"));
- String line;while((line=br.readLine())!=null){
- System.out.println(line);}
- br.close();}
复制代码 |