已经好久没有更新,这一周主要将前面所学利用一个商店管理的项目给实现出来,主要利用面向对象的三个特征来实现
【项目需求】
创建一个超市的管理系统,当你运行程序时,你可以注册会员,你可以管理员登录,你可以会员登录,你可以退出商店
【主菜单】
- 会员登录
- 管理员登录
- 注册会员
- 退出
【会员登录】
- 购物
- 支付
- 返回主菜单
【管理员登录时】
- 查看会员信息
- 增加商品分类
- 增加商品
- 查看商品列表
【注册会员】
- 查看会员是否已经存在
- 注册账号
- 注册密码
- 初始化其会员等级
【会员等级】
- 等级名称
- 会员的积分
- 会员的折扣
【购物】
- 查看所有的商品
- 输入要买商品的编号
- 支付价钱
【支付】
- 计算总金额
- 收款
- 找钱
- 升级会员
【查看会员信息】
- 打印出会员的所有的信息
【增加商品】
- 添加商品的数量,价格等
【增加商品的分类】
- 添加新的商品分类
【打印商品的信息】
- 将商品的信息打印出来
那么,应该从何做起,我们首先实现vip注册,vip应该怎么注册
- 首先输入号码
- 检查号码是否已经存在
- 若存在则退出登录
- 输入密码
- 再次输入密码
- 检查两次密码是否一致
- 注册成功
在注册之前我们要检查账号是否已经存在,这样的话我们就需要一个用来储存账号的数组(因为目前只学到数组),然后扫描数组中的元素,看看是否在数组中,因此首先要定义一个数组,但是数组的长度固定,万一账号已经添加满了,那怎么办,因此还需要一个可变的数组,那怎么做一个可变的数组,我的方法如下:
- 先声明一个数组数组
- 再给定一个长度大于1的数组
- 然后判断现在存入元素的个数与给定长度的大小
- 如果发现给定的长度等于数组的长度-1
- 那么意味着数组已经满了
- 于是将给定的值翻倍
- 然后再new出给定值大小的数组,将前面存的复制过来
import javax.swing.*;
import java.util.Arrays;
import java.util.Objects;
/**
* 可变数组
* @author jkk
*/
public class MyList {
/**
* 存元素的容器
*/
private Object [] arr;
/**
* 设置一个默认的大小
*/
private int size;
/**
* 初始化一个size大小的数组
* @param size
*/
public MyList(int size){
arr = new Object[size];
}
/**
* 数组中可以添加元素
* @param obj
* @return
*/
public boolean add(Object obj){
if(size == arr.length){
grow();
}
arr[size++] = obj;
return true;
}
/**
* 当添加满的时候,进行扩容,将这个数组复制到另一个数组中
* 大小为当前数组的一倍
*/
private void grow(){
int newLength = arr.length*2;
arr = Arrays.copyOf(arr,newLength);
}
/**
* 获取index位置的元素
* @param index
* @return
*/
public Object getElement(int index){
if(index < 0 || index > size-1){
return null;
}
return arr[index];
}
/**
* 返回容器的容量
* @return
*/
public int size(){
return size;
}
/***
* 查找元素的位置
* @param obj
* @return
*/
public int search(Object obj){
for (int i = 0; i < size; i++) {
if(arr[i].equals(obj)){
return i;
}
}
return -1;
}
/**
* 将容器中的所有元素都返回字符形式返回
* @return
*/
public String toString(){
String result = "";
for (int i = 0; i < size; i++) {
result += arr[i].toString() + "\n";
}
return result;
}
}
现在一个可变数组就做好了,我们可以在里面存储不同类型的信息,我们可以声明一个vip用户的数组,用来存储vip的信息
private static MyList viplist;//vip用户数组
vip中应该有哪些的信息
- 电话(账号)
- 密码
- 姓名
- 积分
- 余额
- 会员等级
package model;
import util.MyList;
public class Vip extends Father {
private int point;
private double money;
private Level level;
public Vip(String phone, String password,String name) {
super(phone, password,name);
}
public Vip(String phone, String password, String name,int point,double money, Level level){
super(phone, password,name);
this.point = point;
this.money = money;
this.level = level;
}
public int getPoint() {
return point;
}
public void setPoint(int point) {
this.point = point;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
public Level getLevel() {
return level;
}
public void setLevel(Level level) {
this.level = level;
}
@Override
public String toString() {
return "会员电话:" + getPhone() +
", 密码:******"+
", 会员姓名:" + getName() +
", 积分:" + point +
", 余额:" + money +" " + level;
}
}
将vip用户看做是一个对象,然后就是初始化vip
Vip vip = new Vip("101","101","1号",0,0,(Level) levelList.getElement(0));
viplist.add(vip);
Vip vip1 = new Vip("102","102","2号",10,0,(Level) levelList.getElement(1));
viplist.add(vip1);
以上在初始化vip的时候会发现等级是一个对象,因为在等级中还有许多的东西,因此单独将等级又看做是一个对象
package model;
/**
* @author jkk
*/
public class Level{
/**
* 会员等级
*/
private String levelName;
/**
* 会员等级的划分标准
*/
private int base;
/**
* 折扣
*/
private double discount;
public Level(String levelName, int base, double discount) {
this.levelName = levelName;
this.base = base;
this.discount = discount;
}
public String getLevelName() {
return levelName;
}
public void setLevelName(String levelName) {
this.levelName = levelName;
}
public int getBase() {
return base;
}
public void setBase(int base) {
this.base = base;
}
public double getDiscount() {
return discount;
}
public void setDiscount(double discount) {
this.discount = discount;
}
@Override
public String toString() {
return "会员信息: " +
" 会员等级 '" + levelName + '\'' +
" 会员折扣" + discount ;
}
}
现在有关VIP的一些信息就完成了,下面就是注册vip了
private void register(){
println("根据提示输入信息");
println("请输入你的电话号码:");
String phone = INPUT.next();
//检验是否已经注册
boolean flag = false;
for (int i = 0; i < viplist.size(); i++) {
Object element = viplist.getElement(i);
if(element instanceof Vip vip){
if(phone.equals(vip.getPhone())){
println("账号已经存在");
flag = true;
break;
}
}
}
if(flag){
indexMenuList();
}
String password1 = null;
do{
println("请设置您的密码");
password1 = INPUT.next();
vipFanhui(password1);
println("请再次确认您的密码");
String password2 = INPUT.next();
if(!password2.equals(password1)){
println("两次输入的密码不同,请再次输入!");
}
else {
break;
}
}while(true);
println("请输入您的姓名:");
String name = INPUT.next();
Vip vip = new Vip(phone,password1,name,0,0,(Level) levelList.getElement(0));
viplist.add(vip);
println(name+",恭喜您成为本店的会员");
indexMenuList();
}
大家看代码的时候可能会有许多的疑问:
- indexMenuList();主菜单方法
- println();打印方法
- vipFanhui();查看输入的值是否为10086
这是主菜单的方法,当程序运行时,就会出现此页面
private void indexMenuList(){
println("1. 会员登录");
println("2. 管理员登录");
println("3. 会员注册");
println("0. 退出");
println("-------------------");
println("请选择相应的服务");
int in = INPUT.nextInt();
router(in);
}
此处的router()就是一个选择器而已,根据不同的选择值,跳转到不同的界面
private void router(int in){
switch (in){
case 1 -> viplogin();
case 2 -> adminlogin();
case 3 -> register();
case 201 -> showVipList();
case 202 -> addGoods();
case 203 -> addGoodsClassfiy();
case 204 -> {
showGoodsList();
adminMenuList();
}
case 0 -> exit();
default ->{
println("输入有错,请重新输入");
router(INPUT.nextInt());
}
}
}
这是一个打印的方法,只是为了偷懒而已
public void println(String str){
System.out.println(str);
}
public void print(String str){
System.out.print(str);
}
这是一个全局返回的方法,当输入10086的时候就可以直接返回到菜单,可以根据不同的参数进行重载
public void Fanhui(String str){
if("10086".equals(str)){
println("追梦少年不失眠,未来可期蔡徐坤。");
adminMenuList();
}
以上就是完成vip的注册代码,然后就是vip的登录
现在开始vip的登录过程
- 在主菜单选择viplogin(vip登录)
- 跳到viplogin方法
- vip有哪些活动
- 购物
- 支付
- 退出
private void viplogin(){
println("请您输入手机号码:");
String phone = INPUT.next();
vipFanhui(phone);//全局返回
println("请输入密码:");
String password = INPUT.next();
vipFanhui(password);
Vip login = new Vip(phone,password,null);
Father flag = CheckAccount(login,viplist);
if(flag instanceof Vip vip){
login = vip;
}
if(flag != null){
currentUser = login;
currentUser.setShopCar(new MyList(1));
println(currentUser.getName()+"欢迎━(*`∀´*)ノ亻!");
shopping();
pay();
}
else{
println("密码或者账号输入错误");
indexMenuList();
}
}
观察上面的代码,会发现出现了新的类Father,还有新的方法CheckAccount();
此处的father是为了方便后面的写入,因为用户和管理员都有许多共同的属性,所以将father作为一个父类
package model;
import util.MyList;
/**
* @author jkk
*/
public class Father {
private String name;
/**
* 手机号
*/
private String phone;
/**
* 密码
*/
private String password;
/**
* 购物车
*/
private MyList shopCar;
public Father(String phone, String password,String name){
this.phone = phone;
this.password = password;
this.name = name;
}
public boolean login(Father father){
if(this.getPhone().equals(father.getPhone()) && this.getPassword().equals(father.getPassword())){
return true;
}
return false;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public MyList getShopCar() {
return shopCar;
}
public void setShopCar(MyList shopCar) {
this.shopCar = shopCar;
}
}
这个CheckAccount()方法是用来判断当前的账号是否存在,跟前面的判断的注册的方法一样,只是将其写作一个方法
private Father CheckAccount(Father father,MyList list){
for (int i = 0; i < list.size(); i++) {
Object obj = list.getElement(i);
if(obj instanceof Father father1){
if(father.login(father1)){
return father1;
}
}
}
return null;
}
又会发现代码中多余出现了login()方法,这个方法是用来判断电话号码跟密码是否都正确
public boolean login(Father father){
if(this.getPhone().equals(father.getPhone()) && this.getPassword().equals(father.getPassword())){
return true;
}
return false;
}
通过以上两个方法就可以判断vip是否登录成功
vip登录成功之后的操作就是进行购物,现在在建立一个购物的方法
- 判断输入的序号是不是在货品里面
- 如果在继续输入购买的数量
- 然后判断商店的数量是否足够
- 将所购买的商品添加到购物车里面去
- 为什么要添加购物车
- 主要是用来算会员打折以及库存管理的方便
private void shopping() {
showGoodsList();
print("请输入你要购买的商品的序号");
String no = INPUT.next();
vipFanhui(no);
int flag = 0;
for (int i = 0; i < goodList.size(); i++) {
Object element = goodList.getElement(i);
if(element instanceof Goods good){
if(no.equals(good.getGoodNo())){
flag = 1;
break;
}
}
}
if(flag==1){
int index = goodList.search(new Goods(no));
Goods good = (Goods) goodList.getElement(index);
print("请输入要"+good.getGoodsName()+"的商品的数量:");
int count = INPUT.nextInt();
vipFanhui(count);
while(good.getCount() < count){
println("当前"+good.getGoodsName()+"的数量为"+good.getCount());
println("库存不足,请您重新输入");
count = INPUT.nextInt();
}
currentUser.getShopCar().add(new Baby(good,count));
print("是否继续购物:1.继续购物 2.结账");
int sel = INPUT.nextInt();
vipFanhui(sel);
if(sel == 1){
shopping();
}
return;
}
else{
println("你所购买的商品不存在,去隔壁-------->");
print("是否继续购物:1.继续购物 2.返回主页面");
int sel = INPUT.nextInt();
vipFanhui(sel);
if(sel == 1){
shopping();
}
if(sel == 2){
indexMenuList();
}
}
}
以上的代码中又出现了一个good类,这个类是用来存放物品的一些信息
package model;
import java.util.Objects;
/**
* @author jkk
*/
public class Goods {
/**
* 商品编号
*/
private String goodNo;
/**
* 商品名称
*/
private String goodsName;
/**
* 成本
*/
private double cost;
/**
* 售价
*/
private double price;
/**
* 数量
*/
private int count;
/**
* 商品分类
*/
private Category category;
public Goods(){}
public Goods(String no){
this.goodNo = no;
}
public Goods(String goodNo, String goodsName, double cost, double price, int count, Category category) {
this.goodNo = goodNo;
this.goodsName = goodsName;
this.cost = cost;
this.price = price;
this.count = count;
this.category = category;
}
public String show(){
return "【商品】" +
"商品编号:" + goodNo +
", 商品名称:" + goodsName +
", 售价:" + price +
", 库存:" + count +
", 分类:" + (category == null? "无" : category.getName());
}
public String getGoodNo() {
return goodNo;
}
public void setGoodNo(String goodNo) {
this.goodNo = goodNo;
}
public String getGoodsName() {
return goodsName;
}
public void setGoodsName(String goodsName) {
this.goodsName = goodsName;
}
public double getCost() {
return cost;
}
public void setCost(double cost) {
this.cost = cost;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public Category getCategory() {
return category;
}
public void setCategory(Category category) {
this.category = category;
}
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Goods goods = (Goods) o;
return goodNo.equals(goods.goodNo);
}
@Override
public int hashCode() {
return Objects.hash(goodNo);
}
}
可以发现,其中有许多的成员
- 商品编号
- 商品名称
- 售价
- 库存
- 分类
而分类又可以分好多种,因此可以将分类又变为一个对象,只需要在good里面声明一下即可
package model;
/**
* @author jkk
*/
public class Category {
/**
* 分类编号
*/
private int no;
/**
* 分类名称
*/
private String name;
public Category(int no, String name) {
this.no = no;
this.name = name;
}
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "【商品分类】" +
"编号" + no +
", 名称'" + name + '\'';
}
}
在购物的环节中,我们需要知道当前的用户购买了那些的东西,因此我们还需要一个购车的的功能,用来存放我们选择购买的东西的数量和名称
package model;
/**
* @author jkk
*/
public class Baby {
private Goods good;
private int count;
public Baby(Goods good, int count) {
this.good = good;
this.count = count;
}
public double getSum(){
return good.getPrice() * count;
}
public Goods getGood() {
return good;
}
public void setGood(Goods good) {
this.good = good;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public String toString(){
return good.getGoodsName() + "\t" + good.getPrice() + "\t" + count + "\t" + getSum();
}
}
以上就是购物环节,现在进入到支付环节
- 首先将购买的信息打印出来
- 算出总和
- 根据目前的会员等级计算出折扣
- 将库存减少
- 显示目前用户消费后的会员等级
private void pay() {
println("您本次的购物清单是:");
MyList shopCar = currentUser.getShopCar();
println("序号\t商品名称\t单价\t数量\t小计");
double sum = 0;
for (int i = 0; i < shopCar.size(); i++) {
Baby element = (Baby) shopCar.getElement(i);
sum += element.getSum();
println((i + 1) + "\t" + element);
}
println("总计: " + sum + "元");
double in = sum;
if (currentUser instanceof Vip vip) {
Level level = vip.getLevel();
in = level.getDiscount() * sum;
println("您是尊贵的 【" + level.getLevelName() + "】" + "本次购物打折后应收:" + in);
double money = 0.0;
do{
print("收款:");
money = INPUT.nextDouble();
if (money < in){
println("付款金额不足,请重新支付.");
} else {
break;
}
} while (true);
println("找零:" + (money - in));
// 修改商品库存
for (int i = 0; i < shopCar.size(); i++) {
Baby element = (Baby) shopCar.getElement(i);
Goods goods = element.getGood();
goods.setCount(goods.getCount() - element.getCount());
}
// 积分
int point = (int) Math.floor(in);
vip.setPoint(vip.getPoint() + point);
// 能否升级会员
for (int i = levelList.size() - 1; i >= 0; i--) {
Level element = (Level) levelList.getElement(i);
if (element.getBase() < vip.getPoint()) {
// 符号当前等级
if (!element.getLevelName().equals(vip.getLevel().getLevelName())) {
vip.setLevel(element);
println("恭喜您,升级为本店的 【" + element.getLevelName() + "】, 以后购物可享" + (int)(element.getDiscount() * 10) + "折");
break;
}
break;
}
}
}
logout();
}
public void logout() {
println("欢迎下次光临!");
currentUser = null;
indexMenuList();
}
以上就完成了所有的用户的功能
现在到了管理员的功能
- 查看会员的信息
- 添加商品的分类
- 添加商品
- 查看商品的分类
package model;
/**
* @author jkk
*/
public class Admin extends Father{
public Admin(String phone,String password,String name){
super(phone,password,name);
}
}
首先是实现登录
private void adminlogin(){
println("请输入管理员手机号码:");
String phone = INPUT.next();
vipFanhui(phone);
println("请输入密码:");
String password = INPUT.next();
vipFanhui(password);
Admin login = new Admin(phone,password,null);
Father flag = CheckAccount(login,adminList);
if(flag instanceof Admin admin){
login = admin;
}
if(flag != null){
currentUser = login;
println(login.getName()+"欢迎━(*`∀´*)ノ亻!");
}
else{
println("账号或者密码错误,请重新选择");
indexMenuList();
}
adminMenuList();
}
然后是查看会员的信息
private void showVipList() {
println("----------------------------------");
println("现在共有会员"+viplist.size()+"名。信息如下:");
println(viplist.toString());
adminMenuList();
}
添加商品
private void addGoods(){
println("请输入商品的编号");
String no = INPUT.next();
Fanhui(no);
Goods goods = null;
for (int i = 0; i < goodList.size(); i++) {
Object element = goodList.getElement(i);
if(element instanceof Goods good1){
if(good1.getGoodNo().equals(no)){
goods = good1;
}
}
}
if(goods == null){
goods = new Goods();
goods.setGoodNo(no);
print("请输入要添加的商品名称:");
String goodsName = INPUT.next();
Fanhui(goodsName);
goods.setGoodsName(goodsName);
print("请输入商品进价:");
double cost = INPUT.nextDouble();
Fanhui(cost);
goods.setCost(cost);
print("请输入商品售价:");
double price = INPUT.nextDouble();
Fanhui(price);
goods.setPrice(price);
}
showCategory();
print("请选择商品的分类");
int category = INPUT.nextInt();
Fanhui(category);
boolean flag = false;
for (int i = 0; i < categoryList.size(); i++) {
Object element = categoryList.getElement(i);
if(element instanceof Category category1){
if(category1.getNo() == category){
goods.setCategory(category1);
flag = true;
break;
}
}
}
if(!flag){
println("请先添加分类");
adminMenuList();
}
print("请输入商品数量:");
int count = INPUT.nextInt();
Fanhui(count);
goods.setCount(goods.getCount() + count);
goodList.add(goods);
println("添加商品成功!");
adminMenuList();
}
添加商品分类
private void addGoodsClassfiy(){
showCategory();
println("请输入分类编号");
int no = INPUT.nextInt();
Fanhui(no);
println("请输入分类名称");
String name = INPUT.next();
Fanhui(name);
Category category = new Category(no,name);
categoryList.add(category);
adminMenuList();
}
以上就完成了这个项目,具体的类如下
【总结】作为java的初学者,这项目一定会有很多的错误,大家在敲得时候一定注意,有问题发到评论区,大家一起解决,此代码后续一定会更新升级,目前还不会git上传,等以后学了,更新地址,大家目前需要代码的话,请私信我。