适合小白的java学习项目(控制台商店管理)java

已经好久没有更新,这一周主要将前面所学利用一个商店管理的项目给实现出来,主要利用面向对象的三个特征来实现


【项目需求】

创建一个超市的管理系统,当你运行程序时,你可以注册会员,你可以管理员登录,你可以会员登录,你可以退出商店


【主菜单】
  • 会员登录
  • 管理员登录
  • 注册会员
  • 退出

【会员登录】

  • 购物
  • 支付
  • 返回主菜单

【管理员登录时】

  • 查看会员信息
  • 增加商品分类
  • 增加商品
  • 查看商品列表

【注册会员】

  • 查看会员是否已经存在
  • 注册账号
  • 注册密码
  • 初始化其会员等级

【会员等级】

  • 等级名称
  • 会员的积分
  • 会员的折扣

【购物】

  • 查看所有的商品
  • 输入要买商品的编号
  • 支付价钱

【支付】

  • 计算总金额
  • 收款
  • 找钱
  • 升级会员

【查看会员信息】

  • 打印出会员的所有的信息

【增加商品】

  • 添加商品的数量,价格等

【增加商品的分类】

  • 添加新的商品分类

【打印商品的信息】

  • 将商品的信息打印出来

在这里插入图片描述
那么,应该从何做起,我们首先实现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上传,等以后学了,更新地址,大家目前需要代码的话,请私信我。
  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值