00010.02最基础客户信息管理软件(意义类的小项目,练习基础,不涉及数据库)

-## 一、项目架构分析

今天我们来学习第一个意义类的小项目,对数据的增删改查,甚至都暂时不涉及数据库
在登录注册中,添加数据是哪一个过程呢?
其实我们注册,就是一个添加用户的过程,那么登录又是什么操作呢?登录其实就是查询,判断你的用户名密码
展示数据也是一个查询的过程,添加购物车,如果你的购物车是用数据库来存的话,那么也是一个添加操作,结算是一个修改操作
各种复杂的项目都可以分解为增删改查
在这里插入图片描述
分析项目要求,我们暂时连继承和多态都没有用到,
引用数据也叫对象数组
分析一下架构
在这里插入图片描述
那么由于我们不使用数据库,数据访问层在这里就暂时不要了
在这里插入图片描述
数据的存储我们这里使用数组
业务逻辑搞清楚了,就可以开始搭建项目了

在这里插入图片描述
怎么体现呢?先不建类,我们先建包
在这里插入图片描述
那么他们两层直接是怎么传数据的呢?
直接调用方法就行了,那么这里·我们又引入了另外一种知识,实体类
Javabean实体
在这里插入图片描述
再建立一个包
在这里插入图片描述
我们还可以建一个测试
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、主界面

在这里插入图片描述
在这里插入图片描述
框架大致搭好
在这里插入图片描述
在这里插入图片描述
新建一个测试类,把主方法放进去,然后调用前面写的方法,让它运行起来
在这里插入图片描述
创建实体类
在这里插入图片描述

/*
String name :客户姓名
char gender  :性别
int age      :年龄
String phone:电话号码
String email :电子邮箱
 */
package com.atguigu.bean;

public class Customer {
	//成员变量
	private String name;
	private char gender;
	private int age;
	private String phone;
	private String email;
	//无参构造
	public Customer(){
		super();
	}
	//有参构造
	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;
	}
	//get/set
	public String getName(){
		return name;
	}
	public void setName(String name){
		this.name=name;
	}
	
	public char getGender(){
		return gender;
	}
	public void setName(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 SetEmail(String email){
		this.email=email;
	}
	//
	public String getEmail(){
		return email;
	}
	public void SetName(String email){
		this.email=email;
	}
}

三、添加功能

//(1)键盘输入客户信息
//(2)创建Customer对象
//(3)调用CustomerService的 addCustomer(Customer c)
架构如下
在这里插入图片描述
实际上前面已经有分析过
增加的部分具体全部代码如下:
test里面,我们的测试类,test主类里面去调用菜单

package com.atguigu.test;

import com.atguigu.view.CustomerView;

public class test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		CustomerView c=new CustomerView();
		c.menu();
	}

}

CustomerView里面,我们加载和展示菜单,让用户可以进行菜单的选择,以及我们自己做好对应的功能(当然,不直接写在这,我们去调Service业务逻辑层)

package com.atguigu.view;

import com.atguigu.bean.Customer;
import com.atguigu.utils.CMUtility;
import com.atguigu.service.CustomerService;

public class CustomerView {
	private CustomerService cs=new CustomerService();//不应该是局部变量
	public void menu() {
		System.out.println("------客户信息管理软件-----------");
		System.out.println("/t/t 1、添加客户");
		System.out.println("/t/t 2、修改客户");
		System.out.println("/t/t 3、删除客户");
		System.out.println("/t/t 4、查看客户列表");
		System.out.println("/t/t 5、退                出");
		
		System.out.println("请选择1-5");
		char select =CMUtility.readMenuSelection();
		
		switch (select) {
		case '1':
			add();
			break;
		case '2':
			update();
			break;
		case '3':
			delete();
			break;
		case '4':
			list();
			break;
		case '5':
			System.out.println("确定要退出吗?Y/N");
			char confirm=CMUtility.readConfirmSelection();
			if(confirm=='Y'){
				return;
			}
		}
	}
	
