java实现一个基于文本界面的项目——客户信息管理系统

一.项目介绍

1.简介:这是一个基于文本界面的简单项目,用于存储客户信息的一个简单系统
2.需要用到的知识:
(1)对象数组的创建和数组的初始化
(2)类和对象(属性,方法和构造器的调用)
(3)四种权限修饰符的理解和this指针的运用
(4)类的封装
(5)多对象的协同工作
3.功能:
主要功能是:添加丶修改丶删除丶查询。是一个项目所必需的4种功能。




二.项目展示

1.菜单主界面:
在这里插入图片描述



2.添加客户功能:
在这里插入图片描述




3.修改客户功能:
在这里插入图片描述




4.删除客户功能:
在这里插入图片描述




5.查看客户功能:
在这里插入图片描述




三.项目设计过程:

1.项目流程图设计
(1)总体设计思路流程:
在这里插入图片描述(2)添加客户功能流程:
在这里插入图片描述(3)修改客户功能实现:
在这里插入图片描述在这里插入图片描述
(4).删除功能流程:
在这里插入图片描述
(5).显示客户信息流程:
在这里插入图片描述





2.项目具体运行思路
(1).创建三个类,分别是
Customer :用于初始化客户的属性信息(姓名,年龄等),包含属性的get和set的方法,用来封装客户信息。

CustomerList :里面包含增丶改丶删丶查的主要核心方法,有CustomerList来调用

CustomerView:为主模块,用于设置界面和调用上面两个主要功能,并完善一些细节。

三者之间的关系:
在这里插入图片描述
(2)Customer丶CustomerList丶CustomerView中的属性和方法

1.Customer为实体类,用来封装客户信息,该类封装的客户属性有:

  • String name : 客户姓名
  • char gender : 性别
  • int age :年龄
  • String phone :电话号码
  • String email : 电子邮箱

提供各个属性的get/set方法和所需的构造器(参数根据自己需要设定,这个项目中需要用到上面5个参数)。



2.CustomerList 为Customer对象的管理模块,内部使用数组管理Customer对象。其需要用到的属性和方法是:

  • Customer[ ]customers : 用来保存客户对象的数组
  • int total = 0 :用来记录已保存的客户数量

该类提供一下构造器和方法:

  • public CustomerList(int totalCustomer)
    用途:构造器,用来初始化customer数组
    参数:totalCustomer 为数组的长度

  • public boolean addCustomer(Cusomer customer)
    用途:将参数customer添加到数组中
    参数:由CustomerView中传递过来指定要添加的客户
    返回:true表示添加成功,false表示数组已经满了,添加失败

  • public boolean replaceCustomer(int index, Customer customer)
    用途:用于修改指定的参数customer
    参数:index,为指定索引对象在数组中的位置,由0开始。customer为修改后的新对象
    返回:替换成功返回true,失败则false

  • public boolean deleteCustomer(int index)
    用途:从数组中删除index索引的客户对象
    参数:index为所指定的删除对象,从0开始
    返回:true删除成功,false删除失败

  • public boolean ListCustomer( )
    用途:返回数组中记录的所有对象
    返回:Customer[ ] 数组中包含了当前所有的客户对象

  • public Customer getCustomer(int index)
    用途:返回参数index指定索引位置的客户对象记录。
    参数:index指定索要获取的客户在数组中的索引位置,从0开始。
    返回:封装了客户信息的Customer对象

  • public void showListCustomer( )
    用途:输出customer对象中的属性



3.CustomerView为主模块,负责菜单的显示和处理客户操作。

含有的客户属性:

  • customerList customer = new CustomerList(10)
    new一个长度为10的数组customers

该类要用到的方法:

  • public void enterMain( )
    用途:显示主菜单,响应用户输入,根据用户操作分别调用其他相应的方法,以完成客户信息处理

  • private viud addNewCustomer()

  • private void modifyCustomer()

  • private void deleteCustomer( )

  • private void ListCustomer( )
    用途:这四个方法分别用来实现增丶改丶删丶查等各菜单功能,由enterMain()来调用

  • Public static void main(String[ ] args)
    用途:创建CustomerView实例,并调用enterMain()方法




四.源码

1.CMUtility类(工具类,里面的代码原理可以不用搞懂,会调用就行)

import java.util.*;
/**
 * CMutility工具类:
 * 将不同的功能封装为方法,直接通过调用的方法使用它的功能,无需考虑其调用的细节
 *
 */
