【Java】—— Java实战项目——海豚电商客户管理系统

2024-08-31 15:04

本文主要是介绍【Java】—— Java实战项目——海豚电商客户管理系统,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

引言

        在Java学习之路上,实战项目是提高编程能力和逻辑思维的重要方式。今天,我将分享一个简单而实用的Java项目——海豚电商客户管理系统。通过这个项目,你可以学习到如何使用Java进行面向对象编程,以及如何使用数组管理数据。

项目概述

海豚电商客户管理系统是一个基于控制台的Java应用程序,它能够添加、修改、删除和显示客户信息。系统的主要功能包括:

  1. 添加客户:向系统中添加一个新的客户信息。
  2. 修改客户:修改系统中已存在的客户信息。
  3. 删除客户:从系统中删除一个已存在的客户信息。
  4. 显示客户列表:显示系统中所有客户的列表。
  5. 退出系统:退出客户管理系统。

目 标

  • 模拟实现一个基于文本界面的《海豚电商客户管理系统
  • 进一步掌握编程技巧和调试技巧,熟悉面向对象编程
  • 主要涉及以下知识点:
    • 类结构的使用:属性、方法及构造器
    • 对象的创建与使用
    • 类的封装性
    • 声明和使用数组
    • 数组的插入、删除和替换
    • 关键字的使用:this

需求说明

模拟实现基于文本界面的《海豚电商客户管理系统

 该软件能够实现对客户对象的插入、修改和删除(用数组实现),并能够打印客户明细表。项目采用分级菜单方式。主菜单如下:

             -----------------海豚电商客户管理系统-----------------

                                     1 添 加 客 户

                                     2 修 改 客 户

                                     3 删 除 客 户

                                     4 客 户 列 表

                                     5 退           出

                                     请选择(1-5)_

  • 每个客户的信息被保存在Customer对象中。
  • 以一个Customer类型的数组来记录当前所有的客户。
  • 每次“添加客户”(菜单1)后,客户(Customer)对象被添加到数组中。
  • 每次“修改客户”(菜单2)后,修改后的客户(Customer)对象替换数组中原对象。
  • 每次“删除客户”(菜单3)后,客户(Customer)对象被从数组中清除。
  • 执行“客户列表 ”(菜单4)时,将列出数组中所有客户的信息

软件设计结构

该软件由以下三个模块组成:

  • CustomerView为主模块,负责菜单的显示和处理用户操作
  • CustomerListCustomer对象的管理模块,内部用数组管理一组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’,并将其作为方法的返回值。
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方法
  • 提供所需的构造器(可自行确定)
  1. 按照设计要求编写Customer类,并编译
  2. 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;}}

第2CustomerList类的设计

  • 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指定要添加的客户对象
    • 返回:添加成功返回truefalse表示数组已满,无法添加
  • public boolean replaceCustomer(int index, Customer cust)
    • ​​​​​​​用途:用参数customer替换数组中由index指定的对象
    • 参数:customer指定替换的新客户对象
                 index
      指定所替换对象在数组中的位置,从0开始
    • 返回:替换成功返回truefalse表示索引无效,无法替换
  • public boolean deleteCustomer(int index)
    • ​​​​​​​用途:从数组中删除参数index指定索引位置的客户对象记录
    • 参数: index指定所删除对象在数组中的索引位置,从0开始
    • 返回:删除成功返回truefalse表示索引无效,无法删除
  • 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;}}

第3CustomerView类的设计

  • 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实战项目——海豚电商客户管理系统的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1124240

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory