Java初学——项目之客户信息管理

1. 项目简介

在这里插入图片描述

2. 需求说明

在这里插入图片描述

2.1 主菜单

在这里插入图片描述

2.2 添加客户

在这里插入图片描述

2.3 修改客户

在这里插入图片描述

2.4 删除客户

在这里插入图片描述

2.5 客户列表

在这里插入图片描述

3. 软件结构设计

在这里插入图片描述

4. 编写代码

4.1 CMUtility工具类

可用来方便的实现键盘访问

public class CMUtility {
    private static Scanner scanner = new Scanner(System.in);
    /**
	用于界面菜单的选择。该方法读取键盘,如果用户键入’1’-’5’中的任意字符,则方法返回。返回值为用户键入字符。
	*/
	public static char readMenuSelection() {
        char c;
        for (; ; ) {
            String str = readKeyBoard(1, false);
            c = str.charAt(0);
            if (c != '1' && c != '2' && 
                c != '3' && c != '4' && c != '5') {
                System.out.print("选择错误,请重新输入:");
            } else break;
        }
        return c;
    }
	/**
	从键盘读取一个字符,并将其作为方法的返回值。
	*/
    public static char readChar() {
        String str = readKeyBoard(1, false);
        return str.charAt(0);
    }
	/**
	从键盘读取一个字符,并将其作为方法的返回值。
	如果用户不输入字符而直接回车,方法将以defaultValue 作为返回值。
	*/
    public static char readChar(char defaultValue) {
        String str = readKeyBoard(1, true);
        return (str.length() == 0) ? defaultValue : str.charAt(0);
    }
	/**
	从键盘读取一个长度不超过2位的整数,并将其作为方法的返回值。
	*/
    public static int readInt() {
        int n;
        for (; ; ) {
            String str = readKeyBoard(2, false);
            try {
                n = Integer.parseInt(str);
                break;
            } catch (NumberFormatException e) {
                System.out.print("数字输入错误,请重新输入:");
            }
        }
        return n;
    }
	/**
	从键盘读取一个长度不超过2位的整数,并将其作为方法的返回值。
	如果用户不输入字符而直接回车,方法将以defaultValue 作为返回值。
	*/
    public static int readInt(int defaultValue) {
        int n;
        for (; ; ) {
            String str = readKeyBoard(2, true);
            if (str.equals("")) {
                return defaultValue;
            }

            try {
                n = Integer.parseInt(str);
                break;
            } catch (NumberFormatException e) {
                System.out.print("数字输入错误,请重新输入:");
            }
        }
        return n;
    }
	/**
	从键盘读取一个长度不超过limit的字符串,并将其作为方法的返回值。
	*/
    public static String readString(int limit) {
        return readKeyBoard(limit, false);
    }
	/**
	从键盘读取一个长度不超过limit的字符串,并将其作为方法的返回值。
	如果用户不输入字符而直接回车,方法将以defaultValue 作为返回值。
	*/
    public static String readString(int limit, String defaultValue) {
        String str = readKeyBoard(limit, true);
        return str.equals("")? defaultValue : str;
    }
	/**
	用于确认选择的输入。该方法从键盘读取‘Y’或’N’,并将其作为方法的返回值。
	*/
    public static char readConfirmSelection() {
        char c;
        for (; ; ) {
            String str = readKeyBoard(1, false).toUpperCase();
            c = str.charAt(0);
            if (c == 'Y' || c == 'N') {
                break;
            } else {
                System.out.print("选择错误,请重新输入:");
            }
        }
        return c;
    }

    private static String readKeyBoard(int limit, boolean blankReturn) {
        String line = "";

        while (scanner.hasNextLine()) {
            line = scanner.nextLine();
            if (line.length() == 0) {
                if (blankReturn) return line;
                else continue;
            }

            if (line.length() < 1 || line.length() > limit) {
                System.out.print("输入长度(不大于" + limit + ")错误,请重新输入:");
                continue;
            }
            break;
        }

        return line;
    }
}

4.2 Customer类的设计

在这里插入图片描述

public class Customer {
	private String name;// 客户姓名
	private char gender;// 性别
	private int age;// 年龄
	private String phone;// 电话号码
	private String email;// 电子邮箱

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public char getGender() {
		return gender;
	}

