客户信息管理软件的实现

简介: 客户信息管理软件的实现

软件结构设计

812f0bef9a54463db6ec7cd305faea68.png

CustomerView为主模块,负责菜单的显示和处理用户操作

CustomerList为Customer对象的管理模块,内部用数组管理一组Customer对象,并提供相应的添加、修改、删除和遍历方法,供CustomerView调用

Customer为实体对象,用来封装客户信息

工具类CMUtility

import java.util.Scanner;
/**
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;
    }
}

客户类Customer

public class Customer{
//客户基本属性(私有化)   解释:在私有化之后就不能利用类名.属性来访问该属性了,只有调用该类的public对应的方法才能对对象的属性值进行修改----这体现了封装性
  private String name;//名字
  private String sex;//性别
  private int age;//年龄
  private String phone;//电话
  private String email;//电子邮箱
  //多参构造器。  作用:在声明客户对象的时候直接对属性赋值
  public Customer(String name,String sex,int age,String phone,String email){
    //this指的是本对象
    this.name=name;
    this.sex=sex;
    this.age=age;
    this.phone=phone;
    this.email=email;
  }
  //下面就是get和set方法来对对应的对象的属性值进行修改和获取
  public void setName(String name){
    this.name=name;
  }
  public String getName(){
    return this.name;
  }
  public void setSex(String sex){
    this.sex=sex;
  }
  public String getSex(){
    return this.sex;
  }
  public void setAge(int age){
    this.age=age;
  }
  public int getAge(){
    return this.age;
  }
  public void setPhone(String phone){
    this.phone=phone;
  }
  public String getPhone(){
    return this.phone;
  }
  public void setEmail(String email){
    this.email=email;
  }
  public String getEmail(){
    return this.email;
  }
  //重写toString方法,在打印对象的时候,不会是输出地址值,而是会输出该对象对应的属性
  public String toString(){
    return("姓名:"+this.name+"\t性别:"+this.sex+"\t年龄:"+this.age+"\t电话号码:"+this.phone+"\t电子邮件:"+this.email);
  }
}

存储客户链表类

//存储对象类
public class CustomerList{
  //利用数组存储对象
  Customer[] customers;
  //设置链表大小
  int size=0;
  //构造器
  public CustomerList(int totalCustomer){
    customers=new Customer[totalCustomer];
  }
  //添加客户
  public boolean addCustomer(Customer c){
    //判断有没有满
    if(size==customers.length){
      return false;
    //没有满就将对象加入链表中
    }else{
      customers[size]=c;
      //链表大小+1
      size++;
    }
    return true;
  }
  //修改客户,利用客户所在编号
  public boolean replaceCustomer(int index,Customer cust){
    //判断编号是否合法,也就是有没有这个客户
    if(index>=size){
      return false;
    }else{
      //由于客户编号和实际存储位置的关系是客户编号-1==实际存储位置,所以存储时候index-1
      customers[index-1]=cust;
      return true;
    }
  }
  //删除客户
  public boolean deleteCustomer(int index){
    //判断客户编号是否合法
    if(index>=size){
      return false;
    }else{
      //由于是利用数组进行存储,所有在删除的时候需要将客户后面的客户前移一位
      for(int i=index;i<size;i++){
        customers[i]=customers[i+1];
      }
      //链表大小减一
      size--;
      return true;
    }
  }
  //获取所有客户信息
  public Customer[] getAllCustomers(){
    //遍历存储数组
    for(int i=0;i<size;i++){
      //由于Customer重写了toString方法,所有在打印Customer对象的时候调用的是重写的方法
      System.out.println("编号:"+(i+1)+"  "+customers[i]);
    }
    return customers;
  }
  //获取某个客户信息
  public Customer getCustomer(int index){
    //直接返回数组对象
    return customers[index-1];
  }
  //获取一共存储了多少对象
  public int getTotal(){
    return size;
  }
 }

主模块

显示用户操作

public class Customerview{
  //空参构造器
  public Customerview(){
  }
  //主菜单
  public void enterMainMenu(){
    System.out.println("***************客户信息管理软件***************\n");
    System.out.println("                 1 添加客户");
    System.out.println("                 2 修改客户");
    System.out.println("                 3 删除客户");
    System.out.println("                 4 客户列表");
    System.out.println("                 5 退    出\n");
    System.out.print("                 请选择(1-5):");
  }
  //添加客户菜单
  public void addNewCustomer(CustomerList list){
    System.out.println("***************添加用户*************");
    System.out.print("姓名:");
    //从控制台获取字符串,以下都是类似
    String str1=CMUtility.readString(3);
    System.out.print("性别:");
    String str2=CMUtility.readString(2);
    System.out.print("年龄:");
    int age=CMUtility.readInt();
    System.out.print("电话:");
    String str3=CMUtility.readString(20);
    System.out.print("邮箱:");
    String str4=CMUtility.readString(20);
    Customer c1=new Customer(str1,str2,age,str3,str4);
    list.addCustomer(c1);
    System.out.println("***************添加完成*************\n");
  }
  //修改客户菜单
  public void modifyCustomer(CustomerList list){
    System.out.println("***************修改客户*************\n");
    System.out.print("请输入用户编号(-1退出):");
    //从控制台获取数字
    int number=CMUtility.readInt(); 
    if(number==-1){
      return;
    }else{
      //获取某个对象
      Customer c=list.getCustomer(number);
      System.out.print("姓名("+c.getName()+"):");
      //修改值,如果直接按回车就返回设置的默认值,以下类似
      String str1=CMUtility.readString( 3, c.getName());
      System.out.print("性别("+c.getSex()+"):");
      String str2=CMUtility.readString(2, c.getSex());
      System.out.print("年龄("+c.getAge()+"):");
      int age=CMUtility.readInt(c.getAge());
      System.out.print("电话("+c.getPhone()+"):");
      String str3=CMUtility.readString(20,c.getPhone());
      System.out.print("邮箱("+c.getEmail()+"):");
      String str4=CMUtility.readString(20,c.getEmail());
      Customer endc=new Customer(str1,str2,age,str3,str4);
      //修改用户
      list.replaceCustomer(number,endc);
      System.out.println("***************修改完成*************\n");
    }
  }
  //删除客户
  public void deleteCustomer(CustomerList list){
    System.out.println("***************删除客户*************\n");
    System.out.print("请输入用户编号(-1退出):");
    int number=CMUtility.readInt(); 
    if(number==-1){
      return;
    }else{
      System.out.print("确定删除吗?(Y/N)");
      char chr=CMUtility.readConfirmSelection();
      if(chr=='Y'){
          list.deleteCustomer(number-1);
          System.out.println("***************删除完成*************\n");
      }else{
          return;
      }
    }
  }
  //打印所有用户
  public void listAllCustomers(CustomerList list){
    System.out.println("***************客户列表*************\n");
    list.getAllCustomers();
    System.out.println("***************客户列表完成*************\n");
  }
  //主模块的主方法
  public static void main(String[] args){
    //创建对象
    Customerview cv=new Customerview();
    CustomerList list=new CustomerList(10);
    //先将flag设置为true
    boolean flag=true;
    //利用循环体do while 来实现先运行一遍主菜单
    do{
      cv.enterMainMenu();
      //获取字符
      char c=CMUtility.readMenuSelection();
      switch(c){
        case '1':
          cv.addNewCustomer(list);
          break;
        case '2':
          cv.modifyCustomer(list);
          break;
        case '3':
          cv.deleteCustomer(list);
          break;
        case '4':
          list.getAllCustomers();
          break;
        case '5':
          System.out.print("确定退出吗?(Y/N)");
          char chr=CMUtility.readConfirmSelection();
          if(chr=='Y'){
            flag=false;
          }
          break;
      }
    }while(flag);
  }
}

运行截图

1、主页面

5b79a8b21c354ac992f34baae9271496.png

2、添加客户

d28aa5fd4d89445691b1e8a087e402c4.png

3、客户列表

18abafd4e8904efda63effc7d7707920.png

4、修改客户

13102e9526aa477abffa81a1494c07a6.png

5、删除客户

f05e522de72c4cc6a0ed1ea9a557bf11.png

6、退出

e95e3e330be04c45994ff6d19963a9eb.png

总结

本次实现客户信息管理系统主要是通过对象来存储用户,将用户数据封装在对象中,然后将对象存储在链表中,为了方便还创建主模块来方便的调用用户数据,更加直观的对用户进行操作!!!希望大家有问题能够指正,谢谢,❤!!!


相关文章
CRM系统适合企业高效管理客户
随着技术信息的发展,各个行业、各种领域的企业都越来越依赖CRM系统,并且它正在被广泛应用,更是说明了它对企业有着重大作用。
117 0
|
7天前
|
存储 数据采集 安全
客户管理CRM系统排行:使用最广泛的5款测评
在数字化时代,CRM系统成为企业提升销售效率、优化客户体验和增强竞争力的重要工具。本文综合评测了市场上五款广泛使用的CRM系统:销售易、天衣云、简道云、红圈和金蝶云之家,从推荐理由、产品功能、优势特色到适用企业,为读者提供全面参考。这些系统各具特色,企业应根据自身需求选择合适的CRM系统,以提升运营效率和客户满意度。
|
6月前
|
监控 安全 数据可视化
如何使用这些上网行为管理软件一键管控员工网络
使用WorkWin、Hubstaff和Veriato等上网行为管理软件,企业可以有效监控和提升员工工作效率。这些工具提供实时员工监控、时间统计、移动部署、权限控制、远程管理及安全监控等功能,确保工作安全,优化时间分配,防止数据泄露,并通过任务追踪促进项目进展。通过生成报告和分析,企业能识别生产力瓶颈和安全风险,从而制定改进策略。
145 3
|
4月前
|
监控 数据挖掘 数据安全/隐私保护
ERP系统中的客户投诉管理与解决方案解析
【7月更文挑战第25天】 ERP系统中的客户投诉管理与解决方案解析
369 1
|
4月前
|
监控 搜索推荐 数据挖掘
ERP系统中的客户关系管理与客户满意度调查解析
【7月更文挑战第25天】 ERP系统中的客户关系管理与客户满意度调查解析
294 1
|
6月前
|
人工智能 数据挖掘
掌握CRM+邮箱技巧:销售速度与客户信任双丰收
**销售提效关键:CRM+邮件融合** 在商业环境中,邮件仍然是重要的沟通工具。Zoho CRM通过集成邮件功能,提升了销售团队的效率。基础功能允许在CRM内直接发送和回复邮件,避免系统间切换,同时将邮件与客户记录关联,确保信息完整。销售信号提醒功能确保及时响应客户动态,而邮件模板则减少了重复工作。进阶功能如SalesInbox帮助优先处理重要邮件,邮件模板简化日常工作,邮件透视提供数据分析。高阶功能如智能邮件撰写和解读,利用AI优化写作和理解,提高处理速度。Zoho CRM通过深度整合邮件,助力销售团队实现高效协作和精准决策。
89 2
|
6月前
|
数据中心
|
存储 安全 数据管理
2.3连接企业存量资产管理系统|学习笔记(一)
快速学习2.3连接企业存量资产管理系统
2.3连接企业存量资产管理系统|学习笔记(一)
|
开发者
2.3连接企业存量资产管理系统|学习笔记(二)
快速学习2.3连接企业存量资产管理系统
2.3连接企业存量资产管理系统|学习笔记(二)
|
网络协议 测试技术 Go
客户管理系统-删除客户|学习笔记
快速学习客户管理系统-删除客户
客户管理系统-删除客户|学习笔记