public class CMUtility {

	private static Scanner scanner = new Scanner(System.in);
	/**
	 * 
	 * @Description   	用于界面菜单的选择。该方法读取键盘,如果用户键入’1’-’5’中的任意字符
	 * 					则方法返回。返回值为用户键入字符。
	 * @author Bofu   
	 * @Date 2019年8月9日下午3:58:42
	 * @return
	 */
	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.println("选择错误,请重新输入:");
			}else break;
		}
		
		return c;
		
		
	}
	/**
	 * 
	 * @Description   从键盘上读取一个字符,并将其作为方法的返回值
	 * @author Bofu   
	 * @Date 2019年8月9日下午4:01:35
	 * @param limit
	 * @param blankReturn
	 * @return
	 */
	public static char readChar(){
		String str = readKeyBoard(1,false);
		return str.charAt(0);
	}
	
	/**
	 * 
	 * @Description	从键盘读取一个字符,并将其作为方法的返回值。
					如果用户不输入字符而直接回车,方法将以defaultValue 作为返回值。
	 * @author Bofu   
	 * @Date 2019年8月9日下午4:05:53
	 * @param limit
	 * @param blankReturn
	 * @return
	 */
	
	public static char readChar(char defaultValue){
		String str = readKeyBoard(1,true);
		return (str.length() == 0)? defaultValue : str.charAt(0);
	}
	/**
	 * 
	 * @Description   从键盘上读取一个不超过2位的整数,并将其作为方法的返回值。
	 * @author Bofu  
	 * @Date 2019年8月9日下午4:08:42
	 * @param limit
	 * @param blankReturn
	 * @return
	 */
	public static int readInt(){
		int n;
		for(;;){
			String str = readKeyBoard(2,false);
			try{
				n = Integer.parseInt(str);
				break;
			}catch (NumberFormatException e) {
				System.out.println("数字输入错误,请重新输入");
			}
		}
		return n;
	}
	/**
	 * 
	 * @Description   从键盘读取一个长度不超过2位的整数,并将其作为方法的返回值。
					      如果用户不输入字符而直接回车,方法将以defaultValue 作为返回值。
	 * @author Bofu   
	 * @Date 2019年8月9日下午4:12:34
	 * @param limit
	 * @param blankReturn
	 * @return
	 */
	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.println("数字输入错误,请重新输入");
			}
		}
		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;
	}
	/**
	 * 
	 * @Description  用于确认选择的输入。该方法从键盘读取‘Y’或’N’,并将其作为方法的返回值
	 * @author Bofu   
	 * @Date 2019年8月9日下午4:20:46
	 * @param limit
	 * @param blankReturn
	 * @return
	 */
	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.println("选择错误,请重新输入:");
			}
		}
		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;
	}
	
	
}




2.Customer类


public class Customer {
	
	//Customer的属性
	private String name;
	private char gender;
	private int age;
	private String phone;
	private String 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;
	}
	
	/**
	 * 
	 * @Description   5个属性的get和set的方法
	 * @author Bofu   
	 * @Date 2019年8月10日下午8:05:12
	 * @param 
	 */
	//name
	public void setName(String name){
		this.name = name;
	}
	
	public String getName(){
		return name;
	}
	
	//gender
	public void setGender(char gender){
		this.gender = gender;
	}
	public char getGender(){
		return gender;
	}
	
	//age
	public void setAge(int age){
		this.age = age;
	}
	public int getAge(){
		return age;
	}
	
	//phone
	public void setPhone(String phone){
		this.phone = phone;
	}
	public String getPhone(){
		return phone;
	}
	
	//email
	public void Setemail(String email){
		this.email = phone;
	}
	public String getEmail(){
		return email;
	}
	/**
	*显示对象数组中客户的属性
	*/
	public String getMessage(){
		return name+"\t" + gender + "\t" + age + "\t" + phone + "\t" + email;
	}
				

}



3.CustomerList类


public class CustomerList {
	
	private Customer[] customers;//customers用于表示数组中的元素
	private int total = 0;   //客户的总数
	
	
	/**
	 * 构造器,用于初始化customers
	 * @param totalCustomer
	 */
	public CustomerList(int totalCustomer){
		customers = new Customer[totalCustomer];
	}
	
