本文主要是介绍【Java】—— Java实战项目——海豚电商客户管理系统,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
引言
在Java学习之路上,实战项目是提高编程能力和逻辑思维的重要方式。今天,我将分享一个简单而实用的Java项目——海豚电商客户管理系统。通过这个项目,你可以学习到如何使用Java进行面向对象编程,以及如何使用数组管理数据。
项目概述
海豚电商客户管理系统是一个基于控制台的Java应用程序,它能够添加、修改、删除和显示客户信息。系统的主要功能包括:
- 添加客户:向系统中添加一个新的客户信息。
- 修改客户:修改系统中已存在的客户信息。
- 删除客户:从系统中删除一个已存在的客户信息。
- 显示客户列表:显示系统中所有客户的列表。
- 退出系统:退出客户管理系统。
目 标
- 模拟实现一个基于文本界面的《海豚电商客户管理系统》
- 进一步掌握编程技巧和调试技巧,熟悉面向对象编程
- 主要涉及以下知识点:
- 类结构的使用:属性、方法及构造器
- 对象的创建与使用
- 类的封装性
- 声明和使用数组
- 数组的插入、删除和替换
- 关键字的使用:this
需求说明
模拟实现基于文本界面的《海豚电商客户管理系统》。
该软件能够实现对客户对象的插入、修改和删除(用数组实现),并能够打印客户明细表。项目采用分级菜单方式。主菜单如下:
-----------------海豚电商客户管理系统-----------------
1 添 加 客 户
2 修 改 客 户
3 删 除 客 户
4 客 户 列 表
5 退 出
请选择(1-5):_
- 每个客户的信息被保存在Customer对象中。
- 以一个Customer类型的数组来记录当前所有的客户。
- 每次“添加客户”(菜单1)后,客户(Customer)对象被添加到数组中。
- 每次“修改客户”(菜单2)后,修改后的客户(Customer)对象替换数组中原对象。
- 每次“删除客户”(菜单3)后,客户(Customer)对象被从数组中清除。
- 执行“客户列表 ”(菜单4)时,将列出数组中所有客户的信息
软件设计结构
该软件由以下三个模块组成:
- CustomerView为主模块,负责菜单的显示和处理用户操作
- CustomerList为Customer对象的管理模块,内部用数组管理一组Customer对象,并提供相应的添加、修改、删除和遍历方法,供CustomerView调用
- Customer为实体对象,用来封装客户信息
enterMainMenu()方法的活动图
键盘访问的实现
- 提供CMUtility.java类,可用来方便地实现键盘访问。
- 该类提供了以下静态方法:
- public static char readMenuSelection()
用途:该方法读取键盘,如果用户键入’1’-’5’中的任意字符,则方法返回。返回值为用户键入字符。 - public static char readChar() 和 public static char readChar(char defaultValue)
用途:这两个方法功能相同,均从键盘读取一个字符,并将其作为方法的返回值。
参数: defaultValue — 如果用户不输入字符而直接回车,方法将以defaultValue 作为返回值。(提示:此方法可在修改客户时调用) - public static int readInt() 和public static int readInt(int defaultValue)
用途:这两个方法功能相同,均从键盘读取一个长度不超过2位的 整数,并将其作为方法的返回值。
参数: defaultValue — 如果用户不输入字符而直接回车,方法将以defaultValue 作为返回值。 - public static String readString(int limit) 和
public static String readString(int limit, String defaultValue)
用途:这两个方法功能相同,均从键盘读取一个长度不超过limit的字符串,并将其作为方法的返回值。
参数:limit — 指定字符串的最大长度
defaultValue — 如果用户不输入字符而直接回车,方法将以defaultValue 作为返回 值。 - public static char readConfirmSelection()
用途:从键盘读取‘Y’或’N’,并将其作为方法的返回值。
- public static char readMenuSelection()
package exer3;/*** ClassName:IntelliJ IDEA* Description:** @Author zyjstart* @Create:2024/8/29 22:33*/import java.util.Scanner;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;}
}
第1步 — Customer类的设计
- Customer为实体类,用来封装客户信息
- 该类封装客户的以下信息:
- String name :客户姓名
- char gender :性别
- int age :年龄
- String phone:电话号码
- String email :电子邮箱
- 提供各属性的get/set方法
- 提供所需的构造器(可自行确定)
- 按照设计要求编写Customer类,并编译
- 在Customer 类中临时添加一个main方法中,作为单元测试方法。
在方法中创建Customer对象,并调用对象的各个方法,以测试该类是否编写正确。
package exer3;/*** ClassName:IntelliJ IDEA* Description:** @Author zyjstart* @Create:2024/8/29 22:36*/
public class 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;}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;}}
第2步 — CustomerList类的设计
- CustomerList为Customer对象的管理模块,内部使用数组管理一组Customer对象
- 本类封装以下信息:
- Customer[] customers:用来保存客户对象的数组
- int total = 0 :记录已保存客户对象的数量
- 该类至少提供以下构造器和方法:
- public CustomerList(int totalCustomer)
- public boolean replaceCustomer(int index, Customer cust)
- public boolean replaceCustomer(int index, Customer cust)
- public boolean deleteCustomer(int index)
- public Customer[] getAllCustomers()
- public Customer getCustomer(int index)
- public int getTotal()
- public CustomerList(int totalCustomer)
- 用途:构造器,用来初始化customers数组
- 参数:totalCustomer:指定customers数组的最大空间
- public boolean addCustomer(Customer customer)
- 用途:将参数customer添加组中最后一个客户对象记录之后
- 参数:customer指定要添加的客户对象
- 返回:添加成功返回true;false表示数组已满,无法添加
- public boolean replaceCustomer(int index, Customer cust)
- 用途:用参数customer替换数组中由index指定的对象
- 参数:customer指定替换的新客户对象
index指定所替换对象在数组中的位置,从0开始 - 返回:替换成功返回true;false表示索引无效,无法替换
- public boolean deleteCustomer(int index)
- 用途:从数组中删除参数index指定索引位置的客户对象记录
- 参数: index指定所删除对象在数组中的索引位置,从0开始
- 返回:删除成功返回true;false表示索引无效,无法删除
- public Customer[] getAllCustomers()
- 用途:返回数组中记录的所有客户对象
- 返回: Customer[] 数组中包含了当前所有客户对象,该数组长度与对象个数相同。
- public Customer getCustomer(int index)
- 用途:返回参数index指定索引位置的客户对象记录
- 参数: index指定所要获取的客户在数组中的索引位置,从0开始
- 返回:封装了客户信息的Customer对象
package exer3;/*** ClassName:IntelliJ IDEA* Description:* CustomerList为Customer对象的管理模块,内部使用数组管理一组Customer对象* @Author zyjstart* @Create:2024/8/29 22:40*/
public class CustomerList {private Customer[] customers; // 用来保存客户对象的数组private int total; // 记录已保存客户对象的数量// 构造器/*** 用途:构造器,用来初始化customers数组* @param totalCustomer 指定customers数组的最大空间*/public CustomerList(int totalCustomer) {customers = new Customer[totalCustomer];}/*** 用途:将参数customer添加组中最后一个客户对象记录之后* @param customer 指定要添加的客户对象* @return 添加成功返回true;false表示数组已满,无法添加*/public boolean addCustomer(Customer customer){if (total < customers.length){customers[total] = customer;total++;return true;}return false;}/*** 用途:用参数cust替换数组中由index指定的对象* @param index 指定所替换对象在数组中的位置,从0开始* @param cust 指定替换的新客户对象* @return 替换成功返回true;false表示索引无效,无法替换*/public boolean replaceCustomer(int index, Customer cust){if (index >= 0 && index < total){customers[index] = cust;return true;}return false;}/*** 用途:从数组中删除参数index指定索引位置的客户对象记录* @param index 指定所删除对象在数组中的索引位置,从0开始* @return 删除成功返回true;false表示索引无效,无法删除*/public boolean deleteCustomer(int index){if (index >=0 && index < total){for (int i = index;i < total - 1;i++){customers[i] = customers[i+1];}// 将有效数据最后一个位置置空customers[total - 1] = null;total--;return true;}return false;}/***用途:返回数组中记录的所有客户对象* @return Customer[] 数组中包含了当前所有客户对象,该数组长度与对象个数相同。*/public Customer[] getAllCustomers(){// 创建新的数组,长度与对象个数相同Customer[] custs = new Customer[total];for (int i = 0; i < custs.length; i++) {custs[i] = customers[i];}return custs;}/***用途:返回参数index指定索引位置的客户对象记录* @param index 指定所要获取的客户在数组中的索引位置,从0开始* @return 封装了客户信息的Customer对象*/public Customer getCustomer(int index){// 无效的if (index < 0 || index >= total){return null;}else {return customers[index];}}/*** 获取客户列表中客户的数量* @return total*/public int getTotal(){return total;}}
第3步 — CustomerView类的设计
- public void enterMainMenu()
- 用途:显示主菜单,响应用户输入,根据用户操作分别调用其他相应的成员方法(如addNewCustomer),以完成客户信息处理。
- private void addNewCustomer()
- private void modifyCustomer()
- private void deleteCustomer()
- private void listAllCustomers()
- 用途:这四个方法分别完成“添加客户”、“修改客户”、“删除客户”和“客户列表”等各菜单功能。
以上这四个方法仅供enterMainMenu()方法调用。
- public static void main(String[] args)
- 用途:创建CustomerView实例,并调用 enterMainMenu()方法以执行程序。
package exer3;/*** ClassName:IntelliJ IDEA* Description:* CustomerView为主模块,负责菜单的显示和处理用户操作** @Author zyjstart* @Create:2024/8/29 23:15*/
public class CustomerView {// 创建最大包含10个客户对象的CustomerList 对象,供以下各成员方法使用CustomerList customerList = new CustomerList(10);/*** 用途:显示主菜单,响应用户输入,根据用户操作分别调用其他相应的成员方法* (如addNewCustomer),以完成客户信息处理。*/public void enterMainMenu() {boolean isFlag = true;while (isFlag) {System.out.println("\n------------------海豚电商客户管理系统------------------\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):");char key = CMUtility.readMenuSelection();switch (key) {case '1':addNewCustomer();break;case '2':modifyCustomer();break;case '3':deleteCustomer();break;case '4':listAllCustomers();break;case '5':System.out.print("确认是否退出(Y/N): ");char isExit = CMUtility.readConfirmSelection();if (isExit == 'Y') {isFlag = false;}break;}}}/*** 添加客户方法*/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);// 将参数cust添加组中最后一个客户对象记录之后,添加成功返回true;false表示数组已满,无法添加boolean flag = customerList.addCustomer(cust);if (flag) {System.out.println("------------------添加成功---------------------");} else {System.out.println("---------------记录已满,无法添加-----------------------");}}/*** 删除客户方法*/private void modifyCustomer() {System.out.println("---------------修改客户----------------");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("无法找到指定客户!");}elsebreak;}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 = new Customer(name,gender,age,phone,email);//用参数cust替换数组中由index指定的对象boolean flag = customerList.replaceCustomer(index - 1,cust);if (flag){System.out.println("----------------修改成功------------------");}else {System.out.println("-------------无法找到指定客户,修改失败----------------");}}/*** 删除客户方法*/private void deleteCustomer() {System.out.println("---------------删除客户----------------");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("无法找到指定客户!");}elsebreak;}System.out.print("确认是否删除(Y/N):");char y = CMUtility.readConfirmSelection();// 没有删除就return跳出if (y == 'N'){return;}boolean flag = customerList.deleteCustomer(index - 1);if (flag){System.out.println("---------------删除完成---------------");}else {System.out.println("----------无法找到指定客户,删除失败------------");}}private void listAllCustomers() {System.out.println("---------------------------客户列表---------------------------");Customer[] allCustomers = customerList.getAllCustomers();if (allCustomers.length == 0){System.out.println("没有客户记录!");}else {System.out.println("编号\t姓名\t\t性别\t\t年龄\t电话\t\t\t邮箱");for (int i=0;i< allCustomers.length;i++){System.out.println(i + 1 + "\t" + allCustomers[i].getName() + "\t" +allCustomers[i].getGender() + "\t" + allCustomers[i].getAge() + "\t\t" +allCustomers[i].getPhone() + "\t" + allCustomers[i].getEmail());}System.out.println("-------------------------客户列表完成-------------------------");}}public static void main(String[] args) {CustomerView view = new CustomerView();view.enterMainMenu();}}
运行结果:
1、添加客户
2、修改客户
3、删除客户
4、显示客户列表
由于前边我们添加的客户删除了,所以这里没有客户记录
下面我们添加两个客户信息,再显示一下客户信息
对不齐可以自己调节一下。
5、退出
总结
通过这个项目,你不仅学习了如何使用Java进行面向对象编程,还学会了如何使用数组来管理数据。希望这个项目能对你的Java学习之路有所帮助。如果你有任何问题或建议,请随时在评论区留言。
结束语
感谢你的阅读!如果你觉得这个项目对你有帮助,请点赞和分享,让更多的人受益。如果你有任何问题或想要交流更多Java编程的经验,欢迎在评论区留言。期待与你的交流!
这篇关于【Java】—— Java实战项目——海豚电商客户管理系统的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!