快递E站小项目--------MVC结构二维数组存储数据
通过自己搭建的MVC结构,二维数组存储数据缓存,实现简单的控制台快递柜功能,只能实现一次性的功能演示。
————————————————————————————————————————————
用户分为 快递员,普通用户
快递员:
增加快递:输入单号、公司、自动生成取件码
删除快递:输入单号删除快递
修改快递:输入单号查询快递,修改单号和公司,取件码不变
查询快递:显示当前所有快递
普通用户:
取快递:输入取件码,删除快递。
————————————————————————————————————
MVC结构
M——model
存储快递数据基本信息——快递单号、快递公司、取件码
public class Express implements Serializable {
private String number; //快递单号
private String company; //快递公司
private int code; //取件码
//重写toString方法
@Override
public String toString() {
return "Express{" +
"number='" + number + '\'' +
", company='" + company + '\'' +
", code=" + code +
'}';
}
//基础数据实现get和set方法,方便外面操作数据,因为外面无法操作私有(private)属性数据
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
}
V——view
提共界面,实现与用户的信息交互
import express.java.bean.Express;
import java.util.Scanner;
public class View {
Scanner input = new Scanner(System.in);
/**
* 进入系统
*/
public void welcome() {
System.out.println("欢迎使用快递管理系统");
}
/**
* 退出
*/
public void exit() {
System.out.println("欢迎下次使用");
}
/**
* 主菜单选择身份
* @return num身份选项
*/
public int menu() {
System.out.println("请根据提示,输入功能序号:");
System.out.println("1:快递员,2:用户,3:退出");
//使用nextLine,不产生冲突,
String text = input.nextLine();
int num = -1;
try {
num = Integer.parseInt(text);
}catch(NumberFormatException e) {
}
if(num<0 || num>2) {
return menu();
}
return num;
}
/**
* 快递员菜单
*/
public int cMenu() {
System.out.println("请根据提示,输入功能:");
System.out.println("1:快递录入,2:快递修改,3:快递删除,4:查看快递,0:退出");
String text = input.nextLine();
int num = -1;
try {
num = Integer.parseInt(text);
}catch(NumberFormatException e) {
}
if(num<0 || num>4) {
return cMenu();
}
return num;
}
/**
*用户菜单
*/
public int uMenu() {
System.out.println("请根据提示取件");
System.out.println("请输入取件码");
String code = input.nextLine();
int num = -1;
try {
num = Integer.parseInt(code);
}catch(NumberFormatException e) {
}
if(num<10000 || num>999999) {
System.out.println("输入有误,请重新输入");
return uMenu();
}
return num;
}
/**
* 添加快递
* @return
*/
public Express add() {
System.out.println("请根据操做输入快递信息");
System.out.println("请输入快递单号:");
String number = input.nextLine();
System.out.println("请输入公司名:");
String company = input.nextLine();
Express e = new Express();
e.setNumber(number);
e.setCompany(company);
return e;
}
/**
* 提示用户输入快递单号
* @return
*/
public String findByNumber() {
System.out.println("请输入快递信息");
System.out.println("请输入要操作的快递单号:");
String number = input.nextLine();
return number;
}
/**
* 打印信息
* @param e
*/
public void printExress(Express e) {
System.out.println("快递信息如下:");
System.out.println("快递单号"+e.getNumber()+",快递公司"+e.getCompany()+",取件码"+e.getCode());
}
/**
* 更新快递信息
* @param e
*/
public void update(Express e) {
System.out.println("请根据操做输入快递信息");
System.out.println("请输入快递单号:");
String number = input.nextLine();
System.out.println("请输入公司名:");
String company = input.nextLine();
e.setNumber(number);
e.setCompany(company);
}
/**
*删除提示
*/
public int delete(){
System.out.println("请根据提示,输入功能序号:");
System.out.println("1:删除,2:不删除,3:退出");
//使用nextLine,不产生冲突,
String text = input.nextLine();
int num = -1;
try {
num = Integer.parseInt(text);
}catch(NumberFormatException e) {
}
if(num<0 || num>2) {
return delete();
}
return num;
}
/**
*查询打印所有快递
*/
public void printAll(Express[][] es) {
if (es == null || es.length == 0) {
System.out.println("暂无快递");
return;
}
for (int i=0; i<10; i++) {
for (int j=0; j<10; j++) {
if (es[i][j] != null) {
System.out.println("第" + (i + 1) + "排,第" + (j + 1) + "列");
printExress(es[i][j]);
}
}
}
}
//提示单号存在
public void expressExist(){
System.out.println("此单号已经存在");
}
}
C——Controller
实现数据处理的的逻辑功能
import express.java.bean.Express;
import java.util.Random;
public class ExpressDao {
private static int size = 0; //储存的大小
private Express[][] data = new Express[10][]; //初始化二维数组
//构造代码块,类加载一次自动执行一次,实现二维数组自动初始化
{
for (int i=0; i<10; i++) {
data[i] = new Express[10];
}
}
private Random random = new Random();
/**
* 添加快递方法,x、y看作快递柜位置,随机位置存储
* @param e
* @return
*/
public boolean add(Express e) {
if (size == 10) {
return false;
}
int x = -1;
int y = -1;
while(true) {
x = random.nextInt(10);
y = random.nextInt(10);
if(data[x][y] == null){
break;
}
}
int code =randomCode();
e.setCode(code);
data[x][y] = e;
return true;
}
/**
* 自动生成六位取件码
* @return
*/
private int randomCode() {
while (true) {
int code = random.nextInt(900000) + 100000;
Express e = findByCode(code);
if (e == null) {
return code;
}else {
continue;
}
}
}
/**
* 按照查询单号快递对象
* @param number
* @return
*/
public Express findByNumber(String number) {
Express e = new Express();
e.setNumber(number);
for (int i=0; i<10; i++){
for (int j=0; j<10; j++){
if (data[i][j] != null) {
if (e.equals(data[i][j])) {
return data[i][j];
}
}
}
}
return null;
}
/**
* 按照取件码查询快递对象
* @param code
* @return
*/
public Express findByCode(int code) {
for (int i=0; i<10; i++){
for (int j=0; j<10; j++){
if (data[i][j] != null) {
if (data[i][j].getCode() == code) {
return data[i][j];
}
}
}
}
return null;
}
/**
* 删除快递
* @param e
*/
public void delete(Express e) {
p:for (int i=0; i<10; i++){
for (int j=0; j<10; j++){
if (e.equals(data[i][j])) {
data[i][j] = null;
break p;
}
}
}
}
/**
* 更新快递,可忽略本步骤,只是演示数据交互
* @param oldExpress
* @param newExpress
*/
public void update(Express oldExpress,Express newExpress) {
delete(oldExpress);
add(newExpress);
}
/**
* 查找所有快递
* @return
*/
public Express[][] findAll(){
return data;
}
}
Main
功能的综合实现,
import express.java.bean.Express;
import express.java.dao.ExpressDao;
import express.java.view.View;
public class Main {
private static View v = new View();
private static ExpressDao dao = new ExpressDao();
public static void main(String[] args) {
v.welcome();
//选择用户类型
m:while (true) {
int menu = v.menu();
switch (menu) {
case 0:
break m;
case 1:
cClient();
break;
case 2:
uClient();
break;
case 3:
break m;
}
}
}
/**
* 普通用户取件功能
*/
private static void uClient() {
int code = v.uMenu();
Express e = dao.findByCode(code);
if (e == null) {
System.out.println("快递不存在");
}else {
v.printExress(e);
dao.delete(e);
System.out.println("取件成功");
}
}
/**
* 快递员各项功能
*/
private static void cClient() {
while (true) {
int menu = v.cMenu();
switch (menu) {
case 0:
return;
case 1: {
Express e = v.add();
Express e2 = dao.findByNumber(e.getNumber());
if (e2 == null) {
dao.add(e);
} else {
v.expressExist();
}
}
break;
case 2: {
String number = v.findByNumber();
Express a = dao.findByNumber(number);
if (a == null) {
System.out.println("快递不存在");
} else {
v.printExress(a);
v.update(a);
dao.update(a, a);
v.printExress(a);
}
}
break;
case 3: {
String number = v.findByNumber();
Express e = dao.findByNumber(number);
if (e == null) {
System.out.println("快递不存在");
} else {
v.printExress(e);
int type = v.delete();
if (type == 1) {
dao.delete(e);
}
}
}
break;
case 4: {
Express[][] data = dao.findAll();
v.printAll(data);
}
break;
}
}
}
}
以上是快递柜实现的所有代码,可以参考和修改,希望提出建议
改进本次项目,使用集合进行数据 存储和实现序列化的本地文件存储数据