要求

1.定义一个泛型接口DAO 创建以下方法:
(1)Public void insert(T t) 添加T类型对象到List中
(2)Public T findById(String id); 根据id获取List中的元素
(3)Public List findAll(); 返回List中的所有元素值集
(4)Public void delete(String id); 根据id删除List中的元素

2.使用基于以上的接口完成一个外卖点餐系统部分模块设计,其中包含实体类:
(1)菜品类(菜品id,菜品名,菜品类型,上架时间,单价,月销售,总数量)
(2)管理员类(管理员id,账号,密码)
(3)客户类(客户id,客户名,性别,密码,送餐地址,手机号,创建时间)
(4)订单类(订单号,订单创建时间,菜品id,购买数,客户id,总价格,订单状态)
说明:
1)菜品类型可自行设计数据类型(int或String),如1:面食 2:米饭 3:湘菜 …
2)菜品上架时间、客户创建时间、订单创建时间根据添加时间自动分配系统时间
3)订单状态类型为int(0:未支付 1:已支付 2:配送中 3:已完成)
要求实现如下功能:
1.实现不同角色用户登录系统
(1)管理员登录系统看到如下菜单:
①添加菜品
②查看所有菜品信息(包含分页功能)
③查看指定类别的菜品信息
④根据菜品id修改菜品价格
⑤删除指定id的菜品
⑥添加客户
⑦查看客户列表
⑧删除指定id的客户
⑨订单列表显示
⑩根据订单id修改订单状态
⑪退出
(2)客户登录看到如下菜单:
①显示所有菜品(按菜品销量从高到低排序输出)
1)点餐(输入菜品id和购买数量)
②根据菜品类别显示所有菜品
③查看所有订单(当前登录用户的)
④修改密码(当前登录用户的)
⑤个人信息显示

思路

通过定义泛型接口DAO,让继承该接口的类的方法中能够直接生成其他的类对象。创建菜品、客户、管理员类、订单类,再分别创建这三个类的管理类。最后分别创建一个管理员菜单类和一个客户菜单类实现上述菜单功能。

代码

菜品类

package com.softeem.lesson23.work1;

import java.time.LocalDate;


public class Dish {
    //菜品id 
	private String id;
	//菜品名
	private String name;
	//菜品类
	private String lei;
	//上架时间
	private String date;
	//单价
	private double price;
	//月销售
	private int msum;
	//总数量
	private int sum;
	
	public Dish() {
		// TODO Auto-generated constructor stub
	}

	public Dish(String id, String name, String lei, String date, double price, int msum, int sum) {
		super();
		this.id = id;
		this.name = name;
		this.lei = lei;
		this.date = date;
		this.price = price;
		this.msum = msum;
		this.sum = sum;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getLei() {
		return lei;
	}

	public void setLei(String lei) {
		this.lei = lei;
	}

	public  String getDate() {
		return date;
	}

	public void setDate( String date) {
		this.date = date;
	}

	public double getPrice() {
		return price;
	}

	public void setPrice(double price) {
		this.price = price;
	}

	public int getMsum() {
		return msum;
	}

	public void setMsum(int msum) {
		this.msum = msum;
	}

	public int getSum() {
		return sum;
	}

	public void setSum(int sum) {
		this.sum = sum;
	}

	@Override
	public String toString() {
		return "Dish [id=" + id + ", name=" + name + ", lei=" + lei + ", date=" + date + ", price=" + price + ", msum="
				+ msum + ", sum=" + sum + "]";
	}
	
	
}

客户类

package com.softeem.lesson23.work1;

import java.util.Date;

public class Client {
    //客户id
	private String id;
	//客户名
	private String name;
	//性别
	private String sex;
	//密码
	private String mima;
	//送餐地址
	private String adress;
	//手机号
	private String phone;
	//创建时间
	private String date;
	
	public Client() {
		// TODO Auto-generated constructor stub
	}

	public Client(String id, String name, String sex, String mima, String adress, String phone, String date) {
		super();
		this.id = id;
		this.name = name;
		this.sex = sex;
		this.mima = mima;
		this.adress = adress;
		this.phone = phone;
		this.date = date;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}