	private void add() {
		//第一步:键盘输入客户信息
		System.out.println("-------添加客户--------- ");
		System.out.print("姓名: ");
		String name=CMUtility.readString(20);//限制String类型且长度不超过20
		
		System.out.print("性别: ");
		char gender=CMUtility.readChar();//限定是char
		
		System.out.print("年龄");
		int age=CMUtility.readInt();//限定是数字
		
		System.out.print("电话:");
		String tel = CMUtility.readString(11);//限制String类型且长度不超过11,一般手机都是11位
		
		System.out.print("邮箱:");
		String email=CMUtility.readString(32);//限制String类型且长度不超过32

		//(2)创建Customer对象
		Customer c=new Customer(name,gender,age,tel,email);
		//(3)调用CustomerService的add
		CustomerService cs=new CustomerService();//不应该是局部变量
		cs.addCustomer(c);
		System.out.println("-------------添加完成");
		menu();
	}
	public void delete(){
		
	}
	public void list(){
		
	}
	public void update(){
		
	}

}

CMUtility类,直接复制就行,这个公共类,提供给我们用户输入的功能以及对应的数据验证,我们暂时不考虑它怎么具体实现,我们只要知道它怎么用就行了
,源码如下

package com.atguigu.utils;

import java.util.*;

//static修饰的方法,可以通过"类名.方法"进行调用,当然也可以创建对象,再用"对象.方法"调用
public class CMUtility {
    private static Scanner scanner = new Scanner(System.in);
    
	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);
    }

    public static char readChar(char defaultValue) {
        String str = readKeyBoard(1, true);
        return (str.length() == 0) ? defaultValue : str.charAt(0);
    }

    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;
    }

    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;
    }

    public static String readString(int limit) {
        return readKeyBoard(limit, false);
    }

    public static String readString(int limit, String defaultValue) {
        String str = readKeyBoard(limit, true);
        return str.equals("")? defaultValue : str;
    }

    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;
    }
}

下面我们看重点对象 Customer实体类,这个非常重要,我们需要依赖这个实体类对象来进行各种数据传值,我们把它放在这个包下面 com.atguigu.bean

/*
String name :客户姓名
char gender  :性别
int age      :年龄
String phone:电话号码
String email :电子邮箱
 */
package com.atguigu.bean;

public class Customer {
	//成员变量
	private String name;
	private char gender;
	private int age;
	private String phone;
	private String email;
	//无参构造
	public Customer(){
		//super();
	}
	//有参构造
	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;
	}
	//get/set
	public String getName(){
		return name;
	}
	public void setName(String name){
		this.name=name;
	}
	
	public char getGender(){
		return gender;
	}
	public void setName(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 SetEmail(String email){
		this.email=email;
	}
	//
	public String getEmail(){
		return email;
	}
	public void SetName(String email){
		this.email=email;
	}
}

下面就是业务逻辑层了,目前写得很简单

package com.atguigu.service;

import com.atguigu.bean.Customer;

public class CustomerService {
	private Customer[]all;//用来存储客户对象
	private int total;//记录实际存储的客户的数量
	
	public CustomerService(){
		all=new Customer[2];
	}
	public CustomerService(int initSize){
		all = new Customer[initSize];
	}
	public void addCustomer(Customer c){
		//(1)判断数组是否已满
		if(total>all.length){
			System.out.println("数组已满");
			return;
		}
		//(2)把c存储all数组中
		all[total+1]=c;
		
	}
}

然后再跳到视图层CustomerView

在这里插入图片描述
这样添加功能就完成了

四、、Debug调试

代码调试是java的基础中的基础,我们就此项目来进行代码Debug调试的学习
1、我们怎么去Debug呢?
当你遇到了不知道哪里错的时候就需要Debug了,那么怎么调试(Debug)呢,在左边空格地方双击一下
在这里插入图片描述
你打的那个点就叫断点,那么我们又引入了另外一个概念,什么叫做单步调试呢?
调试点击“小虫子”
在这里插入图片描述
点击之后1出现调试画面
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

五、项目结束、删改查

在这里插入图片描述
在这里插入图片描述

最终代码如下:
test类

package com.atguigu.test;

import com.atguigu.view.CustomerView;

public class Test {

	public static void main(String[] args) {
		CustomerView view = new CustomerView();
		view.menu();
	}

}

Customer 类

/*
String name :客户姓名
char gender  :性别
int age      :年龄
String phone:电话号码
String email :电子邮箱
 */
