超市1.3
前面已经写了一个超市1.0,所以有些知识不在重复,其实1.3版本跟1.0没有太大区别,主要是多了一些逻辑以及根据生活多了一点功能选择。但是也还是未用到封装。
思路
-
有了前面的经验,我们发现虽然能够购买东西,但是我们根本不能登录账号,那我们定义账号的目的有什么用那?所以在这里我们用User类来表示用户,而name表示用户的账户,再定义个pwd表示用户的密码。让我们可以注册账户
-
虽然定义了用户的账户,但是转念又一想,既然有用户,为什么没有管理员呐?上次我们定义的数组就是为了能让管理员能把产品输入进去,而上一次为了简化程序没有直接给加进去,这一次我们就定义个管理员用来进行添加产品,修改产品。
-
而定义了管理员,那管理员进入的页面肯定跟用户进入的页面不同,管理员肯定是进入后台页面,而用户进入商品页面。所以我们需要一个变量来判断是管理员还是用户。所以我们在注册的时候就直接根据选择将变量赋值为1或者2,选择用户注册时就可以将标志位type设为1,当登录时type=1进入用户界面,其他情况为管理员。
-
交代完用户和管理员之后我们就可以进行用户和管理员界面的编写。
过程
-
理清思路之后,我们就开始一步步的编写,首先在这个超市系统中我们首先要存放的有两个,一个是用户信息,一个是产品信息。所以我们先写一个类用来存产品的属性,在定义一个类存放用户的属性。
-
产品中我们存放一个价格,名称,库存,序号。这里也可以加上成本。用来计算超市的利润,也可以不加,看个人喜好。
public class Product { int price ; //价格 String name; //名称 int serNum; //序号 int kuc; //库存 int cost; //成本 }
-
定义完产品之后还要定义用户这个类,用户里边的属性可以有用户名,密码,余额,是否是管理员,以及可以加入一个VIP,如果想成为vip只需要在界面充值,然后将标志位设为1即可。
public class User { String name; //存放用户名 String pwd; //存放密码 int type; //用户1 或者管理员 2 int vip; //0不是,1是 double money; //用户余额 }
-
对于顾客,还有一个想法就是我们每次去买东西时,会有一个账单,所以我们还需要在创建一个类用来存放账单。账单里边会显示消费金额,所以我们要定义一个totalMoney用来表示消费金额,为什么要用double类型呐?因为我们加入了VIP这个选项,我们给VIP的特殊待遇就是打折,当然每个人的想法不同,也可以给VIP施行满减,比如满一百减十元。这里我们就用打折代替了。
public class Order { double totalMoney; //价格 User user; //用户 Product product; //产品 int sales; //销量 }
-
因为我们订单要根据用户的余额以及是否是VIP来进行totalMoney的改变,所以我们需要将User也定义到Order类中。同样,我们还需要根据产品进行账单的输出,所以还需要把产品加入。
-
定义完用到的类之后,我们就要开始写方法了,所以我们再建一个Shoping类用来存放各种方法。
-
写方法我们就需要想到要先写什么后写什么,不可能写完购买页面之后再写注册页面。根据常识,进入网上购物,一般会先注册账号或者直接登录账号。登录完账号之后再进行相应的选择,比如你是管理员的话就让你进入管理员界面,是用户的话就进入用户界面,所以这时候我们要先写一个初始选择界面。
/** * 进入主页面 */ /** * 初始页面,可以进行选择登录或者注册 */ public void sp(){ System.out.println("***欢迎来到超市***"); System.out.println("输入1 代表登录,输入2 代表注册 输入其他代表退出"); int n = scanner.nextInt(); switch(n){ case 1:{ //用户登录 userLogIn(); if(USER.type==1){ //用户界面 shopUser(); }else { //管理员界面 admPage(); sp(); } break; } case 2:{ //用户注册 register(); sp(); } default:{ System.out.println("退出超市"); } } }
-
首先进入选择,如果注册的话会跳到注册页面,如果是登录的话会根据注册时的type标志位进行判断是用户还是管理员。写完初始页面之后我们就要开始写注册页面,毕竟先注册才能登录。
/** * 注册页面 */ /** * 分为管理员注册和用户注册。 * 输入账号密码后会判断账号名是否重复,重复会让重新注册 * 不重复会让再输一次密码,然后密码都相同会注册成功 * 在注册时根据用户选择直接分为管理员和用户,用标志位type判断 */ public void register(){ User user =new User(); System.out.println("****欢迎来到注册页面****"); System.out.println("请选择你是管理员注册还是用户注册"); System.out.println("输入1代表用户注册,输入2代表管理员注册"); user.type = scanner.nextInt(); //判断是用户还是管理员 System.out.println("请输入账户名称"); user.name = scanner.next(); System.out.println("请输入账户密码"); user.pwd = scanner.next(); boolean flag =true; boolean choose =true; //判断用户名没有被使用过 for(int j=0;j<=users.length-1;j++){ if(users[j]!=null&&users[j].name.equals(user.name)){ choose =false; System.out.println("此用户名已被注册,请重新注册:"); register(); } } //用户名没有被注册时执行 if(choose){ System.out.println("请再次输入密码保证密码不是误输"); //验证密码正确 String pwd =scanner.next(); if(pwd.equals(user.pwd)){ for(int i=0;i<=users.length-1;i++){ if(users[i]==null){ users[i]=user; // USER=users[i]; flag =false; System.out.println("用户注册成功!"); break; } } }else{ System.out.println("两次密码不一致,请重新注册"); register(); } if(flag){ System.out.println("用户已注册满,无法添加"); } } }
-
再注册界面会进行选择是用户还是管理员,根据输入将标志位进行更新。印象中我们输入的账号是不能跟别人一样的,所以我们可以在输入账号之后将数组遍历一遍,以保证用户名不重复,而我们在网上注册时会发现网上会让你输入两次密码以保证密码的准确性,这里我们也加上。其实也很简单,只需要将第一次输入的账号跟第二次输入的账号利用equals进行判断即可。
-
注册完之后我们就可以进行登录,这时我们就可以写登录界面的方法了。
/** * 登录界面 */ /** * 管理员和用户统一一个登录界面,判断密码正确然后成功登录 */ public void userLogIn(){ System.out.println("请输入用户账号"); String name = scanner.next(); System.out.println("请输入用户密码"); String pwd = scanner.next(); //遍历 boolean falg =true; for(int i =0;i<=users.length-1;i++){ if(users[i]!=null){ //判断用户账户密码是否正确 if(name.equals(users[i].name)&&pwd.equals(users[i].pwd)){ System.out.println("登录成功!"); USER=users[i]; falg =false; break; } } } if(falg){ System.out.println("用户名或者密码错误!"); USER = null; } }
-
登录界面就跟上个版本一样进行判断即可,为了满足能有好多用户,所以我们在开头定义一个User类型的数组,以及为了有许多账单,定义一个Order类型的数组,还有Product类型的数组。然后可能就又有人问为什么冒出来一个USER,这个是为了让我们只能让用户在自己账户上进行购物,即定义一个全局变量User USER; 每次都对USER进行操作,就不会付钱的时候用户A花的是用户B的钱。
User USER; Product [] products = new Product[10]; User [] users = new User[10]; Order [] orders=new Order[10];
-
登录页面写好之后,我们就可以添加功能了,比如购买,查看账单。因为我们需要管理员手动添加,所以我们先写管理员界面。
/** * 管理员页面 */ /** * 管理员登录后,进入管理员界面。然后通过选择每个选项调用方法 */ public void admPage(){ // Product product = new Product(); System.out.println("欢迎进入管理员界面请选择以下操作"); System.out.println("1.增加商品 2.查询商品 3.修改商品 4.更改密码 5.查看利润 6.删除产品 7.退出"); int choose = scanner.nextInt(); switch (choose){ case 1:{ //增加商品 addProduct(); admPage(); break; } case 2:{ //查询产品目录 selectProduct(); admPage(); break; } case 3:{ //修改产品信息 //selectProduct(); revise(); admPage(); break; } case 4:{ //更改密码 changePwd(); admPage(); break; } case 5:{ //查看订单利润 //selectProduct(); profit(); admPage(); break; } case 6:{ //删除产品 //selectProduct(); delete(); admPage(); break; } default:{ System.out.println("退出操作"); break; } } }
-
我们在管理员界面添加了6个功能,但是原理都是CURD,即增删改查,所以我们讲这四个功能,而且由于后面用集合写删除很方便,所以删除如果感觉麻烦的话也可以不选。
/** * 添加产品页面 */ /** * 管理员界面功能 * 输入产品名称,价格,库存 * 数组进行判断,满了退出 */ public void addProduct(){ boolean flag =true; Product product = new Product(); System.out.println("请输入产品名称"); product.name = scanner.next(); System.out.println("请输入产品价格"); product.price = scanner.nextInt(); System.out.println("请输入产品库存量"); product.kuc = scanner.nextInt(); System.out.println("请输入产品进货价"); int cost =scanner.nextInt(); if(cost<=product.price){ for(int i =0;i<=products.length-1;i++){ if(products[i]==null){ flag =false; product.serNum=i; products[i]=product; break; } } if(flag){ System.out.println("仓库已满,无法添加"); }else{ System.out.println("添加成功"); } }else{ System.out.println("你输入的进货价错误,请重新添加"); addProduct(); } }
-
对于添加商品,就是我们先创建一个Product类型的对象,然后由管理员输入名字,售价 ,库存。这里我们加了一个进价,因为正常情况下进价肯定比售价要低,所以我们会判断进价是不是低于售价,低于售价就会将数组遍历一遍,然后如果存在null的位置,就将产品添加进去,如果不存在,就说明仓库已满。与上面遍历用户数组一样。
/** * 查询产品页面 */ /** * 用户和管理员共同功能 * 通过遍历输出所有产品 */ public void selectProduct(){ if(USER.type==2){ System.out.println("***以下是查询商品页面***"); System.out.println("产品序号 产品名称 产品价格 产品库存 进货价 "); for(int i= 0;i<=products.length-1;i++){ if(products[i]!=null){ System.out.println(products[i].serNum+"\t\t "+products[i].name+"\t " +products[i].price+"\t "+products[i].kuc+" "+products[i].cost); }else{ break; } } }else{ System.out.println("***以下是查询商品页面***"); System.out.println("产品序号 产品名称 产品价格 产品库存 "); for(int i= 0;i<=products.length-1;i++){ if(products[i]!=null){ System.out.println(products[i].serNum+"\t\t "+products[i].name+"\t " +products[i].price+"\t "+products[i].kuc); }else{ break; } } } }
-
对于查询界面,本身其实是用户跟管理员看到的都一样,但是我们添加了一个进货价,所以管理员会看到进货价,而用户不会,所以我们就需要判断是用户查询还是管理员查询,而分辨管理员和用户我们由标志位type,所以只需要判断标志位即可。而判断完之后,我们就只需要将Product数组遍历一遍即可。一直遍历到数组为空的时候跳出。然后将数组的各个属性输出即可。
/** * 商品修改页面 */ /** * 管理员功能 * 选择序号进行修改产品,重新输入产品信息 */ public void revise(){ Product product = new Product(); System.out.println("这是修改商品信息页面,请选择要修改的商品序号"); int ser =scanner.nextInt(); if(products[ser]!=null){ //当输入的序号存在时 System.out.println("请输入更改后的商品名"); product.name = scanner.next(); System.out.println("请输入更改后的商品价格"); product.price = scanner.nextInt(); System.out.println("请输入更改后的商品库存"); product.kuc = scanner.nextInt(); }else{ System.out.println("商品序号不存在,请检查后重新输入"); revise(); } }
-
查询和添加都已经写好了,那修改其实也就简单了,修改商品其实就是选择数组的下标然后在进行更改,但是更改的时候要判断下标存不存在,即这个下标的数组内容为不为空,如果为空的话,我们修改它很明显就会报空指针。
/** * 删除操作 */ /** * 管理员页面 * 通过输入序号将产品所有信息删除,并将其他产品序号往前排 */ public void delete(){ Product product; System.out.println("欢迎进入删除操作"); selectProduct(); System.out.println("请输入想要删除的序列号"); int ser = scanner.nextInt(); // selectProduct(); if(products[ser]!=null){ System.out.println("确定要删除吗"); System.out.println("确定请输入1"); int choose =scanner.nextInt(); if(choose==1){ int j=0; for(int k=0;k<=products.length-1;k++){ if(products[k]!=null){ j++; }else{ break; } } if(ser==(j-1)){ products[j-1]=null; }else{ for(int i=ser;i<(j-1);i++){ product = products[i+1]; product.serNum = products[i+1].serNum-1; products[i]=product; } products[j-1]=null; } System.out.println("已删除这个产品,"); selectProduct(); } } }
-
对于删除操作,其实原理很简单,就是选择你删除的是哪一个,然后把它赋值为空然后将其他的值往前挪一个下标。但是实现起来就会发现很麻烦。可能有的人有其他思路,毕竟方法有无数,结果也可以一样。可能我的方法不好,但是如果没有思路的话可以看一看,如果有更好的思路的话,也希望能分享一下,
-
首先我们定义一个int j=0;然后将product数组遍历一遍,每遍历一次将j+1,然后我们得到的j就是数组不为空的长度。得到之后,选择要删掉的下标,将从这个下标开始利用冒泡排序将下标跟后一个换,最后要删掉的下标就跑到了末尾,这时我们就只需将这个赋值为null即可。
-
管理界面用CURD写完之后,我们再写用户界面,为了不让读者一次看的太累,后面就找一个功能编写,剩下的再另一篇博客中将完整代码写出来以供学习。
/** * 用户界面 */ /** * 用户登录后,进入用户界面。然后通过选择每个选项调用方法 */ public void shopUser(){ System.out.println("欢迎进入超市页面,我们有以下功能"); System.out.println("1.购物 2.查询 3.充值 4.查看个人信息 5.vip办理 6.热销 7.查看账单 8.更改密码 9.退出"); int a = scanner.nextInt(); switch(a){ case 1:{ //购物 userBuy(); shopUser(); break; } case 2:{ //查询 selectProduct(); shopUser(); break; } case 3:{ //充值页面 userRecharg(); shopUser(); break; } case 4:{ //System.out.println("请查看个人信息"); userInfor(); shopUser(); break; } case 5:{ //System.out.println("vip办理"); userVip(); shopUser(); break; } case 6:{ //System.out.println("热销排行榜"); bestProduct(); shopUser(); break; } case 7:{ //System.out.println("查看账单"); bill(); shopUser(); break; } case 8:{ //System.out.println("更改密码"); changePwd(); shopUser(); break; } default:{ System.out.println("返回登录界面"); sp(); break; } } }
-
这里我们选取一个购物作为结束,其他的道理也是一样,就不累述了。
/** * 用户购物界面 */ /** * 用户功能 * 通过输入产品序号进行产品选择,选择完然后输入数量进行购买 * 购买时进行判断库存数是否够需求以及用户余额是否够交易、 * 购买时会判断是不是会员,会员会进行打折操作 * 购买成功后更新库存量,用户余额,以及更新账单 * 当用户余额不够购买时,选择是否跳转到充值界面 * 购买完成后并输出账单以及用户余额 */ public void userBuy(){ Order order =new Order(); System.out.println("欢迎选购商品,以下是我们的所有产品"); selectProduct(); System.out.println("请输入想要购买的产品序号"); int ser = scanner.nextInt(); System.out.println("产品序号 产品名称 产品价格 产品库存"); System.out.println(products[ser].serNum+" "+products[ser].name+" "+products[ser].price+ " "+products[ser].kuc); System.out.println("请输入想要购买数量"); int num =scanner.nextInt(); //判断库存够不够 if(products[ser].kuc>=num){ //判断钱够不够 if(USER.vip!=1){ if(USER.money>=num*products[ser].price){ USER.money=USER.money-num*products[ser].price; //更新用户余额 order.sales=order.sales+num; //更新销售量 //order.cost =(products[ser].price-) order.user=USER; //更新账单 order.totalMoney =num*products[ser].price; //更新库存 products[ser].kuc= products[ser].kuc - num; order.product=products[ser]; //将值存进orders中 for(int i=0;i<=orders.length-1;i++){ if(orders[i]==null){ orders[i]=order; break; } } System.out.println("你本次消费:"+order.totalMoney+" 还剩余额:"+USER.money); }else{ System.out.println("剩余钱不够,是否进行充值,充值请输入1"); int a =scanner.nextInt(); if(a==1){ //充值 userRecharg(); } //跳转 userBuy(); } }else{ System.out.println("您是尊贵的VIP会员,享受八折优惠"); if(USER.money>=0.8*num*products[ser].price){ //用户余额 USER.money=USER.money-0.8*num*products[ser].price; //热销 order.sales=order.sales+num; order.user=USER; order.totalMoney =0.8*num*products[ser].price; //将值存进orders中 products[ser].kuc= products[ser].kuc - num; order.product=products[ser]; for(int i=0;i<=orders.length-1;i++){ if(orders[i]==null){ orders[i]=order; break; } } System.out.println("您本次消费:"+order.totalMoney+" 还剩余额:"+USER.money); }else{ System.out.println("剩余钱不够,是否进行充值,充值请输入1"); int a =scanner.nextInt(); if(a==1){ //充值 userRecharg(); } //跳转 userBuy(); } } }else{ System.out.println("库存不够"); } }
-
进入这个方法之后,首先调用方法列出所有产品以供用户选择。选择之后再输入想要购买的数量,然后进行判断用户的余额够不够,如果不够会让用户选择是否跳转到充值界面。如果选择跳转会调用充值的方法。当用户钱够时,会判断用户是不是会员,如果标志位是vip会进行打折操作,如果不是就进行正常扣钱。扣完钱之后会生成订单供用户查看。