	public String getMima() {
		return mima;
	}

	public void setMima(String mima) {
		this.mima = mima;
	}

	public String getAdress() {
		return adress;
	}

	public void setAdress(String adress) {
		this.adress = adress;
	}

	public String getPhone() {
		return phone;
	}

	public void setPhone(String phone) {
		this.phone = phone;
	}

	public String getDate() {
		return date;
	}

	public void setDate(String date) {
		this.date = date;
	}

	@Override
	public String toString() {
		return "Client [id=" + id + ", name=" + name + ", sex=" + sex + ", mima=" + mima + ", adress=" + adress
				+ ", phone=" + phone + ", date=" + date + "]";
	}
	
	
}

订单类

package com.softeem.lesson23.work1;

import java.math.BigDecimal;
import java.time.LocalDateTime;

public class Order {
    //订单号
	private String no;
	//订单创建时间
	private String ldtime;
	//菜品id
	private String did;
	//购买数
	private int sum;
	//客户id
	private String cid;
	//总价格
	private double price;
	//订单状态
	private int state;
	
	public Order() {
		// TODO Auto-generated constructor stub
	}

	public Order(String no, String ldtime, String did, int sum, String cid, double price, int state) {
		super();
		this.no = no;
		this.ldtime = ldtime;
		this.did = did;
		this.sum = sum;
		this.cid = cid;
		this.price = price;
		this.state = state;
	}

	public String getNo() {
		return no;
	}

	public void setNo(String no) {
		this.no = no;
	}

	public String getLdtime() {
		return ldtime;
	}

	public void setLdtime(String ldtime) {
		this.ldtime = ldtime;
	}

	public String getDid() {
		return did;
	}

	public void setDid(String did) {
		this.did = did;
	}

	public int getSum() {
		return sum;
	}

	public void setSum(int sum) {
		this.sum = sum;
	}

	public String getCid() {
		return cid;
	}

	public void setCid(String cid) {
		this.cid = cid;
	}

	public double getPrice() {
		return price;
	}

	public void setPrice(double price) {
		this.price = price;
	}

	public int getState() {
		return state;
	}

	public void setState(int state) {
		this.state = state;
	}

	@Override
	public String toString() {
		return "Order [no=" + no + ", ldtime=" + ldtime + ", did=" + did + ", sum=" + sum + ", cid=" + cid + ", price="
				+ price + ", state=" + state + "]";
	}
	
	
}

管理员类

package com.softeem.lesson23.work1;

public class Mmanager {
    //管理员id
	private String id;
	//管理员账号
	private String zhanghao;
	//管理员密码
	private String mima;
	
	public Mmanager() {
		// TODO Auto-generated constructor stub
	}

	public Mmanager(String id, String zhanghao, String mima) {
		super();
		this.id = id;
		this.zhanghao = zhanghao;
		this.mima = mima;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getZhanghao() {
		return zhanghao;
	}

	public void setZhanghao(String zhanghao) {
		this.zhanghao = zhanghao;
	}

	public String getMima() {
		return mima;
	}

	public void setMima(String mima) {
		this.mima = mima;
	}

	@Override
	public String toString() {
		return "Mmanager [id=" + id + ", zhanghao=" + zhanghao + ", mima=" + mima + "]";
	}
	
	
}

菜品管理类

package com.softeem.lesson23.work1;

import java.util.ArrayList;
import java.util.List;

public class DishManage implements DAO<Dish>{
    //定义菜品集合
	static List<Dish>list = new ArrayList<>();
	//添加菜品
	@Override
	public void insert(Dish t) {
		list.add(t);
		
	}
    
	//根据id查找指定对象
	@Override
	public Dish findById(String id) {
		for(Dish d:list) {
			if(d.getId().equals(id)) {
				return d;
			}
		}
		return null;
	}

	//返回list集合
	@Override
	public List<Dish> findAll() {
		return list;
	}

	//删除指定id的元素
	@Override
	public void delete(String id) {
		Dish d = findById(id);
		list.remove(d);	
	}

	//查询所有菜品(包含分页)
	public List<Dish> findAll(int pageNow,int pageSize){
		//计算起始位置
		int from = (pageNow - 1) * pageSize;
		int to = pageNow * pageSize;
		//如果集合中没有数据时返回null
		if(list.size() < 1) {
			return null;
		}
		//开始位置不能等于总数据条数(越界)
		if(from >= list.size()) {
			return null;
		}
		//结尾的位置不能超过数据总条数
		if(to > list.size()) {
			to = list.size();
		}
		return list.subList(from, to);
	}
	
	//查看指定类别的菜品信息
	public void showBylei(String lei) {
		for(Dish d:list) {
			if(d.getLei().equals(lei)) {
				System.out.println("菜品信息:"+d);
			}
		}
	}
	
	//④根据菜品id修改菜品价格
	public void updatePrice(String id,double price) {
		Dish d = findById(id);
		d.setPrice(price);
	}
	
}

客户管理类

package com.softeem.lesson23.work1;

import java.util.ArrayList;
import java.util.List;

public class ClientManage implements DAO<Client>{
    //定义客户集合
	static List<Client>list = new ArrayList<>();
	//添加客户
	@Override
	public void insert(Client t) {
		list.add(t);
		
	}
    //根据id查找客户
	@Override
	public Client findById(String id) {
		for(Client c : list) {
			if(c.getId().equals(id)) {
				return c;
			}
		}
		return null;
	}
    //返回list集合
	@Override
	public List<Client> findAll() {
		return list;
	}

	//删除指定id的客户
	@Override
	public void delete(String id) {
		list.remove(findById(id));
		
	}
	//查看客户列表
	public void showAll() {
		for(Client c:list) {
			System.out.println(c);
		}
	}

	//查询所有客户(包含分页)
		public List<Client> findAll(int pageNow,int pageSize){
			//计算起始位置
			int from = (pageNow - 1) * pageSize;
			int to = pageNow * pageSize;
			//如果集合中没有数据时返回null
			if(list.size() < 1) {
				return null;
			}
			//开始位置不能等于总数据条数(越界)
			if(from >= list.size()) {
				return null;
			}
			//结尾的位置不能超过数据总条数
			if(to > list.size()) {
				to = list.size();
			}
			return list.subList(from, to);
		}
	
		//通过客户id和密码查找指定对象
		public static Client findByIdAndMina(String id ,String mima) {
			for(Client c : ClientManage.list) {
				if((c.getId().equals(id))&&(c.getMima().equals(mima))) {
					return c;
				}
				}
			return null;
		}
}

订单管理类

package com.softeem.lesson23.work1;

import java.util.ArrayList;
import java.util.List;

public class OrderManage implements DAO<Order>{
    //创建订单集合
	static List<Order>list = new ArrayList<>();
	//添加订单
	@Override
	public void insert(Order t) {
		list.add(t);
		
	}
    //根据id查找指定订单
	@Override
	public Order findById(String no) {
		for(Order t : list) {
			if(t.getNo().equals(no)) {
				return t;
			}
		}
		return null;
	}
    //返回订单集合
	@Override
	public List<Order> findAll() {
		return list;
	}
    //根据订单号删除指定订单
	@Override
	public void delete(String no) {
		Order o = findById(no);
		if(!o.equals(null)) {
			list.remove(o);
		}else {
			System.out.println("不存在该订单");
		}
				
	}
	
	//查询所有订单(包含分页)
			public List<Order> findAll(int pageNow,int pageSize){
				//计算起始位置
				int from = (pageNow - 1) * pageSize;
				int to = pageNow * pageSize;
				//如果集合中没有数据时返回null
				if(list.size() < 1) {
					return null;
				}
				//开始位置不能等于总数据条数(越界)
				if(from >= list.size()) {
					return null;
				}
				//结尾的位置不能超过数据总条数
				if(to > list.size()) {
					to = list.size();
				}
				return list.subList(from, to);
			}
	
			//④根据订单id修改订单状态
			public void updateStatic(String id,int state) {
				Order d = findById(id);
				d.setState(state);
			}

}

客户菜单类

package com.softeem.lesson23.work1;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Scanner;

public class ClientMenu {