package com.atguigu.bean;

public class Customer {
	//成员变量
	private String name;
	private char gender;
	private int age;
	private String phone;
	private String email;
	//无参构造
	public Customer(){
		//super();
	}
	//有参构造
	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;
	}
	//get/set
	public String getName(){
		return name;
	}
	public void setName(String name){
		this.name=name;
	}
	
	public char getGender(){
		return gender;
	}
	public void setName(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 SetEmail(String email){
		this.email=email;
	}
	//
	public String getEmail(){
		return email;
	}
	public void SetName(String email){
		this.email=email;
	}
	public String getInfo(){
		return name+"\t"+gender+"\t"+age+"\t"+phone+"\t"+email;
	}
}

CMUtility 公共方法类,用于接收用户输入

package com.atguigu.utils;

import java.util.*;

//static修饰的方法,可以通过"类名.方法"进行调用,当然也可以创建对象,再用"对象.方法"调用
public class CMUtility {
    private static Scanner scanner = new Scanner(System.in);
    
	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);
    }

    public static char readChar(char defaultValue) {
        String str = readKeyBoard(1, true);
        return (str.length() == 0) ? defaultValue : str.charAt(0);
    }

    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;
    }

    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;
    }

    public static String readString(int limit) {
        return readKeyBoard(limit, false);
    }

    public static String readString(int limit, String defaultValue) {
        String str = readKeyBoard(limit, true);
        return str.equals("")? defaultValue : str;
    }

    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;
    }
}


CustomerService 类

package com.atguigu.service;

import java.util.Arrays;

import com.atguigu.bean.Customer;

public class CustomerService {
	private Customer[]all;//用来存储客户对象
	private int total;//记录实际存储的客户的数量
	
	public CustomerService(){
		all=new Customer[2];
	}
	public CustomerService(int initSize){
		all = new Customer[initSize];
	}
	//添加一个客户对象到当前数组中
	public void addCustomer(Customer c){
		//(1)判断数组是否已满
		if(total>=all.length){
			System.out.println("数组已满");
			return;
		}
		//(2)把c存储all数组中
		all[total]=c;
		total++;
		//all[total++]=c;
		
	}
	//返回所有已经存储的客户对象
	public Customer[]getAll(){
		//方法一推荐使用:直接用复制数据的方式,一行代码搞定
		//return Arrays.copyOf(all, total);//复制一个新数组,长度为total
		
		//方法二:
		Customer[] result=new Customer[total];
		for(int i=0; i<total;i++){
			result[i]=all[i];
		}
		return result;
		
	}
	//根据客户的编号进行删除客户对象操作
	public void removeById(int id){
		//(1)确定下标
		int index =id-1;
		//(2)检查下标合理性
		if(index<0||index>total){
			System.out.println(id+"对应的客户不存在");//以后这个可以抛异常解决
			return;
		}
		//(3)把[index]后面的元素往前移动
		System.arraycopy(all, index+1, all, index, total-index-1);
		all[--total]=null;
	}
	//根据客户编号查询一个客户对象的方法
	public Customer getById(int id){
		//(1)确定下标
		int index =id-1;
		//(2)考虑下标的合理性
		if(index<0||index>=total){
			System.out.println(id+"对应的客户不存在");//以后这个可以抛异常解决\
			return null;
		}
		//(3)返回[index]位置的客户对象
		return all[index];
	}
	//根据客户编号,替换原原来的客户对象
	public void replace(int id,Customer newCustomer){
		//(1)先确定index下标
		int index =id-1;
		//(2)检查下标
		if(index<0||index>=total){
			System.out.println(id+"对应的客户不存在");//以后这个可以抛异常解决\
			return;
		}
		//(3)替换
		all[index]= newCustomer;
		
	}
}
package com.atguigu.view;

import com.atguigu.bean.Customer;
import com.atguigu.utils.CMUtility;
import com.atguigu.service.CustomerService;