	public void setGender(char gender) {
		this.gender = gender;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getPhone() {
		return phone;
	}

	public void setPhone(String phone) {
		this.phone = phone;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public Customer() {

	}

	public Customer(String name, char gender, int age, String phone, String email) {
		this.name = name;
		this.gender = gender;
		this.age = age;
		this.phone = phone;
		this.email = email;
	}

}

4.3 CustomerList类的设计

在这里插入图片描述

public class CustomerList {
	private Customer[] customers;// 用来保存客户对象的数组
	private int total = 0;// 记录已保存客户对象的数量

	// 构造器,用来初始化customers数组
	// totalCustomer:指定customers数组的最大空间
	public CustomerList(int totalCustomer) {
		customers = new Customer[totalCustomer];
	}

	// 将参数customer添加到数组中最后一个客户对象记录之后
	// 添加成功返回true;false表示数组已满,无法添加
	public boolean addCustomer(Customer customer) {
		if (customers.length > total) {
			customers[total] = customer;
			total++;
			return true;
		} else {
			return false;
		}
	}

	// 用参数customer替换数组中由index指定的对象
	// customer指定替换的新客户对象 ,index指定所替换对象在数组中的位置,从0开始
	// 替换成功返回true;false表示索引无效,无法替换
	public boolean replaceCustomer(int index, Customer cust) {
		if(index>=0 && index<total) {
			customers[index]=cust;
			return true;
		}
		return false;
	}

	//用途:从数组中删除参数index指定索引位置的客户对象记录
	//参数: index指定所删除对象在数组中的索引位置,从0开始
	//返回:删除成功返回true;false表示索引无效,无法删除
	public boolean deleteCustomer(int index) {
		if(index<0 || index>=total) {
			return false;
		}
		for(int i=index;i<total-1;i++) {
			customers[i]=customers[i+1];
		}
		customers[total-1]=null;
		total--;
		return true;

	}

	//用途:返回数组中记录的所有客户对象
	//返回: Customer[] 数组中包含了当前所有客户对象,该数组长度与对象个数相同。
	public Customer[] getAllCustomers() {
		Customer[] custs=new Customer[total];
		for(int i=0;i<total;i++) {
			custs[i]=customers[i];
		}
		return custs;//不能直接返回customers,该数组不一定存满了客户信息,可能存在null

	}

	//用途:返回参数index指定索引位置的客户对象记录
	//参数: index指定所要获取的客户在数组中的索引位置,从0开始
	//返回:封装了客户信息的Customer对象
	public Customer getCustomer(int index) {
		if(index<0 || index>=total) {
			return null;
		}
		return customers[index];
	}

	public int getTotal() {
		return total;
	}

}

4.4 CustomerView类的设计

在这里插入图片描述

public class CustomerView {

	CustomerList customerList = new CustomerList(10);
	
	//构造器,初始化时先添加一个用户
	public CustomerView() {
		Customer customer=new Customer("Tom", '男', 27, "13812341234", "Tom@qq.com");
		customerList.addCustomer(customer);
	}

	// 显示主菜单,响应用户输入,根据用户操作分别调用其他相应的成员方法(如addNewCustomer),
	// 以完成客户信息处理。
	public void enterMainMenu() {
		boolean isFlag=true;
		while (isFlag) {
			System.out.println("-----------------客户信息管理软件-----------------");
			System.out.println();
			System.out.println("                  1 添 加 客 户                                        ");
			System.out.println("                  2 修 改 客 户                                        ");
			System.out.println("                  3 删 除 客 户                                        ");
			System.out.println("                  4 客 户 列 表                                        ");
			System.out.println("                  5 退          出                                        ");
			System.out.println();
			System.out.print("                  请选择(1-5):  ");
			char menu=CMUtility.readMenuSelection();
			switch (menu) {
			case '1':
				addNewCustomer();
				break;
			case '2':
				modifyCustomer();
				break;
			case '3':
				deleteCustomer();
				break;
			case '4':
				listAllCustomers();
				break;
			case '5':
				System.out.println("---------------------------------------------------");
				System.out.print("是否确认退出(Y/N): ");
				char isExit=CMUtility.readConfirmSelection();
				if(isExit=='Y') {
					isFlag=false;
				}
				break;

			}
		}


	}

	// 以下四个方法分别完成“添加客户”、“修改客户”、“删除客户”和“客户列表”等各菜单功能。
	// 这四个方法仅供enterMainMenu()方法调用。
	private void addNewCustomer() {

		System.out.println("\n---------------------添加客户---------------------\n");
		System.out.print("姓名:");
		String name = CMUtility.readString(10);
		System.out.print("性别:");
		char gender = CMUtility.readChar();
		System.out.print("年龄:");
		int age = CMUtility.readInt();
		System.out.print("电话:");
		String phone = CMUtility.readString(13);
		System.out.print("邮箱:");
		String email = CMUtility.readString(30);
		Customer customer=new Customer(name, gender, age, phone, email);
		boolean isAddSuccess = customerList.addCustomer(customer);
		if(isAddSuccess==true) {
			System.out.println("\n---------------------添加完成---------------------\n");			
		}else {
			System.out.println("\n---------------添加失败,用户目录已满---------------\n");
		}

	}

	private void modifyCustomer() {
		System.out.println("\n---------------------修改客户---------------------\n");
		int index=0;
		Customer cust=null;
		for(;;) {
			System.out.print("请选择待修改客户编号(-1退出):");
			index = CMUtility.readInt();
			if(index==-1) {
				return;
			}
			cust = customerList.getCustomer(index-1);
			if(cust==null) {
				System.out.println("未找到指点客户");
			}else {
				break;
			}
		}
		System.out.print("姓名(" + cust.getName() + "):");
		String name = CMUtility.readString(10,cust.getName());
		System.out.print("性别(" + cust.getGender() + "):");
		char gender = CMUtility.readChar(cust.getGender());
		System.out.print("年龄(" + cust.getAge() + "):");
		int age = CMUtility.readInt(cust.getAge());
		System.out.print("电话(" + cust.getPhone() + "):");
		String phone = CMUtility.readString(13, cust.getPhone());
		System.out.print("邮箱(" + cust.getEmail()+ "):");
		String email = CMUtility.readString(30, cust.getEmail());
		cust = new Customer(name, gender, age, phone, email);
		boolean replaceCustomer = customerList.replaceCustomer(index-1, cust);
		if(replaceCustomer==true) {
			System.out.println("\n---------------------修改完成---------------------\n");
		}else {
			System.out.println("\n---------------------修改失败---------------------\n");
		}
		
	}

	private void deleteCustomer() {
		System.out.println("\n---------------------删除客户---------------------\n");
		int index=0;
		Customer customer=null;
		for(;;) {
			System.out.print("请选择待删除客户编号(-1退出):");
			index = CMUtility.readInt();
			if(index==-1) {
				return;
			}
			customer=customerList.getCustomer(index-1);
			if(customer==null) {
				System.out.println("未找到指定用户");
			}else {
				break;
			}
		}
		System.out.print("确认是否删除(Y/N):");
		char yn = CMUtility.readConfirmSelection();
		if (yn == 'N') {
			return;
		}
		boolean isdelete = customerList.deleteCustomer(index-1);
		if(isdelete==true) {
			System.out.println("\n---------------------删除完成---------------------\n");
		}else {
			System.out.println("\n----------无法找到指定客户,删除失败--------------\n");
		}
		
	}

	private void listAllCustomers() {
		System.out.println("\n---------------------------客户列表---------------------------\n");
		if(customerList.getTotal()==0) {
			System.out.println("没有客户信息!");
		}else {
			System.out.println("编号\t姓名\t性别\t年龄\t电话\t\t邮箱");
			Customer[] customers=customerList.getAllCustomers();
			for(int i=0;i<customers.length;i++) {
				Customer cust=customers[i];
				System.out.println((i+1)+"\t"+cust.getName()+"\t"+cust.getGender()+"\t"+cust.getAge()
				+"\t"+cust.getPhone()+"\t"+cust.getEmail());
			}
			
		}
		System.out.println("\n---------------------------客户列表完成------------------------\n");
	}

	// 创建CustomerView实例,并调用 enterMainMenu()方法以执行程序。
	public static void main(String[] args) {
		CustomerView customerView = new CustomerView();
		customerView.enterMainMenu();
	}

}

5. 项目简图

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值