	Scanner input = new Scanner(System.in);
	 DishManage  dm  =  new DishManage();
	 OrderManage  om = new OrderManage();
	 Client client = new Client();
	 Order ord = new Order();

	//订单号
    private static int count = 0;
   //订单状态
    private int stac;
    //支付次数
    private int coun = 0; 
    //登录次数
    private int n = 0;
	//p代表syso输出语句
	public void p(Object msg) {
		System.out.println(msg);
	}
	
	//客户的菜单
	public void clientMenu() {	
		p("***************欢迎使用SOFTEEM-SMART菜单*****************");
		p("*\t[1]显示所有菜品(按菜品销量从高到低排序输出)\t*");
		p("*\t[2]点餐(输入菜品id和购买数量)\t\t\t*");
		p("*\t[3]根据菜品类别显示所有菜品\t\t\t*");
		p("*\t[4]查看所有订单(当前登录用户的)\t\t*");
		p("*\t[5]修改密码(当前登录用户的)\t\t\t*");
		p("*\t[6]个人信息显示\t\t\t\t\t*");
		p("*\t[7]为指定订单付款\t\t\t\t*");
		p("*\t[8]退出\t\t\t\t\t\t*");
		p("*\t[9]进入管理员菜单登录\t\t\t\t*");
		p("*********************************************************");
		p("请输入正确的操作指令:");
		//开始
		start();
	}
	    //开始
		public void start() {
			String s = input.next();
			if(!s.matches("^[1-9]$")) {
				p("请输入规范的字符");
				start();
			}
			switch(s) {
			case"1":
				//显示所有菜品(按菜品销量从高到低排序输出)
				showAllDishes();
				break;
			case"2":
				//点餐(输入菜品id和购买数量)
				buyDish();
				break;
			case"3":
				//根据菜品类别显示所有菜品
				showDishByLei() ;
				break;
			case"4":
				//查看所有订单(当前登录用户的)
				showAllOrder() ;
				break;
			case"5":
				//修改密码(当前登录用户的)
				updateMina();
				break;
			case"6":
				//个人信息显示
				showMyself();
				break;
			case"7":
				//为指定订单付款
				payOrder();
				break;
			case"8":
				//退出
	               p("谢谢使用,再见");
	               System.exit(0);
	               break;
			case"9":
				//跳转菜单
				new Menu().denglu();
			}
			
		}
	
		public void showAllDishes() {
			p("请输入需要显示的菜单页码数和每页条数(按:页码/数据条数):");
			String s = input.next();
			if(!s.matches("\\d{1,3}/\\d{1,3}")) {
				System.out.println("输入的页码或每页条数格式不正确");
				showAllDishes();
			}else {
				String[] nums = s.split("/");
				List<Dish>list = dm.findAll(Integer.parseInt(nums[0]), Integer.parseInt(nums[1]));
				if(Objects.isNull(list)) {
					p("没有更多数据可显示!");
					clientMenu();
				}else {
					//按菜品销量从高到低排序
					list.sort((g1,g2)->g2.getMsum()-g1.getMsum());
					for(Dish c : list) {
						p(c);
					}
					showAllDishes();
				}
			}
		}
		
		//点餐
		public void buyDish() {
			//输入菜品id
			p("输入菜品id:");
			String id = input.next();
			//输入数量sum
			p("输入该菜品数量:");
			int sum = input.nextInt();
			//添加订单
			addOrder(id,sum);
		
			
		}
		//添加订单
		public void addOrder(String id,int sum) {
			//订单创建时间
			LocalDateTime now = LocalDateTime.now();
			 count+=1;
			 //总价格
			 double sumPrice = dm.findById(id).getPrice()*sum;
			 //创建订单(订单号,订单创建时间,菜品id,购买数,客户id,总价格,订单状态)
		     Order order = new Order(String.valueOf(count),now.format(DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss")),id,sum,client.getId(),sumPrice,0);
		     om.insert(order);
		     ord = order;
		     p("点餐成功!,请支付");
		     p("请输入支付密码");
			 shurumima();
		     
		}
		
	
		//订单状态
	public void getStac(String s) {
		switch(s) {
		case"1":
			stac = 1;
			p("订单已支付");
			break;
		case"2":
			stac = 2;
			p("订单配送中");
			break;
		case"3":
			stac = 3;
			p("订单已完成");
			break;
		}	
		
		}
   //登录功能
	public boolean denglu() {
		p("请客户输入id和密码");
		p("请客户输入账号id:");
		String cid = input.next(); 
		p("请客户输入密码:");
		String password = input.next(); 
		n+=1;
		while(n <3) {
		for(Client c : ClientManage.list) {
			if(!c.getId().equals(cid)) {
				p("客户id错误,请重新输入:");
				p("您还有"+(3-n)+"次机会");
				denglu();
			}
			else if(!c.getMima().equals(password)) {
				p("客户密码错误,请重新输入");
				p("您还有"+(3-n)+"次机会");
				denglu();
			}
			else {
				p("登录成功,进入客户菜单");
				client = c;
				clientMenu();
				return true;
			}
		}
		}  p("超过今日上限,您已无法进行操作");
		   System.exit(0);;
           return false;
	}
	//输入支付密码
	public boolean shurumima() {
		String s = input.next();
		while(coun < 3) {
		if(!s.equals("1234")) {
			p("密码错误请重新输入:");
			p("您还有"+(3-coun)+"次机会");
			coun +=1;
			shurumima();
		}else {
			p("支付成功");
			coun = 0;
		    om.findById(ord.getNo()).setState(1);
			clientMenu();
			return true;
		}
		    
		}p("支付失败,返回主菜单");
		 coun = 0;
		 clientMenu();
		 return false;
	}
	//根据菜品类品显示所有菜品
	public void  showDishByLei() {
		p("请输入需要显示的菜品类别:");
		String s = input.next();
				for(Dish c : dm.list) {
					if(c.getLei().equals(s)) {
						p(c);
						clientMenu();
					}
				}	p("不存在该类别菜品,请重新输入:");
				showDishByLei();
	}
	
	//③查看所有订单(当前登录用户的)
	public void showAllOrder() {
		if(om.list.isEmpty()) {
			System.out.println("您还未添加任何订单");
		}
		for(Order o: om.list) {
			p(o);
		}
		clientMenu();
	}
	//④修改密码(当前登录用户的)
	public void updateMina() {
		p("请输入修改的密码:");
		String s = input.next();
		ClientManage.findByIdAndMina(client.getId(), client.getMima()).setMima(s);
		p("修改成功,请重新登录");
		denglu();
	}
	
	//⑤个人信息显示
	public void showMyself() {
		p(client);
		clientMenu();
	}
	//为未付款的订单付款
	public boolean payOrder() {
		p("请输入需要支付的订单号");
		String s1 = input.next();
		p(om.findById(s1));
		if(om.findById(s1).getState() == 0) {
		p("请输入支付密码:");
		String s = input.next();
		while(coun < 3) {
			if(!s.equals("1234")) {
				p("密码错误请重新输入:");
				p("您还有"+(3-coun)+"次机会");
				coun +=1;
				payOrder();
			}else {
				p("支付成功");
				coun = 0;
			    om.findById(s1).setState(1);
				clientMenu();
				return true;
			}
			    
			}p("支付失败,返回主菜单");
			coun = 0;
			clientMenu();			 
			 return false;
		}else {
			p("该订单已付款");
			clientMenu();
			return true;
		}
	}
	public static void main(String[] args) {
//		new ClientMenu().denglu();
		new ClientMenu().clientMenu();
	}

}

管理员菜单类

package com.softeem.lesson23.work1;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.Objects;
import java.util.Scanner;

public class Menu {
	
	Scanner input = new Scanner(System.in);
	 static ClientManage cm = new ClientManage();
	static  DishManage  dm  =  new DishManage();
	static  OrderManage  om = new OrderManage();
	static Mmanager mana = new Mmanager();
	//管理员登录次数
	private int count = 0;
	//p代表syso输出语句
	public void p(Object msg) {
		System.out.println(msg);
	}
	
	public boolean denglu() {
		count+=1;
		p("请输入管理员账号:");		
		String s1 = input.next();
		p("请输入管理员密码:");
		String s2 = input.next();
		while(count < 3) {
		if(!s1.equals(mana.getZhanghao())) {
			p("账号错误,您还有"+(3-count)+"次机会,请重新输入:");
			denglu();
		}
		if(!s2.equals(mana.getMima())) {
				p("密码错误,您还有"+(3-count)+"次机会,请重新输入:");
				denglu();
		}else {
		    managerMenu();
		    return true;
		}
		}p("登录失败,返回客户菜单");
		 new ClientMenu().denglu();
		 return false;
		
	}
	//管理员的菜单	
	public void managerMenu() {
		p("************欢迎使用SOFTEEM-SMART菜单************");
		p("*\t[1]添加菜品\t\t\t\t*");
		p("*\t[2]查看所有菜品信息(包含分页功能)\t*");
		p("*\t[3]查看指定类别的菜单信息\t\t*");
		p("*\t[4]根据菜品id修改菜品价格\t\t*");
		p("*\t[5]删除指定id的菜品\t\t\t*");
		p("*\t[6]添加客户\t\t\t\t*");
		p("*\t[7]查看客户列表\t\t\t\t*");
		p("*\t[8]删除指定id的客户\t\t\t*");
		p("*\t[9]订单列表显示\t\t\t\t*");
		p("*\t[10]根据订单id修改订单状态\t\t*");
		p("*\t[11]退出\t\t\t\t*");
		p("*\t[12]进入客户登录菜单\t\t\t*");
		p("*************************************************");
		p("请输入正确的操作指令:");
		//开始
		start();
	}
	//开始
	public void start() {
		String s = input.next();
		if(!s.matches("^[1-9].?")) {
			p("请输入规范的字符");
			start();
		}
		switch(s) {
		case"1":
			//添加
			adddishes();
			break;
		case"2":
			//查看所有所有菜品信息
			showAllList();
			break;
		case"3":
			//查看指定类别的菜品信息
			showOne();
			break;
		case"4":
			//根据菜品id修改菜品价格
			updateOne();
			break;
		case"5":
			//删除指定id的菜品
			deleteOne();
			break;
		case"6":
			//添加客户
			addClient();
			break;
		case"7":
			//查看客户列表
			showAllCilent();
			break;
		case"8":
			//删除指定id的客户
			deleteClientById();
			break;
		case"9":
			//订单列表显示
			showAllOrder();
			break;
		case"10":
			//根据订单id修改订单状态
			updateOrderById();
			break;
		case"11":
			//退出
               p("谢谢使用,再见");
               System.exit(0);
               break;
		case"12":
			//进入客户菜单
			new ClientMenu().denglu();
               default:
            	   p("不存在此项功能,请重新输入:");
            	   start();
		}
		
	}
	//添加
	public void adddishes() {
		//菜品上架时间根据的系统时间
		LocalDateTime now = LocalDateTime.now();
//		p("请输入菜品信息(按:菜品id/菜品名/菜品类型/上架时间/单价/月销售/总数量");
		p("请输入菜品信息(按:菜品id/菜品名/菜品类型/单价/月销售/总数量");
		String s = input.next();
//		if(!s.matches("\\d+/.+/.+/\\d{4}.\\d{2}.\\d{2}/\\d{1,10}/\\d{1,10}/\\d{1,10}")) {
		if(!s.matches("\\d+/.+/.+/\\d{1,10}/\\d{1,10}/\\d{1,10}")) {
		   p("输入信息有误,请重新输入");
		   adddishes();
	}
	     String[] info = s.split("/");
	     Dish dish = new Dish(info[0],info[1],info[2],now.format(DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss")),Double.parseDouble(info[3]),Integer.parseInt(info[4]),Integer.parseInt(info[5]));
	     dm.insert(dish);
	     p("添加成功!");
		 managerMenu();
	     
	}
	
	public void showAllList() {
		p("请输入需要显示的菜单页码数和每页条数(按:页码/数据条数):");
		String s = input.next();
		if(!s.matches("\\d{1,3}/\\d{1,3}")) {
			System.out.println("输入的页码或每页条数格式不正确");
			showAllList();
		}else {
			String[] nums = s.split("/");
			List<Dish>list = dm.findAll(Integer.parseInt(nums[0]), Integer.parseInt(nums[1]));
			if(Objects.isNull(list)) {
				p("没有更多数据可显示!");
				managerMenu();
			}else {
				for(Dish c : list) {
					p(c);
				}
				showAllList();
			}
		}
	}
	
	public void showOne() {
		p("请输入菜品的类别");
		String s = input.next();
		if(!s.matches(".{1,20}")) {
			System.out.println("输入的菜品类型格式不正确");
			showOne();
		}
		for(Dish d : dm.list) {
			if(d.getLei().equals(s)) {
				dm.showBylei(s);
				managerMenu();
			}			
		}p("您搜索的菜品不存在,请重新输入");
		showOne();
	}
	
	public void updateOne() {
		p("请输入想修改的菜品id以及修改后的菜品价格(按:id/price)");
		String s = input.next();
		if(!s.matches("\\d{1,3}/\\d{1,5}")) {
			System.out.println("输入的菜品id及价格格式不正确");
			updateOne();
		}
			String[] nums = s.split("/");
			for(Dish d : dm.findAll()) {
				if(d.getId().equals(nums[0])) {
					dm.updatePrice(nums[0], Double.parseDouble(nums[1]));
					p("修改成功");
					managerMenu();
				}		
			}
			p("您搜索的菜品不存在,请重新输入");
			updateOne();
		
	}
	
	public void deleteOne() {
		Dish dish = new Dish();
		p("请输入需要删除菜品的id");
		String s = input.next();
		if(!s.matches("\\d{1,5}")) {
			System.out.println("输入的菜品id格式不正确");
			deleteOne();
		}
		for(Dish d : dm.list) {
			if(d.getId().equals(s)) {
				dish = d;
				dm.list.remove(dm.findById(dish.getId()));
				p("删除成功!");
				managerMenu();
			}
				
			}p("您搜索的菜品不存在,请重新输入");
			 deleteOne();
		}
		
	
	//添加客户
	public void addClient() {
		//客户创建时间
		LocalDateTime now = LocalDateTime.now();
//		p("请输入客户信息(按:客户id/客户名/性别/密码/送餐地址/手机号/创建时间");
		p("请输入客户信息(按:客户id/客户名/性别/密码/送餐地址/手机号");
		String s = input.next();
//		if(!s.matches("\\w+/.+/.+/\\d{4,12}/.+/\\d{1,10}/\\d{4}.\\d{2}.\\d{2}")) {
		if(!s.matches("\\w+/.+/.+/\\d{4,12}/.+/\\d{1,10}")) {
		   p("输入信息有误,请重新输入");
		   addClient();
	}
	     String[] info = s.split("/");
	     Client client = new Client(info[0],info[1],info[2],info[3],info[4],info[5],now.format(DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss")));
	     cm.insert(client);
	     p("添加成功!");
		 managerMenu();
	}
	
	public void showAllCilent() {
		p("请输入需要显示的客户菜单页码数和每页条数(按:页码/数据条数):");
		String s = input.next();
		if(!s.matches("\\d{1,3}/\\d{1,3}")) {
			System.out.println("输入的页码或每页条数格式不正确");
			showAllCilent();
		}else {
			String[] nums = s.split("/");
			List<Client>list = cm.findAll(Integer.parseInt(nums[0]), Integer.parseInt(nums[1]));
			if(Objects.isNull(list)) {
				p("没有更多数据可显示!");
				managerMenu();
			}else {
				for(Client c : list) {
					p(c);
				}
				showAllCilent();
			}
		}
	}
	//删除指定id的客户
	public void deleteClientById() {
		p("请输入需要删除客户的id");
		Client c = new Client();
		String s = input.next();
		if(!s.matches("\\d{1,5}")) {
			System.out.println("输入的客户id格式不正确");
			deleteClientById();
		}
		for(Client d : cm.list) {
			if(d.getId().equals(s)) {
				c = d;
				cm.list.remove(cm.findById(c.getId()));
				p("删除成功");
				managerMenu();
			}
		}p("您搜索的客户不存在,请重新输入");
		deleteClientById();
		
	}
	//订单列表显示
	public void showAllOrder() {
		p("请输入需要显示的订单菜单页码数和每页条数(按:页码/数据条数):");
		String s = input.next();
		if(!s.matches("\\d{1,3}/\\d{1,3}")) {
			System.out.println("输入的页码或每页条数格式不正确");
			showAllOrder();
		}else {
			String[] nums = s.split("/");
			List<Order>list = om.findAll(Integer.parseInt(nums[0]), Integer.parseInt(nums[1]));
			if(Objects.isNull(list)) {
				p("没有更多数据可显示!");
				managerMenu();
			}else {
				for(Order c : list) {
					p(c);
				}
				showAllOrder();
			}
		}
	}
	//根据订单id修改订单状态
	public void updateOrderById() {
		p("请输入想修改的订单id以及修改后的订单状态(按:id/static)");
		String s = input.next();
		if(!s.matches("\\d{1,3}/\\d{1}")) {
			System.out.println("输入的订单id及订单状态格式不正确,请重新输入");
			updateOrderById();
		}
			String[] nums = s.split("/");
			for(Order d : om.list) {
				if(d.getNo().equals(nums[0])) {
					om.updateStatic(nums[0], Integer.parseInt(nums[1]));
					p("修改成功");
					managerMenu();
				}			
			}p("您搜索的订单不存在,请重新输入");
			updateOrderById();
		
	}
	
	
    //测试代码
	public static void main(String[] args) {
		Mmanager manage = new Mmanager("管理员","1019315720","123456");
		mana = manage;
		new Menu().denglu();

	}

}

运行结果测试

外卖系统基础架构 外卖系统设计_List


输入账号,如果输入不了正确的账号会跳转到客户登录。


输入正确账号,密码会进入管理员菜单界面。

管理员菜单

外卖系统基础架构 外卖系统设计_ide_02


添加功能

外卖系统基础架构 外卖系统设计_外卖系统基础架构_03


查看菜单(分页)

外卖系统基础架构 外卖系统设计_外卖系统基础架构_04


根据类查找菜品

外卖系统基础架构 外卖系统设计_java_05


根据菜品id修改价格

外卖系统基础架构 外卖系统设计_List_06


删除指定id菜品

外卖系统基础架构 外卖系统设计_ide_07


添加客户

外卖系统基础架构 外卖系统设计_ide_08


查看客户列表

外卖系统基础架构 外卖系统设计_ide_09


删除指定id客户

外卖系统基础架构 外卖系统设计_List_10

客户菜单

进入客户菜单

外卖系统基础架构 外卖系统设计_java_11


显示所有菜品

外卖系统基础架构 外卖系统设计_java_12


点餐

外卖系统基础架构 外卖系统设计_外卖系统基础架构_13


支付

外卖系统基础架构 外卖系统设计_外卖系统基础架构_14


根据类别显示菜品

外卖系统基础架构 外卖系统设计_List_15


查看订单

外卖系统基础架构 外卖系统设计_java_16


修改密码

外卖系统基础架构 外卖系统设计_List_17


显示个人信息

外卖系统基础架构 外卖系统设计_java_18


付款功能

外卖系统基础架构 外卖系统设计_外卖系统基础架构_19


管理员界面订单列表显示

外卖系统基础架构 外卖系统设计_List_20


根据订单id修改订单状态

外卖系统基础架构 外卖系统设计_ide_21


退出

总结

花了几天时间来不断改写和完善,运行时也出现了很多异常,但是进过几天的努力已经是比较符合题目要求。但是也还可能出现一些我没有发现的bug。一些菜单的程序编写也可以从这个案例里面借鉴方法和思路,所以记录下来供大家参考。