拼电商客户管理系统
内容来自:尚硅谷
难度:easy
目 标
l 模拟实现一个基于文本界面的 《 拼电商客户管理系统 》l 进一步掌握编程技巧和调试技巧,熟悉面向对象编程l 主要涉及以下知识点:Ø 类结构的使用:属性、方法及构造器Ø 对象的创建与使用Ø 类的封装性Ø 声明和使用数组Ø 数组的插入、删除和替换关键字的使用:this
需求说明
模拟实现基于文本界面的《拼电商客户管理系统》。
该软件能够实现对客户对象的插入、修改和删除(用数组实现),并能够打印客户明细表。
项目采用分级菜单方式。主菜单如下:
-----------------拼电商客户管理系统-----------------
1 添 加 客 户
2 修 改 客 户
3 删 除 客 户
4 客 户 列 表
5 退 出
请选择(1-5):_
• 每个客户的信息被保存在 Customer 对象中。• 以一个 Customer 类型的数组来记录当前所有的客户。• 每次“添加客户”(菜单 1 )后,客户( Customer )对象被添加到数组中。• 每次“修改客户”(菜单 2 )后,修改后的客户( Customer )对象替换数组中原对象。• 每次“删除客户”(菜单 3 )后,客户( Customer )对象被从数组中清除。• 执行“客户列表 ”(菜单 4 )时,将列出数组中所有客户的信息。
“添加客户”的界面及操作过程如下所示:
……
请选择(1-5):1
---------------------添加客户---------------------
姓名:佟刚
性别:男
年龄:35
电话:010-56253825
邮箱:tongtong@atguigu.com
---------------------添加完成---------------------
“修改客户”的界面及操作过程如下所示:
……
请选择(1-5):2
---------------------修改客户---------------------
请选择待修改客户编号(-1退出):1
姓名(佟刚):<直接回车表示不修改>
性别(男):
年龄(35):
电话(010-56253825):
邮箱(tongtong@atguigu.com):tongg@atguigu.com
---------------------修改完成---------------------
“删除客户”的界面及操作过程如下所示:
……
请选择(1-5):3
---------------------删除客户---------------------
请选择待删除客户编号(-1退出):1
确认是否删除(Y/N):y
---------------------删除完成---------------------
“客户列表”的界面及操作过程如下所示:
……
请选择(1-5):4
---------------------------客户列表---------------------------
编号 姓名 性别 年龄 电话 邮箱
1 佟刚 男 45 010-56253825 tong@abc.com
2 封捷 女 36 010-56253825 fengjie@ibm.com
3 雷丰阳 男 32 010-56253825 leify@163.com
-------------------------客户列表完成-------------------------
第1步 — 实现Customer类
1. 按照设计要求编写 Customer 类,并编译2. 在 Customer 类中临时添加一个 main 方法中,作为单元测试方法。在方法中创建Customer对象,并调用对象的各个方法,以测试该类是否编写正确。
//package com.atguigu.p2;public class Customer {private String name;private char gender;private int age;private String phone;private String email;public Customer(String name, char gender, int age) {this(name, gender, age, "", "");}
// public Customer(String name, char gender, int age) {
// this(name, gender, age, "", "");
// }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;}public String getDetails() {return name + "\t" + gender + "\t\t" + age + "\t\t" + phone + "\t" + email;}
}
第2步 — CustomerList类的设计
l CustomerList 为 Customer 对象的管理模块,内部使用数组管理一组 Customer 对象l 本类封装以下信息:Ø Customer[] customers :用来保存客户对象的数组Ø int total = 0 :记录已保存客户对象的数量l 该类至少提供以下构造器和方法:Ø public CustomerList (int totalCustomer )Ø public boolean addCustomer (Customer customer)Ø public boolean replaceCustomer (int index, Customer cust )Ø public boolean deleteCustomer (int index)Ø public Customer[] getAllCustomers ()Ø public Customer getCustomer (int index)Ø public int getTotal ()
l public CustomerList ( int totalCustomer )Ø 用途:构造器,用来初始化 customers 数组Ø 参数: totalCustomer :指定 customers 数组的最大空间l public boolean addCustomer (Customer customer )Ø 用途:将参数 customer 添加组中最后一个客户对象记录之后Ø 参数: customer 指定要添加的客户对象Ø 返回:添加成功返回 true ; false 表示数组已满,无法添加l public boolean replaceCustomer ( int index, Customer cust )Ø 用途:用参数 customer 替换数组中由 index 指定的对象Ø 参数: customer 指定替换的新客户对象index指定所替换对象在数组中的位置,从0开始
Ø 返回:替换成功返回 true ; false 表示索引无效,无法替换
l public boolean deleteCustomer ( int index)Ø 用途:从数组中删除参数 index 指定索引位置的客户对象记录Ø 参数: index 指定所删除对象在数组中的索引位置,从 0 开始Ø 返回:删除成功返回 true ; false 表示索引无效,无法删除l public Customer[] getAllCustomers ()Ø 用途:返回数组中记录的所有客户对象Ø 返回: Customer[] 数组中包含了当前所有客户对象,该数组长度与对象个数相同。l public Customer getCustomer ( int index)Ø 用途:返回参数 index 指定索引位置的客户对象记录Ø 参数: index 指定所要获取的客户在数组中的索引位置,从 0 开始Ø 返回:封装了客户信息的 Customer 对象
1. 按照设计要求编写 CustomerList 类,并编译2. 在 CustomerList 类中临时添加一个 main 方法中,作为单元测试方法。3. 在方法中创建 CustomerList 对象(最多存放 5 个客户对象),然后分别用模拟数据调用以下各个方法,以测试各方法是否编写正确:• addCustomer ()• replaceCustomer ()• deleteCustomer ()• getAllCustomers ()• getCustomer ()• getTotal ()
4. 进一步测试以下情况,以验证该类是否编写正确:• 调用 addCustomer 方法,添加至少 5 个以上客户对象时• 当数组中客户对象数量为 0 时,仍然调用 replaceCustomer 方法替换对象• 当数组中客户对象数量为 0 时,仍然调用 deleteCustomer 方法删除对象• 对于 replaceCustomer 、 deleteCustomer 和 getCustomer 的调用,当参数 index 的值无效时(例如 -1 或 6 )• getAllCustomers 方法返回的数组长度是否与实际的客户对象数量一致
public class CustomerList {private Customer[] customers;private int total = 0;public CustomerList(int totalCustomer) {customers = new Customer[totalCustomer];}public boolean addCustomer(Customer customer) {if (total >= customers.length) {return false;}customers[total++] = customer;return true;}public Customer getCustomer(int index) {if (index < 0 || index >= total) {return null;}return customers[index];}public boolean replaceCustomer(int index, Customer cust) {if (index < 0 || index >= total) {return false;}customers[index] = cust;return true;}public boolean deleteCustomer(int index) {if (index < 0 || index >= total) {return false;}for (int i = index; i < total - 1; i++) {customers[i] = customers[i + 1];}customers[--total] = null;return true;}public Customer[] getAllCustomers() {Customer[] custs = new Customer[total];for (int i = 0; i < total; i++) {custs[i] = customers[i];}return custs;}}
第3步 — CustomerView类的设计
l CustomerView 为主模块,负责菜单的显示和处理用户操作l 本类封装以下信息:Ø CustomerList customerList = new CustomerList (10);创建最大包含10个客户对象的CustomerList 对象,供以下各成员方法使用。
l 该类至少提供以下方法:Ø public void enterMainMenu ()Ø private void addNewCustomer ()Ø private void modifyCustomer ()Ø private void deleteCustomer ()Ø private void listAllCustomers ()public static void main(String[] args)
l public void enterMainMenu ()Ø 用途:显示主菜单,响应用户输入,根据用户操作分别调用其他相应的成员方法(如 addNewCustomer ),以完成客户信息处理。l private void addNewCustomer ()private void modifyCustomer()
private void deleteCustomer()
private void listAllCustomers()
Ø 用途:这四个方法分别完成“添加客户”、“修改客户”、“删除客户”和“客户列表”等各菜单功能。这四个方法仅供enterMainMenu()方法调用。
l public static void main(String[] args )Ø 用途:创建 CustomerView 实例,并调用 enterMainMenu () 方法以执行程序。
1. 按照设计要求编写 CustomerView 类,逐一实现各个方法,并编译2. 执行 main 方法中,测试以下功能:• 主菜单显示及操作是否正确• “添加客户”操作是否正确,给用户的提示是否明确合理;测试当添加的客户总数超过 10 时,运行是否正确• “修改客户”操作是否正确,给用户的提示是否明确合理;• “删除客户”操作是否正确,给用户的提示是否明确合理;• “客户列表”操作是否正确,表格是否规整;3. 思考以下问题:• 当软件退出时,所有客户信息便丢失了!运用什么手段可以将这些信息长久保存,以便在下一次运行软件时继续使用?
import java.util.Scanner;
//package com.atguigu02.project;
public class CustomerView {private CustomerList customers=new CustomerList(10);public CustomerView() {Customer cust = new Customer("张三", '男', 30, "13843255423","abc@126.com");customers.addCustomer(cust);}public void jianmie(){boolean flag = true;do {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):_");Scanner sc = new Scanner(System.in);int choice = sc.nextInt();switch (choice) {case 1:addcustomer();break;case 2:xiugaiCustomer();break;case 3:shanchuCustomer();break;case 4:customerlist();break;case 5:flag=false;}}while (flag);}private void addcustomer(){System.out.println("------------添加客户------------");System.out.print("姓名:");Scanner sc = new Scanner(System.in);String name = sc.nextLine();System.out.print("性别:");char gender = sc.next().charAt(0);System.out.print("年龄:");int age = sc.nextInt();sc.nextLine();System.out.print("电话:");String phone = sc.nextLine();System.out.print("邮箱:");String email = sc.nextLine();Customer cust = new Customer(name,gender,age,phone,email);boolean flag = customers.addCustomer(cust);;if(flag){System.out.println("----------添加完成-----------");}else{System.out.println("-----------记录已满,无法添加-------");}}public void xiugaiCustomer(){int index = 0;Customer cust = null;for(;;){System.out.println("---------修改客户----------");System.out.println("请选择待修改客户编号(-1退出):");Scanner sc = new Scanner(System.in);index = sc.nextInt();if (index == -1) {return;}cust = customers.getCustomer(index - 1);if (cust == null) {System.out.println("无法找到指定客户!");} elsebreak;}System.out.print("姓名(" + cust.getName() + "):");Scanner sc = new Scanner(System.in);String name = sc.nextLine();String oldname=cust.getName();if(name!=oldname){oldname=name;}System.out.print("性别(" + cust.getGender() + "):");char gender = sc.next().charAt(0);char oldgender=cust.getGender();if(gender!=oldgender){oldgender=gender;}System.out.print("年龄(" + cust.getAge() + "):");int age =sc.nextInt();int oldage=cust.getAge();if(age!=oldage){oldage=age;}sc.nextLine();System.out.print("电话(" + cust.getPhone() + "):");String phone=sc.nextLine();String oldphone = cust.getPhone();if(phone!=oldphone) {oldphone = phone;}System.out.print("邮箱(" + cust.getEmail() + "):");String email=sc.nextLine();String oldemail = cust.getEmail();if(email!=oldemail){oldemail=email;}cust = new Customer(oldname, oldgender, oldage, oldphone, oldemail);boolean flag = customers.replaceCustomer(index-1, cust);if (flag) {System.out.println("---------------------修改完成---------------------");} else {System.out.println("----------无法找到指定客户,修改失败--------------");}}public void shanchuCustomer() {Customer cust = null;int num = 0;for (; ; ) {System.out.println("-------------删除客户-------------");System.out.println("请选择待删除客户编号(-1退出):");Scanner sc = new Scanner(System.in);num = sc.nextInt();if (num == -1) {return;}cust = customers.getCustomer(num - 1);if (cust == null) {System.out.println("未找到目标用户");} elsebreak;}System.out.println("确认是否删除(Y/N):");Scanner sc = new Scanner(System.in);String choice = sc.nextLine();if(choice=="N"){return;}boolean flag = customers.deleteCustomer(num - 1);if (flag) {System.out.println("-----------删除完成------------");}else {System.out.println("-------无法找到指定客户,删除失败------");}}public void customerlist(){System.out.println("---------------客户列表-----------------");Customer[] custs = customers.getAllCustomers();if(custs.length==0){System.out.println("目前列表中暂无客户");}else{System.out.println("编号\t姓名\t性别\t年龄\t电话\t\t\t邮箱");for (int i = 0; i < custs.length; i++) {System.out.println((i+1) + "\t" + custs[i].getDetails());
// System.out.println(System.out.println(i+ 1 + "\t" + custs[i].getName() + "\t" + custs[i].getGender() + "\t" + custs[i].getAge() + "\t\t" + custs[i].getPhone() + "\t" + custs[i].getEmail());}System.out.println("-----------客户列表完成------------");}}public static void main(String[] args) {CustomerView cView = new CustomerView();cView.jianmie();}
}
相关文章:

拼电商客户管理系统
内容来自:尚硅谷 难度:easy 目 标 l 模拟实现一个基于文本界面的 《 拼电商客户管理系统 》 l 进一步掌握编程技巧和调试技巧,熟悉面向对象编程 l 主要涉及以下知识点: 类结构的使用:属性、方法及构造器 对象的创建与…...

华为:Wireshark的OSPF抓包分析过程
一、OSPF 的5包7状态 5个数据包 1.Hello:发现、建立邻居(邻接)关系、维持、周期保活;存在全网唯一的RID,使用IP地址表示 2.DBD:本地的数据库的目录(摘要),LSDB的目录&…...

Android项目优化同步速度
最近项目需要使用ffmpeg,需要gradle配置引入ffmpeg库,发现原来通过google官方的代码仓,下载太慢了,每秒KB级别的速度。(之前下gradle/gradle plugin都不至于这么慢),于是想到配置国内镜像源来提…...

在线教育网站项目第二步 :学习roncoo-education,服务器为ubuntu22.04.05
一、说明 前端技术体系:Vue3 Nuxt3 Vite5 Vue-Router Element-Plus Pinia Axios 后端技术体系:Spring Cloud Alibaba2021 MySQL8 Nacos Seata Mybatis Druid redis 后端系统:roncoo-education(核心框架:S…...

STM32-GPIO详解
目录 一:GPIO基本概念 编辑 二:GPIO的实际应用 三:功能描述 四:GPIO库函数 五:寄存器 GPIO相关寄存器功能 一:GPIO基本概念 GPIO是英文General Purpose Input/Output的缩写,中文翻译为…...
【Framework系列之Client】UIManager和UIPanel模块介绍
今天来介绍一下UIManager和UIPanel模块,话不多说直接开始。 UIManager 功能介绍 UIManager是管理UIPanel的唯一模块,UIManager的主要功能包括: 提供打开、隐藏、关闭UIPanel的相关接口。负责UIPanel对象的创建以及初始化。负责储存UIPanel对…...

阿里云操作系统控制台——ECS操作与性能优化
引言:在数字化时代,云服务器作为强大的计算资源承载平台,为企业和开发者提供了灵活且高效的服务。本文将详细介绍如何一步步操作云服务器 ECS,从开通到组件安装,再到内存全景诊断,帮助快速上手,…...

【长安大学】苹果手机/平板自动连接认证CHD-WIFI脚本(快捷指令)
背景: 已经用这个脚本的记得设置Wifi时候,关闭“自动登录” 前几天实在忍受不了CHD-WIFI动不动就断开,一天要重新连接,点登陆好几次。试了下在网上搜有没有CHD-WIFI的自动连接WIFI自动认证脚本,那样我就可以解放双手&…...

第51天:Web开发-JavaEE应用SpringBoot栈身份验证JWT令牌Security鉴权安全绕过
#知识点 1、安全开发-JavaEE-身份验证-JWT&Security 2、安全开发-JavaEE-安全问题-不安全写法&版本漏洞 #开发框架-SpringBoot 参考:Spring Boot 中文文档 一、身份验证的常见技术: 1、JWT 2、Shiro 3、Spring Security 4、OAuth 2.0 5、SSO 6、…...

中原银行:从“小机+传统数据库”升级为“OceanBase+通用服务器”,30 +系统成功上线|OceanBase DB大咖说(十五)
OceanBase《DB 大咖说》第 15 期,我们邀请到了中原银行金融科技部数据团队负责人,吕春雷。本文为本期大咖说的精选。 吕春雷是一位资历深厚的数据库专家,从传统制造企业、IT企业、甲骨文公司到中原银行,他在数据库技术与运维管理…...
Java面试第八山!《Spring框架》
一、Spring框架概述 Spring是Java企业级应用开发的核心框架,通过控制反转(IoC)和 面向切面编程(AOP)实现模块解耦,简化开发流程。其核心优势包括依赖注入、声明式事务管理、集成主流ORM框架(如…...
LangChain教程 - Agent - 支持 9 种 ReAct 交互
引言 LangChain 总结了 9 种经典的复杂模型交互模式,每种都针对特定任务设计,兼具独特优势与适用场景,内容涵盖: ReAct、Function Call、知识库、搜索等,使用这些模式可以大大简化这些场景开发难度。这些模式可以使用…...

蓝桥杯备赛日记【day1】(c++赛道)
一、裁纸刀问题(2022、规律、思维、省赛) 解法思路: 参考题目给出的例子发现。不管要裁剪多少次。最外围的四次是固定的。然后通过观察发现,我们的行的裁剪次数为(m-1) 次,而每行都需要裁剪列数…...

【大模型基础_毛玉仁】1.4 语言模型的采样方法
【大模型基础_毛玉仁】1.4 语言模型的采样方法 1.4 语言模型的采样方法1.4.1 概率最大化方法1)贪心搜索(GreedySearch)2)波束搜索(BeamSearch) 1.4.2 随机采样方法1)Top-K 采样2)Top…...

