//测试类
package com.test;
import java.util.InputMismatchException;
import javax.sound.midi.SysexMessage;
import javax.swing.plaf.synth.SynthSeparatorUI;
import eat.util.EatManager;
/**
* 测试吃货联盟系统的使用功能
* @author ASUS
*
*/
public class TestEat {
//吃的唯一大亏就是没有辅助工具,每次遍历数组与if判断太沉重了
public static void main(String[] args) {
//创建管理工具业务操作对象
EatManager em=new EatManager();
do{
try{
//来个欢迎语
em.hello();
//点餐前登陆系统
em.men.show();
//根据界面选择要执行的功能编号
int number=em.getNumber();
//执行该功能编号
em.execure(number);
}catch(InputMismatchException e){
System.err.println("您录入的格式或范围不对!!"
}catch(NullPointerException e){
System.err.println("获取当前对象失败!!");
}catch(Exception e){
System.out.println(e.getMessage());
}
}while(true);
}
// take care:longinfo variable:is of User1 class,when at use Object attribute it only belong User class.
}
//工具类manager
package eat.util;
import java.util.InputMismatchException;
import java.util.Scanner;
import com.assist.LongInfo;
import com.assist.MainMenu;
import com.assist.Menu;
import com.assist.OrderMenu;
import com.assist.Service;
import com.assist.UserInfo;
import com.user.bean.Order1;
import com.user.bean.User1;
/**
* 吃货联盟业务需求工具类,用于业务对象的点餐管理
* 用于界面获取,数据获取,协助使用流程控制
*
* @author ASUS
*
*/
public class EatManager {
//需要操作的时用户点餐,所以用户数据的交互是一定存在的。
public User1 longinfo=null;
//界面管理,开始默认时登陆界面
public Menu men=new LongInfo(); //用对象管理类,对象和实体类建立好了以后,根据流程直接写;
//数据调用交互对象 //由于跨包使用需要public修饰
public EatDataCenter1 edc=new EatDataCenter1();
/*
* 获取String输入的方法
*/
public String getString(String need){
Scanner input=new Scanner(System.in);
System.out.print(need);
String number=input.next();
return number;
}
/*
* 创建获取int输入方法
*/
private int getInt(String need){
Scanner input=new Scanner(System.in);
System.out.print(need);
int number=input.nextInt();
return number;
}
/*
* 获取功能编号
*/
public int getNumber()throws InputMismatchException,NullPointerException,Exception{
int number=getInt("请输入您要操作的功能编号:");
return number;
}
/*
* 执行功能编号
*/
public void execure(int number)throws InputMismatchException,NullPointerException,Exception{
//判断对象mu1属于哪个界面的对象执行对应的功能序号。
if(men instanceof LongInfo){
switch(number){
case 1:
System.out.println("\n>>>用户登陆<<<\n");
//登陆后需要标记longinfo,并且切换至主菜单对象更换
longin();
break;
case 2:
System.out.println("\n>>>用户注册<<<\n");
//注册完成需要重新登陆
register();
break;
case 3:
System.out.println("感谢您对本系统的使用再见~~");
System.exit(1);
break;
default :
judge(number);
}
//主菜单功能
}else if(men instanceof MainMenu){
switch(number){
case 1:
System.out.println("\n>>>我要订餐<<<\n");
//点餐就是生成根据用户编号对应的点餐订单,,即写代码按照生成点餐订单的流程
order();
break;
case 2:
System.out.println("\n>>>个人信管理<<<\n");
//需要切换菜单对象
men=new UserInfo();
break;
case 3:
System.out.println("\n>>>个人订单管理中心<<<\n");
//需要切换对应菜单对象
men=new OrderMenu();
break;
case 4:
System.out.println("\n>>>菜品信息评价<<<\n");
//注意付给数据的正负
appraiseDish();
break;
case 5:
System.out.println("\n>>>客服中心<<<\n");
//切换客户界面所属对象
men=new Service();
break;
case 6:
men=new LongInfo();
//返回后需要longinfo 置空。
longinfo=null;
break;
default :
if(number<1||number>6){
System.out.println("您录入的编号范围有误请重新输入1~6整数\n");
}else{
throw new Exception("您录入格式不正确,请重新录入\n");
}
}
//个人用户管理中心
}else if(men instanceof UserInfo){
switch(number){
case 1:
System.out.println("\n>>>用户信息如下<<<\n");
//个人用户信息属于私密信息需要密码验证才能查看
showLongInfo();
break;
case 2:
System.out.println("\n>>>修改密码<<<\n");
//先验证原密码;;;修改成功需要重新登陆并且把当前longinfo置空
modifierPasswd();
break;
case 3:
System.out.println("\n>>>修改送餐地址<<<\n");
//需先验证密码
modifierAddress();
break;
case 4:
System.out.println("\n>>>更换联系方式<<<\n");
//需要先验证密码
changePhone();
break;
case 5:
System.out.println("\n>>>更改昵称<<<\n");
//需要先验证密码
changeNick();
break;
case 6:
//返回主功能界面需要切换界面
men =new MainMenu();
break;
default :
if(number<1||number>6){
System.out.println("您录入的编号范围有误请重新输入1~6整数\n");
}else{
throw new Exception("您录入格式不正确,请重新录入\n");
}
}
//订单信息管理中心
}else if(men instanceof OrderMenu){
switch(number){
case 1:
System.out.println("\n>>>个人订单如下<<<\n");
//打印个人用户当前所有订单 只要是longinfo=edc.user[i]对象的,那么订单信息就打印出来
lookForOrder();
break;
case 2:
System.out.println("\n>>>支付订单<<<\n");
//订单状态为 以预定”1“与待付款的才能付款”2“,
payBill();
break;
case 3:
System.out.println("\n>>>您的待签收订单号如下<<<\n");
//前提条件是属于当前用户的订单并且录入订单号是已付款未签收的。
signOrder();
break;
case 4:
System.out.println("\n>>>您的可删除订单如下<<<\n");
//前提条件是属于当前用户的订单并且录入订单号是已签收的。
deleteOrder();
break;
case 5:
//返回主功能界面需要切换界面
men =new MainMenu();
break;
default :
if(number<1||number>5){
System.out.println("您录入的编号范围有误请重新输入1~3整数\n");
}else{
throw new Exception("您录入格式不正确,请重新录入\n");
}
}
//客服服务中心
}else if(men instanceof Service){
switch(number){
case 1:
System.out.println("\n>>>找回密码\n");
//找回密码实在忘记原密码的情况做的一个操作。设定一个私有密码属性只提供GET接口,
//并且密保为存储常量,只能通过对应的构造方法与对应用户的ID才能存入。
retrievePassword();
break;
case 2:
System.out.println("\n>>>建议留言\n");
//设定一个数据中心的留言板,前提用登陆信息不为空
suggest();
break;
case 3:
System.out.println("\n>>>人工服务\n");
//人工服务用于解决
madeService();
break;
case 4:
//返回上一级菜单需要做菜单切换
men=new MainMenu();
break;
default :
if(number<1||number>4){
System.out.println("您录入的编号范围有误请重新输入1~4整数\n");
}else{
throw new Exception("您录入格式不正确,请重新录入\n");
}
}
}
}
/**
* 录入判断
* @throws Exception
*/
private void judge(int number) throws InputMismatchException, Exception {
if(number<1||number>3){
System.out.println("您录入的编号范围有误请重新输入1~3整数\n");
}else{
throw new Exception("您录入格式不正确,请重新录入\n");
}
}
/**UnsatisfiedLinkError
* 菜品评价
* @throws Exception
*/
private void appraiseDish() throws InputMismatchException,NullPointerException, Exception {
boolean flag=false;
DishNameMenu();
int number =getInt("\n请输入您需要评价的菜品编号:");
for (int i = 0; i < edc.dish.length; i++) {
if(edc.dish[i]==null) break;
if(edc.dish[i].getDishID()==number){
flag=true;
int appraise=getInt("请对"+number+"号菜品做出您的评价,赞为正数,踩为负数:");
int sumAppraise=appraise+edc.dish[i].getAppraise();
edc.dish[i].setAppraise(sumAppraise);
System.out.println("\n第"+number+"号菜品评价成功,您对该菜品的评价结果为:"+appraise+"赞");
break;
}
}
if(!flag){
throw new Exception("您输入的格式或者范围不对~~");
}
}
/**
* 人工服务
*/
private void madeService() {
if(longinfo!=null){
System.out.println("请拨打客服电话400600~~");
}else{
System.out.println("操作异常请从新登陆");
longinfo=null;
men=new LongInfo();
}
}
/**
*
*/
private void suggest() {
if(longinfo!=null){
String suggest=getString("感谢"+longinfo.getUserNock()+longinfo.getSex()+"您对本系统的使用,请您在下方给我们留下宝贵的建议~~");
//遍历留言板
for (int i = 0; i 2||longinfo.getUserID()!=edc.order[i].getUserId()){
throw new Exception("您录入的订单编号有误或者已支付!!");
}
}
}
/**
* 签收订单
* @throws InputMismatchException,NullPointerException,Exception
*/
private void signOrder() throws InputMismatchException,NullPointerException,Exception{
//假设每次只签收一条订单,第二次操作需重新选择签收功能
lookForOrder();
int id=getInt("\n请输入您要签收的订单编号:");
//遍历数组,遍历属于该用户的订单
System.out.println("您待签收的订单状态如下");
for (int i = 0; i < edc.order.length; i++) {
if(edc.order[i]==null) break;
if(edc.order[i].getState().equals("已付款")&&longinfo.getUserID()!=edc.order[i].getUserId()){
edc.order[i].setStatus(4);
System.out.println("订单号"+id+"签收成功!");
break;
}
if(id!=edc.order[i].getOrderId()||edc.order[i].getStatus()>2||longinfo.getUserID()!=edc.order[i].getUserId()){
throw new Exception("您录入的订单编号有误或者待支付或已签收!!");
}
}
}
/**
* 支付订单
* @throws Exception
*/
private void payBill() throws InputMismatchException ,Exception {
int index=-1;
if(longinfo.equals(edc.order[0])){
index=1;
}
//假设每次只支付一条订单让后回到订单管理界面
lookForOrder();
//计算机的思维何人不一样,思考需要判定,运算根据判定依据做出逻辑运算,否则就会出现运行Bug.
int id=getInt("\n请输入您要支付的订单编号:");
//遍历数组:1、属于longinfo.getUserID的订单,并且,2、订单状态必须为1与2所对应状态。付款后属性为3.
System.out.println("您待付款订单状态如下");
for (int i = 0; i =0){
System.out.println("找零:"+(pay-edc.order[i].getSumPrice())+"元,支付成功谢谢!!");
//修改订单状态
edc.order[i].setStatus(3);
break;
}else if((pay-edc.order[i].getSumPrice())<0){
System.out.println("\n抱歉,支付金额不足支付失败~~~~");
break;
}
}
//支付结果就两种结果支付与不支付,,
//影响支付的就两种情况,订单号不对或者该订单已经支付(但前者的影响值包含后者的结果所以可以放到一个if判定中)
if(id==edc.order[i].getOrderId()||edc.order[i].getStatus()>2||
longinfo.getUserID()!=edc.order[i].getUserId()){
throw new Exception("您录入的订单编号有误或者已支付!!");
}
}
}
/**
* 查看用户的个人订单信息
*/
private void lookForOrder() {
System.out.println("订单编号\t订单人\t菜品名称\t菜品份数\t菜品单价\t订单总价\t\t订单状态");
//遍历当前用户的userID order fornation
for (int i = 0; i < edc.order.length; i++) {
//防止空指针
if(edc.order[i]==null) break;
//只要是longinfo对象的,那么订单信息就是他的,用户ID是唯一的 iD是int基本数据只能==判定
if(edc.order[i].getUserId()==(longinfo.getUserID())){
System.out.println(edc.order[i].getOrderId()+"\t"+longinfo.getUserNock()+"\t"+
edc.dish[edc.dish[i].getDishID()-1].getDishName()+"\t"+edc.order[i].getCount()+"\t"+
edc.dish[edc.dish[i].getDishID()-1].getPrice()+"\t"+edc.order[i].getSumPrice()+
"\t\t"+edc.order[i].getState());
}
}
}
/**
* 修改用户昵称
*/
private void changeNick() {
//密码核对
boolean flag= cheakPasswd();
if(flag){
String nick=getString("\n请输入您的昵称:");
longinfo.setUserNock(nick);
System.out.println("修改成功!您的新昵称为:"+nick+"\n");
}else{
System.out.println("抱歉!密码错误您还没有此权限!!");
}
}
/**
* 更改联系方式
*/
private void changePhone() {
//核对密码
boolean flag= cheakPasswd();
if(flag){
String phone=getString("\n请输入您的新手机号:");
longinfo.setPhone(phone);
System.out.println("修改成功!您的新联系方式为:"+phone+"\n");
}else{
System.out.println("抱歉!密码错误您还没有此权限!!");
}
}
/**
* 个人信息显示
*/
private void showLongInfo() {
boolean flag= cheakPasswd();
if(flag){
System.out.println("用户编号\t+用户名\t用户密码\t用户昵称\t用户性别\t用户年龄\t用户联系方式\t\t用户用餐地址");
for (int i = 0; i < edc.user.length; i++) {
if(edc.user[i]==null) break;
if(longinfo.getUserID()==edc.user[i].getUserID()){
System.out.println(longinfo.getUserID()+"\t"+longinfo.getUserName()+"\t"+longinfo.getPasswd()+"\t"
+longinfo.getUserNock()+"\t"+longinfo.getSex()+"\t"+longinfo.getAge()+"\t"
+longinfo.getPhone()+"\t\t"+longinfo.getAddress());
}
}
}else{
System.out.println("抱歉!密码错误您还没有此权限!!");
}
}
/*
* 登陆功能
*/
private void longin() {
/* 1. 获取登录需要的数据 */
//用户名
String userName = getString("请输入您的用户名:");
//密码
String password = getString("请输入您的密码:");
//验证登陆::数据操作一般方法数据中心
User1 user = edc.login(userName, password);
/* 3. 根据登录结果处理后续操作 */
if(user == null){
System.out.println("\n登陆失败用户名或密码错误!\n");
return;
}
//切换菜单: 为什么要切换菜单;;目的时多态的应用解决了函数嵌套
men = new MainMenu();
//保存登录用的信息
//为什么要用一个用户保存登陆信息,目的方便后续操作,和退出注销, ,,这个是重点
longinfo = user;
}
/**
* 欢迎语
*/
public void hello()throws NullPointerException,Exception{
if(men instanceof MainMenu){
System.out.println("\n"+longinfo.getUserNock()+longinfo.getSex()+"您好!\n");
}
}
/*
* 用户注册
*/
private void register(){
//细节来一个获取下表为空的index;
int index=-1;
//输入数据
int age=getInt("请输入您的年龄:");
if(age>15&&age<60){
String name=getString("请录入您的用户名:");
String pwd=getString("请录入您的用密码:");
//遍历数组//看用户名是否存在,回到登陆界面,在注册徐重新选择编号2
for (int i = 0; i 7){
number=getInt("您选择的菜品编号有误!请从新选择1~7");
}
int count=getInt("请选择您喜欢的菜品份数:");
int time=getInt("请输入您的预定时间 :");
//订单默认生成加1
int ordID=edc.maxID()+1;
double sum=edc.dish[number-1].getPrice()*count;
for (int i = 0; i < edc.order.length; i++) {
if(edc.order[i]==null){
edc.order[i].setStatus(1);
index=i;
}
}
System.out.println("\n"+longinfo.getUserNock()+longinfo.getSex()+"您已点餐成功!您的当前点餐信息如下:\n");
System.out.println("订单编号\t菜品名称\t菜品份数\t菜品单价\t订单总价\t\t订单状态");
//打印选材信息,输出的订单,菜品编号应该是菜品名,,总价按照菜品编号做下标-1调菜品单价,并且不用显示订单状态
System.out.println(ordID+"\t"+edc.dish[number-1].getDishName()+"\t"+
count+"份\t"+edc.dish[number-1].getPrice()+"\t元"+sum+"元\t\t"+edc.order[index].getState());
String select=getString("\n确认是否开始派单或放弃下单,y|n? :");
if(select.equals("y")){
System.out.print("请支付:"+sum+"元:");
double pay=new Scanner(System.in).nextDouble();
if((pay-sum)>0){
System.out.println("\n找零:"+(pay-sum)+"元,您的订单已经开始派送!");
//订单保存,并把订单状态改成阴茎付款
for (int i = 0; i 0) return (+appraise)+"赞";
if(appraise<0) return (-appraise)+"踩";
return null;
}
public Dish1(int dishId, String dishName, double price,int appraise) {
this.dishName = dishName;
this.price = price;
this.dishID = dishId;
this.appraise = appraise;
}
public Dish1() {
}
public int getAppraise() {
return appraise;
}
public String getDishName() {
return dishName;
}
public void setDishName(String dishName) {
this.dishName = dishName;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public int getDishID() {
return dishID;
}
public void setDishID(int dishId) {
this.dishID = dishId;
}
public void setAppraise(int appraise) {
this.appraise = appraise;
}
}
//实体类 :User1 用户实体类
package com.user.bean;
/*
* 吃货联盟用户实体类。
*/
public class User1 {
//密保,用于找回密码用 不提供对外set接口,只留get取值接口
private String pwd2;
//用户这个实体相关的属性数据载体,
private String userNock;
private int userID;
private String userName ;
private String passwd;
private int gender;
private int age;
private String phone;
private String address;
/*
* 设置性别的方法,贵属性所有
*/
public String getSex(){
if(gender==1) return "先生";
if(gender==2) return "女士";
return "?";
}
public User1() {
}
//用于交付的登陆对象数据
public User1(String userName, String passwd) {
this.userName = userName;
this.passwd = passwd;
}
public String getUserNock() {
return userNock;
}
//用于设定密保
public User1(String pwd2, int userID) {
this.pwd2 = pwd2;
this.userID = userID;
}
public User1( int userID, String userName, String passwd,String userNock, int gender, int age, String phone,
String address) {
this.userNock = userNock;
this.userID = userID;
this.userName = userName;
this.passwd = passwd;
this.gender = gender;
this.age = age;
this.phone = phone;
this.address = address;
}
public String getPwd2() {
return pwd2;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public void setUserNock(String userNock) {
this.userNock = userNock;
}
public int getUserID() {
return userID;
}
public void setUserID(int userId) {
this.userID = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPasswd() {
return passwd;
}
public void setPasswd(String passwd) {
this.passwd = passwd;
}
public int getGender() {
return gender;
}
public void setGender(int 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;
}
}
// Menu 界面父类接口
package com.assist;
/**
* 控制台界面功能:父类
* @author ASUS
*
*/
public interface Menu {
//各个界面显示信息
void show()throws NullPointerException,Exception;
}
//LongInfo 登陆界面实现界面接口
package com.assist;
/**
* 登陆界面
* @author ASUS
*
*/
public class LongInfo implements Menu {
@Override
public void show() {
System.out.println("\t>>>欢迎来到”吃货联盟订餐系统“\n");
System.out.println("******************************");
System.out.println("\t编号1.用户登陆\n");
System.out.println("\t编号2.用户注册\n");
System.out.println("\t编号3.退出系统\n");
System.out.println("******************************");
}
}
//ManMenu 主菜单界面
package com.assist;
public class MainMenu implements Menu {
@Override
public void show() {
System.out.println("\t欢迎来到”吃货联盟订餐系统“");
System.out.println("********************************");
System.out.println(" No1. 我要订餐");
System.out.println(" No2. 个人信息管理");
System.out.println(" No3. 个人订单管理");
System.out.println(" No4. 菜品信息评价");
System.out.println(" No5. 客服中心");
System.out.println(" No6. 退出登陆");
System.out.println("********************************");
}
}
//订单管理界面
package com.assist;
/**
* 订单管理界面
* @author ASUS
*
*/
public class OrderMenu implements Menu {
@Override
public void show() {
System.out.println("\n*****>>>订单信息管理中心<<<****\n");
System.out.println("\tNo1.个人订单查看\n");
System.out.println("\tNo2.支付订单\n");
System.out.println("\tNo3.签收订单\n");
System.out.println("\tNo4.删除订单\n");
System.out.println("\tNo5.返回主功能菜单界面请输入5\n");
System.out.println("************************");
}
}
//用户个人信息界面
package com.assist;
/**
* 用户的个人信息管理
* @author ASUS
*
*/
public class UserInfo implements Menu {
@Override
public void show() {
System.out.println("\n*****>>>用户信息管理中心<<<*****\n");
System.out.println("\t编号1.用户个人信息\n");
System.out.println("\t编号2.修改密码\n");
System.out.println("\t编号3.修改送餐地址\n");
System.out.println("\t编号4.修改联系方式\n");
System.out.println("\t编号5.更改昵称\n");
System.out.println("\t编号6.返回主功能菜单界面请选择6\n");
System.out.println("************************");
}
}
//客户界面
package com.assist;
public class Service implements Menu {
@Override
public void show() {
System.out.println("\n*****>>>客服服务中心<<<****\n");
System.out.println("\tNo1.找回密码\n");
System.out.println("\tNo2.建议留言\n");
System.out.println("\tNo3.人工服务\n");
System.out.println("\tNo4.返回主功能菜单界面返回主菜单请输入4\n");
System.out.println("************************");
}
}