一、概述
这个是使用Java实现的一个智能快递柜的管理系统,系统中包含两个角色,分别是用户操作和快递员操作。实现的具体功能如下:
二、功能
1.管理员
(1)快递录入
———柜子的位置(系统产生,不能重复)
———快递单号(输入)
———快递公司(输入)
———6位取件码(系统产生,不能重复)
(2)删除快递(根据单号)
(3)修改快递(根据单号)
(4)查看所有快递(遍历)
2.普通用户
(1)取快递
————输入取件码:显示快递的信息和快递的位置。取出之后,将此快递信息删除。
三、采用的模式
此系统我采用了MVC模式,即:数据存取(M)、视图展示(V)、调度逻辑(C)。
数据存取(M):将快递信息存入,数据存取可以使用数组、集合或者是数据库。我写的这个直接 使用二维数组。
视图展示(V):负责打印,向用户展示界面,专门与用户打交道,提示用户输入快递信息等。
调度逻辑(C):根据视图接收到的用户输入的内容,调度数据存取。
MVC的好处:实现代码复用;降低模块间的耦合性;逻辑更清晰。
四、效果如下:
五、代码
1、视图层:
package com.java.view;
import com.java.bean.Express;
import java.util.Scanner;
//主界面
public class Views {
private Scanner input = new Scanner(System.in); //接收用户输入
/**
* 欢迎界面
*/
public void welcome(){
System.out.println("————---——欢迎使用小小张快递管理系统!---------");
}
/**
* 再见界面
*/
public void bye(){
System.out.println("宝,有缘再相见!");
}
/**
* 选择身份的菜单
*/
public int menu(){
System.out.println("----------请根据提示输入功能序号-----------");
System.out.println("1.快递员");
System.out.println("2.普通用户");
System.out.println("0.退出");
//这里的代码逻辑相较于.nextInt优点在哪?
//但思考这个方法内的逻辑,没有优点。
//但思考全局代码,是有优点的:所有方法均使用nextLine,不会因为输入产生冲突,还可以更好地接收各种的类型数据。
String text = input.nextLine(); //接收用户输入的数据。nextLine所有方法都可以使用,更好地接收键盘输入的各种数据类型。
int num = -1;
try {
num = Integer.parseInt(text);
}catch (NumberFormatException e){
}
if(num<0 || num>2){
System.out.println("输入有误,请重新输入!");
return menu();
}
return num;
}
/**
* 快递员的菜单
*/
public int cMenu(){
System.out.println("----------请根据提示输入功能序号----------");
System.out.println("1.快递录入");
System.out.println("2.快递修改");
System.out.println("3.快递删除");
System.out.println("4.查看所有快递");
System.out.println("0.返回上级目录");
String text = input.nextLine(); //nextLine所有方法都可以使用,更好地接收键盘输入的各种数据类型。
int num = -1;
try {
num = Integer.parseInt(text);
}catch (NumberFormatException e){
}
if(num<0 || num>4){
System.out.println("输入有误,请重新输入!");
return cMenu();
}
return num;
}
/**
* 快递员录入快递
* @return 包含了快递单号和快递公司的快递对象
*/
public Express insert(){
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 printExpress(Express e){
System.out.println("快递信息如下:");
System.out.println("快递公司:"+e.getCompany()+",快递单号:"+e.getNumber()+",取件码:"+e.getCode());
}
public void printNull(){
System.out.println("快递不存在,请检查你的输入");
}
/**
* 修改快递信息
* @param e
*/
public void update(Express e){
System.out.println("请输入新的快递单号:");
String number = input.nextLine();
System.out.println("请输入新的快递公司:");
String company = input.nextLine();
e.setNumber(number);
e.setCompany(company);
}
/**
* 询问是否确认删除,1表示确认,2表示取消操作
* @return
*/
public int delete(){
System.out.println("是否确认删除?");
System.out.println("1.确认删除");
System.out.println("2.取消删除");
System.out.println("0.退出操作");
String text = input.nextLine();
int num = -1;
try {
num = Integer.parseInt(text);
}catch (NumberFormatException e){
}
if(num<0 || num>2){
System.out.println("输入有误,请重新输入!");
return delete();
}
return num;
}
/**
* 给定数组的快递信息,遍历显示
* @param es
*/
public void printAll(Express[][] es){
int count = 0;
for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
if(es[i][j] != null){
count++;
System.out.print("第"+(i+1)+"排"+(j+1)+"列快递");
printExpress(es[i][j]);
}
}
}
if(count == 0){
System.out.println("暂无快递信息");
}
}
/**
* 用户的菜单
*/
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<100000 || num>999999){
System.out.println("输入有误,请重新输入!");
return uMenu();
}
return num;
}
public void expressExist(){
System.out.println("此单号在快递柜已存在,请勿重复存储");
}
public void printCode(Express e){
System.out.println("快递的取件码为:"+e.getCode());
}
public void success(){
System.out.println("操作成功!");
}
}
2、没有任何的业务逻辑,所有属性私有,提供get 和set方法。
package com.java.bean;
import java.util.Objects;
/**
* 快递
*/
public class Express {
private String number;//单号
private String company;//公司
private int code;//取件码
//全参的构造方法
public Express(String number, String company, int code) {
this.number = number;
this.company = company;
this.code = code;
}
//无参的构造方法
public Express() {
}
@Override
public String toString() {
return "Express{" +
"number='" + number + '\'' +
", company='" + company + '\'' +
", code=" + code +
'}';
}
//使用equals方法比较取件码是否相同
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Express express = (Express) o;
return code == express.code;
}
@Override
public int hashCode() {
return Objects.hash(number, company, code);
}
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;
}
}
3、数据存取
package com.java.dao;
import com.java.bean.Express;
import java.util.Random;
public class ExpressDao {
private Express[][] data = new Express[10][];
private int size; //当前存取得快递数,可以快速判断是否有空的快递柜
{
for (int i=0;i<10;i++){
data[i] = new Express[10];
}
}
/**
*
*用于存储快递
*/
private Random random = new Random();//随机生成数据
public boolean add(Express e){
if(size == 100){
return false;
}
//1.随机生成2个0-9的下标
int x = -1;
int y = -1;
while(true){
x = random.nextInt(10);
y = random.nextInt(10);
if(data[x][y] == null){
//此位置无快递
break;
}
}
//2.生成取件码
int code = randomCode();
e.setCode(code);
data[x][y] = e;
return true;
}
//当遍历完之后,没有相同的数据就生成随机数
private int randomCode() {
while (true) {
int code = random.nextInt(900000) + 1000000;
Express e = findByNCode(code);
if (e == null) {
return code;
}
}
}
//
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(e.equals(data[i][j])){
return data[i][j];
}
}
}
return null;
}
/**
* 根据取件码查询快递
* @param code 要查询的取件码
* @return 查询结果,查询失败时返回null
*/
public Express findByNCode(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;
}
/**
* 多余的操作,为了MVC更圆润
*/
public void updata(Express oldExpress,Express newExpress){//原来的对象oldExpress,新的对象newExpress
delete(oldExpress);
add(newExpress);
}
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;
}
}
}
}
public Express[][] findAll(){
return data;
}
}
4、main方法调用各级菜单展示给用户
package com.java.main;
import com.java.bean.Express;
import com.java.dao.ExpressDao;
import com.java.view.Views;
public class Main {
private static Views v = new Views();//初始化视图对象
private static ExpressDao dao = new ExpressDao();//初始化dao对象
public static void main(String[] args) {
v.welcome(); //1.欢迎
m:while (true) {//2.弹出身份选择菜单
int menu = v.menu();
switch (menu) {
case 0:
break m;
case 1://快递员
cClient();
break;
case 2://普通用户
uClient();
break;
}
}
v.bye();
}
//普通用户
private static void uClient(){
int code = v.uMenu(); //1.获取取件码
Express e = dao.findByNCode(code);//2.根据取件码,取出快递
if(e == null){
v.printNull();
}else{
v.success();
v.printExpress(e);
dao.delete(e);
}
}
//快递员
private static void cClient(){
while (true){
int menu = v.cMenu();
switch (menu){
case 0:
break;
case 1: {//快递录入
Express e = v.insert();//1.提示输入快递信息
Express e2 = dao.findByNumber(e.getNumber()); //2.此快递是否已经存储过
if (e2 == null) {//3.存储快递
//未存储过,存
dao.add(e);
v.printCode(e);
} else {
//单号在快递柜已存在
v.expressExist();
}
}
break;
case 2:{//快递修改
//1.提示输入快递信息
String number = v.findByNumber();
//2.查找数据
Express e = dao.findByNumber(number);
Express e2 = e;
//3.打印快递信息
if(e==null){
v.printNull();
}else {
v.printExpress(e);
//4.提示修改
v.update(e2);
dao.updata(e,e2);
v.printCode(e);
}
}
break;
case 3:{//快递删除
//1.输入快递单号
String number = v.findByNumber();
//2.查找快递单号
Express e = dao.findByNumber(number);
if(e == null){
v.printNull();
}else{
v.printExpress(e);
int type = v.delete();
if (type == 1){
dao.delete(e);
v.success();
}
}
}
break;
case 4:{//查看所有
Express[][] data = dao.findAll();
v.printAll(data);
}
break;
}
}
}
}