[内网安全] Windows 本地认证 — NTLM 哈希和 LM 哈希
关注这个专栏的其他相关笔记:[内网安全] 内网渗透 - 学习手册-CSDN博客 0x01:SAM 文件 & Windows 本地认证流程 0x0101:SAM 文件简介 Windows 本地账户的登录密码是存储在系统本地的 SAM 文件中的,在登录 Windows 的时候&am…...

基于SNR估计的自适应码率LDPC编译码算法matlab性能仿真,对比固定码率LDPC的系统传输性能
目录 1.算法仿真效果 2.算法涉及理论知识概要 2.1 基于序列的SNR估计 2.2 基于SNR估计值进行码率切换 2.3 根据数据量进行码率切换 3.MATLAB核心程序 4.完整算法代码文件获得 1.算法仿真效果 matlab2022a仿真结果如下(完整代码运行后无水印)&…...
opencv 模板匹配方法汇总
在OpenCV中,模板匹配是一种在较大图像中查找特定模板图像位置的技术。OpenCV提供了多种模板匹配方法,通过cv2.matchTemplate函数实现,该函数支持的匹配方式主要有以下6种,下面详细介绍每种方法的原理、特点和适用场景。 1. cv2.T…...

Embedding技术:DeepWalkNode2vec
引言 在推荐系统中,Graph Embedding技术已经成为一种强大的工具,用于捕捉用户和物品之间的复杂关系。本文将介绍Graph Embedding的基本概念、原理及其在推荐系统中的应用。 什么是Graph Embedding? Graph Embedding是一种将图中的节点映射…...
微信小程序注册组件
在微信小程序中注册组件分为自定义组件的创建和全局/局部注册,下面为你详细介绍具体步骤和示例。 自定义组件的创建 自定义组件由四个文件组成,分别是 .js(脚本文件)、.json(配置文件)、.wxml(…...

【docker】安装mysql,修改端口号并重启,root改密
我的docker笔记 【centOS】安装docker环境,替换国内镜像 1. 配置镜像源 使用阿里云镜像加速器,编辑/etc/docker/daemon.json sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-EOF {"registry-mirrors": ["https:/…...

C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...

【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...
CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝
目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...