public class CustomerView {
	private CustomerService cs=new CustomerService();//不应该是局部变量,而应该是成员变量
	//cs=new CustomerService();//不应该是局部变量
	public void  menu() {
		System.out.println("------客户信息管理软件-----------");
		System.out.println("/t/t 1、添加客户");
		System.out.println("/t/t 2、修改客户");
		System.out.println("/t/t 3、删除客户");
		System.out.println("/t/t 4、查看客户列表");
		System.out.println("/t/t 5、退                出");
		
		System.out.println("请选择1-5");
		char select =CMUtility.readMenuSelection();
		
		switch (select) {
		case '1':
			add();
			break;
		case '2':
			update();
			break;
		case '3':
			delete();
			break;
		case '4':
			list();
			break;
		case '5':
			System.out.println("确定要退出吗?Y/N");
			char confirm=CMUtility.readConfirmSelection();
			if(confirm=='Y'){
				return;
			}
		}
	}
	public void list(){
		//(1)调用CustomService类的getAll方法获取 已经存储的所有客户对象
		Customer[]all=cs.getAll();
		//遍历显示
		System.out.println("--------客户列表--------------");
		System.out.println("编号\t姓名 \t性别\t年龄\t电话\t邮箱");
		for (int i = 0; i < all.length; i++) {
			System.out.println((i+1)+"\t"+ all[i].getInfo());
		}
		System.out.println();
		System.out.println("-------------客户列表完成-----------------------");
		menu();
	}
	public void delete(){
		System.out.println("-------------删除客户-----------------------");
		System.out.println("请选择要删除的客户编号(-1)退出");
		int id =CMUtility.readInt();//获取用户输入的客户编号
		if(id==-1){//如果是-1就结束
			return;
		}
		System.out.print("确认删除(Y/N):");
		char confirm=CMUtility.readConfirmSelection();
		if(confirm=='N'){//如果不删除就结束
			//return;
			menu();
		}
		//调用CustomService的 removeById(int id)进行删除操作
		cs.removeById(id);
		
		System.out.println("-------------删除完成-----------------------");
		menu();
	}
	//修改
	public void update(){
		System.out.println("-------------修改客户-----------------------");
		System.out.println("请选择要修改的客户编号(-1)退出");
		int id =CMUtility.readInt();//获取用户输入的客户编号
		if(id==-1){//如果是-1就结束
			return;
		}
		//调用CustomService的 getById(int id)获取该客户对象的原来的信息
		Customer oldcustomer= cs.getById(id);
		
		//输入新的数据
		System.out.print("姓名("+oldcustomer.getName()+")");
		String name=CMUtility.readString(20, oldcustomer.getName());
		
		System.out.print("性别("+oldcustomer.getGender()+")");
		char gender=CMUtility.readChar(oldcustomer.getGender());
		
		System.out.print("年龄("+oldcustomer.getAge()+")");
		int age=CMUtility.readInt(oldcustomer.getAge());
		
		System.out.print("电脑("+oldcustomer.getPhone()+")");
		String phone=CMUtility.readString(11,oldcustomer.getPhone());
		
		System.out.print("邮箱("+oldcustomer.getEmail()+")");
		String email=CMUtility.readString(32,oldcustomer.getEmail());
		
		//获取完输入的数据后
		//创建 一个新的客户对象
		Customer newCustomer = new Customer(name,gender,age,phone,email);
		
		//替换数组中原来的数组对象
		cs.replace(id, newCustomer);
		
		System.out.print("-------------修改完成-----------------------");
		menu();
	}
	private void add() {
		//第一步:键盘输入客户信息
		System.out.println("-------添加客户--------- ");
		System.out.print("姓名: ");
		String name=CMUtility.readString(20);//限制String类型且长度不超过20
		
		System.out.print("性别: ");
		char gender=CMUtility.readChar();//限定是char
		
		System.out.print("年龄:");
		int age=CMUtility.readInt();//限定是数字
		
		System.out.print("电话:");
		String tel = CMUtility.readString(11);//限制String类型且长度不超过11,一般手机都是11位
		
		System.out.print("邮箱:");
		String email=CMUtility.readString(32);//限制String类型且长度不超过32

		//(2)创建Customer对象
		Customer c=new Customer(name,gender,age,tel,email);
		//(3)调用CustomerService的add
		
		cs.addCustomer(c);
		System.out.println("-------------添加完成---------------");
		menu();
	}
}


搭建好就能直接运行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值