源码已经打包在博客末尾,有需要的话自行下载。

java 项目: 客户信息管理系统

环境:

​ Idea 集成开发工具

技术点:

  1. 面向对象
  2. 数组

项目结构:

image-20200801181545548

image-20200801180816736

代码展示:

【bean】 Customer.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
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;
}
}

【service】 CusomerList.java\

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
/**
*@Description 内部封装一个Customer[],提供对Customer数据的增删改查操作
*/
public class CustomerList {
private Customer[] customers;
private int total; // 记录存储个数

/**
* 构造器,用来初始化customer数组
* totalCustomer: 指定customer 数组的最大空间
* @param totalCustomer
*/
public CustomerList(int totalCustomer){
customers = new Customer[totalCustomer];
}

/**
* 添加指定的客户到数组中
* @param customer
* @return 添加是否成功
*/
public boolean addCustomer(Customer customer){
if(customer != null && total < customers.length){
customers[total++] = customer;
return true;
}
return false;
}

/**
* 替换指定索引位置上的数组元素
* @param index
* @param cust
* @return
*/
public boolean replanceCustomer(int index, Customer cust){
if(index >= 0 && index < total){
customers[index] = cust;
return true;
}
return false;
}

/**
* 删除指定索引位置上的元素
* @param index
* @return
*/
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--; // 存储人数在减少1
// customers[--total] = null;
return true;
}
return false;
}

/**
* 获取所有的customers 对象构成的数组
* @return
*/
public Customer[] getAllCustomers(){
Customer[] custs = new Customer[total];
// 给元素复制
for(int i = 0; i < custs.length; i++){
custs[i] = customers[i];
}
return custs;
}

/**
* 返回指定的索引位置上的Customer
* @param index
* @return 如果输入的index位置上的元素不存在,返回Null
*/
public Customer getCustomer(int index){
if(index >= 0 && index < total){
return customers[index];
}
return null;
}

/**
* 返回Customer对象的个数
* @return
*/
public int getToTal(){
return total;
}
}

【ul】 CustomerView.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
public class CustomerView {
private CustomerList customerList = new CustomerList(10);

public CustomerView(){
Customer customer = new Customer("柯南",'男',23,"13344453434","kennan@123.com");
customerList.addCustomer(customer);
}

public void enterMainMenu(){
boolean isFlag = true;
do{
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):");
// 从键盘获取用户1-5的选择
char menu = CMUtility.readMenuSelection();
// 使用switch-case对用户选择,进行区别处理
switch(menu){
case '1':
addNewCustomer();
break;
case '2':
modifyCustomer();
break;
case '3':
deleteCustomer();
break;
case '4':
listAllCustomer();
break;
case '5':
System.out.print("确认是否退出(Y/N):");
char exit = CMUtility.readConfirmSelection();
if(exit == 'Y'){
isFlag = false;
}
}
}while(isFlag);
}

/**
* 添加用户
*/
public void addNewCustomer(){
System.out.println("---------------------添加客户---------------------");
System.out.print("姓名:");
String name = CMUtility.readString(5);
System.out.print("性别:");
char gender = CMUtility.readChar();
System.out.print("年龄:");
int age = CMUtility.readInt();
System.out.print("电话:");
String phone = CMUtility.readString(13);
System.out.print("邮箱:");
String email = CMUtility.readString(20);

// 封装一个对象
Customer customer = new Customer(name, gender, age, phone, email);
// 将此对象添加到CustomerList里的数组中
boolean flag = customerList.addCustomer(customer);
if(flag){
System.out.println("---------------------添加完成---------------------");
}else{
System.out.println("人数已达上限,添加失败!");
}
}

/**
* 2. 修改客户
*/
public void modifyCustomer(){
System.out.println("---------------------修改客户---------------------");
Customer customer;
int index;
for(;;){
System.out.print("请选择待修改客户编号(-1退出):");
index = CMUtility.readInt();
if(index == -1){
return;
}
// 对于用户来将,我们让index 默认从1开始。
customer = customerList.getCustomer(index -1);
if(customer == null){
System.out.println("无法找到指定客户!");
}else{
break;
}
}
// 修改用户的信息
System.out.println("姓名(" + customer.getName() + "):");
// 如果用户输入了姓名,则返回使用输入的信息,如果用户没有输入,直接回车,则返回customer.getName();
String name = CMUtility.readString(5, customer.getName());
System.out.println("性别(" + customer.getGender() + "):");
char gender = CMUtility.readChar(customer.getGender());
System.out.println("年龄(" + customer.getAge() + "):");
int age = CMUtility.readInt(customer.getAge());
System.out.println("电话(" + customer.getPhone() + "):");
String phone = CMUtility.readString(13, customer.getPhone());
System.out.println("邮箱(" + customer.getEmail() + "):");
String email = CMUtility.readString(20, customer.getEmail());

// 获取用户输入的属性以后,得到最新的Customer对象
customer = new Customer(name, gender, age, phone, email);

// 对于用户来讲,我们让index默认从1开始
boolean flag = customerList.replanceCustomer(index -1, customer);
if(flag){
System.out.println("---------------------修改完成---------------------");
}else{
System.out.println("---------------------修改失败---------------------");
}
}

/**
* 3 删除客户
*/
public void deleteCustomer(){
System.out.println("---------------------删除客户---------------------");
Customer customer;
int index;
for(;;){
System.out.println("请选择待删除客户编号(-1退出):");
// 针对普通用户来讲:此index从1开始
index = CMUtility.readInt();
if(index == -1){
return;
}
customer = customerList.getCustomer(index -1);
if(customer == null){
System.out.println("无法找到指定的客户!");
}else{
break;
}
}

// 一旦找到相应的索引位置的customer以后,让用户决定是否确定删除
System.out.println("确认是否删除(Y/N):");
char deleOrNot = CMUtility.readChar();
if(deleOrNot == 'Y'){
boolean flag = customerList.deleteCustomer(index -1);
if(flag){
System.out.println("---------------------删除完成---------------------");
}else{
System.out.println("---------------------删除失败---------------------");
}
}else{
return;
}
}

public void listAllCustomer(){
System.out.println("---------------------------客户列表---------------------------");
// 获取所有的客户
Customer[] customers = customerList.getAllCustomers();
if(customers.length == 0){
System.out.println("没有任何客户记录!");
}else{
System.out.println("编号\t\t姓名\t\t性别\t\t年龄\t\t电话\t\t\t\t邮箱");
for(int i = 0; i < customers.length; i++){
Customer cust = customers[i];
System.out.println((i + 1) + "\t\t" + cust.getName() + "\t\t"
+ cust.getGender() + "\t\t" + cust.getAge() + "\t\t"
+ cust.getPhone() + "\t\t" + cust.getEmail());
//方式二:
//System.out.println((i + 1) + "\t" + cust.info());
}
}
System.out.println("-------------------------客户列表完成-------------------------");
}

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

【util】 CMUtility.java 工具类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
import java.util.*;
/**
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;
}
}

提取码:qrj3