	/**
	 * 
	 * @Description	  将输入的顾客信息存储在这个空间中
	 * @author Bofu   
	 * @Date 2019年8月10日下午9:07:57
	 * @param customer
	 * @return  true则代表信息存储成功,false则表示信息存储失败
	 */
	public boolean addCustomer(Customer customer){
		
		//形参customer,下面统一表示由CustomerView中传递过来的值
		if(total > customers.length){
			return false;
		}
		customers[total] = customer;
		total++;
		return true;
		
	}
	/**
	 * 
	 * @Description		修改客户属性的方法
	 * @author Bofu   
	 * @Date 2019年8月11日下午8:57:38
	 * @param index
	 * @param cust
	 * @return
	 */
	public boolean replaceCustomer(int index,Customer customer){
		
		//将customerView封装好的customer直接赋值到要修改的客户数组上
		customers[index] = customer;
		return true;
		
	}
	
	/**
	 * 
	 * @Description	  删除客户的方法
	 * @author Bofu   
	 * @Date 2019年8月11日下午8:56:01
	 * @param index
	 * @return
	 */
	public boolean deleteCustomer(int index){
		if(index >= total){
			return false;
		}
		
		//利用后面一个数组的元素覆盖前面的数组,然后将最后一个数组赋空值。
		for(int i = index;i < total-1; i++){
			customers[i] = customers[i+1];
		}
		customers[total-1] = null;
		total--;
		return true;
	}
	
	/**
	 * 
	 * @Description		客户列表方法,将所有的customers数组中的元素打印出来
	 * @author Bofu  
	 * @Date 2019年8月11日下午11:06:44
	 * @return cust
	 */
	public Customer[] ListCustomer(){
		Customer []customer = new Customer[total];
		for(int i = 0;i < total; i++){
			customer[i] = customers[i];
		}
		return customer;
	}
	
	

	
	
	/**
	 * 
	 * @Description		判断客户是否存在的方法
	 * @author Bofu   
	 * @Date 2019年8月11日下午8:59:26
	 * @param index
	 * @return false 则客户不在列表之中, true客户存在
	 */
	
	public Customer getCustomer(int index){
		if(index < 0 ||index >= total){
			return null;
		}
		return customers[index];
	}
	
	/**
	 * 显示客户列表标题
	 */

	public void showListTitle(){
		System.out.println("编号"+"\t姓名"+"\t性别"+"\t年龄"+"\t手机"+"\t\t邮箱");
	}
	
	
}




4.CustomerView类





public class CustomerView {
	//初始化数组,以下customer为类CustomerView的对象名
	private CustomerList customer = new CustomerList(10);
	
	public CustomerView(){
		//以下cust来表示用来存储数组元素的Customer类的对象名
		Customer cust = new Customer("老王", '男', 30, "010-5462135",
				"laoWang@email.com");
		customer.addCustomer(cust);
	}
	
	
	
	/**
	 * 
	 * @Description   界面显示和控制其他函数的方法
 	 * @author Bofu  
	 * @Date 2019年8月10日下午8:20:00
	 */
	public void enterMain(){
		//初始化一个isFlage用于跳出while()循环
		boolean isFlage = true;
		
	while(isFlage){
		System.out.println("-----------------------客户信息管理界面-----------------------\n            ");
		System.out.println("                        1.添加客户  ");
		System.out.println("                        2.修改客户  ");
		System.out.println("                        3.删除客户  ");
		System.out.println("                        4.查看客户  ");
		System.out.println("                        5.退        出  ");
		System.out.print("                        请选择1-5:");
		//利用CMUtility类做工具,用作键盘输入1~5
		char key = CMUtility.readMenuSelection();

		switch(key){
		case '1':
			addNewCustomer();
			break;
		case '2':
			modifyCustomer();
			break;
		case '3':
			deleteCustomer();
			break;
		case '4':
			listCustomer();
			break;
		case '5':
			System.out.println("请问是否退出(Y/N):");
			char isExit = CMUtility.readConfirmSelection();
			if(isExit == 'Y'){
				isFlage = false;
			}
			break;
		}
	}	
}
	
	
	/**
	 * 
	 * @Description   用户增加的方法
	 * @author Bofu   
	 * @Date 2019年8月10日下午8:21:33
	 */
	private void addNewCustomer(){
		//以下都用到工具类的使用
		System.out.println("-----------------------添加客户-----------------------");
		System.out.print("姓名:");
		String name = CMUtility.readString(4);
		
		System.out.print("性别:");
		char gender = CMUtility.readChar();
		
		System.out.print("年龄:");
		int age = CMUtility.readInt();
		
		System.out.print("电话:");
		String phone = CMUtility.readString(15);
		
		System.out.print("邮箱:");
		String email = CMUtility.readString(15);
		
		Customer cust= new Customer(name,gender,age,phone,email);
		boolean flage =customer.addCustomer(cust); 
		if(flage == true){
			System.out.println("-----------------------添加成功-----------------------");
		}else{
			System.out.println("-----------------------添加失败-----------------------");

		}
	}
	
	
	/**
	 * 
	 * @Description   修改用户的方法
	 * @author Bofu   
	 * @Date 2019年8月10日下午8:22:02
	 */
	private void modifyCustomer(){
		//定义一个Customer的对象
		Customer cust = null;
		//定义并初始化索引的值
		int index = 0;
		
		System.out.println("-----------------------修改客户-----------------------");

		
		for(;;){
			System.out.print("请选择要修改的客户编号(-1为退出选择):");
			index = CMUtility.readInt();
			//退出并返回界面
			if(index ==-1){
				return;
			}
			//用getCustomer方法返回一个值,null则表示没有这个索引值。有则直接返回索引customers[index]并跳出循环
			cust = customer.getCustomer(index-1);
			
			if(cust == null){
				System.out.println("客户不存在于列表中,请重新输入编号");
				
			}else
				break;
		}
		
		//符合要求后,对选中的编号进行修改
		System.out.print("姓名("+cust.getName()+"):");
		String name = CMUtility.readString(4, 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(15, cust.getPhone());
		
		System.out.print("邮箱("+cust.getEmail()+"):");
		String email = CMUtility.readString(15, cust.getEmail());
		
		//将修改后的信息封装在cust这里
		cust = new Customer(name, gender,age,phone,email);
		
		//判断flage是否符合要求
		boolean flage = customer.replaceCustomer(index-1, cust);
		if(flage == false){
			System.out.println("-----------------------修改客户失败-----------------------");
		}else{
			System.out.println("-----------------------修改客户成功-----------------------");

		}
		
	}

	/**
	 * 
	 * @Description	  删除用户的方法
	 * @author Bofu   
	 * @Date 2019年8月10日下午8:22:19
	 */
	private void deleteCustomer(){
		//与上面修改方法类似
		Customer cust = null;
		int index = 0;
		
		System.out.println("-----------------------删除客户-----------------------");

		
		for(;;){
			System.out.print("请选择你要删除的客户(-1请退出):");
			index = CMUtility.readInt();
			
			if(index == -1){
				return;
			}
			
			cust = customer.getCustomer(index-1);
			if(cust == null){
				System.out.println("客户不存在,请重新输入。");
				
			}
			break;
		}
		
		System.out.print("是否确定删除(Y/N):");
		char key = CMUtility.readConfirmSelection();
		if(key == 'Y'){
			boolean flage = customer.deleteCustomer(index-1);
			if( flage == true){
				System.out.println("-----------------------删除客户成功-----------------------");
			}else{
				System.out.println("-----------------------删除客户失败-----------------------");

			}
		}
	}
	
	
	/**
	 * 
	 * @Description	  用户列表查看方法
	 * @author Bofu   
	 * @Date 2019年8月10日下午8:22:37
	 */
	private void listCustomer(){
		
		System.out.println("-----------------------查询客户-----------------------");
		//显示客户列表
		Customer[] cust = customer.ListCustomer();

		if(cust.length == 0){
			System.out.println("没有客户信息。");
		}else{
			customer.showListTitle();
			for(int i =0;i < cust.length;i++){
				
				System.out.println((i+1)+"\t"+cust[i].getMessage());
			}
		}
		
		System.out.println("-----------------------查询客户完成-----------------------");
		
	}	
	
	
	
	
	/**
	 * 
	 * @Description   用于调用enterMain方法
	 * @author Bofu   
	 * @Date 2019年8月10日下午8:16:12
	 * @param args
	 */
	public static void main(String[] args) {
		//定义一个CustomerView的对象,让其构造器中的初始化可以运行
		CustomerView cView = new CustomerView();
		cView.enterMain();
	}
}

(以上,第一次写博客只是为了记录记录,如有不足的地方可以指出来讨论讨论,本人很乐意接受批评嘻嘻,大家一起努力加油吧!)

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值